RSA BadPaddingException : les données doivent commencer avec zéro
J'essaie de mettre en œuvre un algorithme RSA dans un programme Java. Je suis confronté au "BadPaddingException : les données doivent commencer à zéro".
Ici sont les méthodes utilisées pour chiffrer et déchiffrer mes données :
public byte[] encrypt(byte[] input) throws Exception
{
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");//
cipher.init(Cipher.ENCRYPT_MODE, this.publicKey);
return cipher.doFinal(input);
}
public byte[] decrypt(byte[] input) throws Exception
{
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");///
cipher.init(Cipher.DECRYPT_MODE, this.privateKey);
return cipher.doFinal(input);
}
privateKey et publicKey attributs sont lues à partir des fichiers de cette façon :
public PrivateKey readPrivKeyFromFile(String keyFileName) throws IOException {
PrivateKey key = null;
try {
FileInputStream fin = new FileInputStream(keyFileName);
ObjectInputStream ois = new ObjectInputStream(fin);
BigInteger m = (BigInteger) ois.readObject();
BigInteger e = (BigInteger) ois.readObject();
RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(m, e);
KeyFactory fact = KeyFactory.getInstance("RSA");
key = fact.generatePrivate(keySpec);
ois.close();
}
catch (Exception e) {
e.printStackTrace();
}
return key;
}
Clé privée et la clé Publique sont créés de cette façon :
public void Initialize() throws Exception
{
KeyPairGenerator keygen = KeyPairGenerator.getInstance("RSA");
keygen.initialize(2048);
keyPair = keygen.generateKeyPair();
KeyFactory fact = KeyFactory.getInstance("RSA");
RSAPublicKeySpec pub = fact.getKeySpec(keyPair.getPublic(), RSAPublicKeySpec.class);
RSAPrivateKeySpec priv = fact.getKeySpec(keyPair.getPrivate(), RSAPrivateKeySpec.class);
saveToFile("public.key", pub.getModulus(), pub.getPublicExponent());
saveToFile("private.key", priv.getModulus(), priv.getPrivateExponent());
}
et puis enregistrés dans des fichiers :
public void saveToFile(String fileName, BigInteger mod, BigInteger exp) throws IOException {
FileOutputStream f = new FileOutputStream(fileName);
ObjectOutputStream oos = new ObjectOutputStream(f);
oos.writeObject(mod);
oos.writeObject(exp);
oos.close();
}
Je ne peux pas compris comment le problème viens de. Toute aide serait apprécié !
Merci d'avance.
- Savez-vous que la ligne est la génération de l'exception?
- Oui, c'est le retour de chiffrement.doFinal(entrée); l'enseignement dans les décrypter la méthode.
- Hm. Et vous êtes sûr de la validité des données d'entrée?
Vous devez vous connecter pour publier un commentaire.
En principe, le code est OK, j'en ai mis certains enregistrement pour s'assurer que la clé que vous générez est véritablement celui qui est alors de lire le fichier (vous ne faites pas quelque chose de stupide comme la génération de données avec une nouvelle clé, puis d'essayer de la lire avec un ancien, par exemple?)
Jusqu'à présent, j'ai suivi cela à CipherSpi.engineDoFinal(). L'explication fournie pour BadPaddingException est
Plus spécifique de comportement semble être Spi-dépendante. Savez-vous ce que Spi vous utilisez? Juste le défaut?
EDIT:
Malheureusement, je vais avoir un moment difficile la traque de ce que le défaut de Spi est. On dirait qu'il est choisi dans Cipher.java's
chooseFirstProvider()
méthode, les lignes de 644 à 721 ici. Si vous avez un débogueur à portée de main, vous voudrez peut-être trouver ce que Spi que vous avez, alors consultez la documentation... mais je pense toujours qu'il est plus probable que quelque chose se passe à l'entrée, pas de la logique (j'ai demandé à ce sujet plus tôt, dans un commentaire).