Récemment amélioré de BC 1.34 à 1.45. Je décodage des données précédemment codées avec les éléments suivants:Erreur AES BouncyCastle lors de la mise à niveau vers 1.45
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] decrypted = cipher.doFinal(encrypted);
Lorsque vous utilisez BC 1,45 Je reçois cette exception:
javax.crypto.BadPaddingException: pad block corrupted
at org.bouncycastle.jce.provider.JCEBlockCipher.engineDoFinal(JCEBlockCipher.java:715)
at javax.crypto.Cipher.doFinal(Cipher.java:1090)
EDIT: En savoir plus sur cette question. J'utilise les éléments suivants pour générer des clés brutes à partir d'un mot de passe:
KeyGenerator kgen = KeyGenerator.getInstance("AES", "BC");
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");
sr.setSeed(seed);
kgen.init(128, sr);
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
Ce que j'ai trouvé est que cela se traduit par deux valeurs différentes pour la Colombie-Britannique 1,34 vs 1,45.
Il pourrait également ne pas être lié BouncyCastle (je teste sur Android 2.3)
Vous avez raison. Le contrat pour SecureRandom ne promet pas que la graine que vous fournissez manuellement sera la * seule * graine qu'elle utilise. Il utilisera d'autres sources, comme/dev/random sur linux/bsd. –
Pour les futurs lecteurs: En d'autres termes, utilisez plutôt une méthode de dérivation de clé bien connue, telle que PBKDF2. –