最近、BC 1.34 から 1.45 にアップグレードされました。以前にエンコードされたデータを次のようにデコードしています。
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] decrypted = cipher.doFinal(encrypted);
BC 1.45 を使用すると、次の例外が発生します。
javax.crypto.BadPaddingException: pad block corrupted
at org.bouncycastle.jce.provider.JCEBlockCipher.engineDoFinal(JCEBlockCipher.java:715)
at javax.crypto.Cipher.doFinal(Cipher.java:1090)
編集: この問題の詳細。以下を使用して、パスフレーズから生のキーを生成しています。
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();
私が見つけたのは、これにより BC 1.34 と 1.45 の 2 つの異なる値が得られるということです。
また、BouncyCastle に関連していない可能性もあります (Android 2.3 でテストしています)。