最近从 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)
编辑:关于这个问题的更多信息。我正在使用以下内容从密码生成原始 key :
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 有两个不同的值。
它也可能与 BouncyCaSTLe 无关(我在 Android 2.3 上测试)
最佳答案
我刚刚完成追踪。这是因为 engineNextBytes() 方法中 SHA1PRNG_SecureRandomImpl.java 的第 320 行(在 Gingerbread 源代码中)修复了错误,其中
bits = seedLength << 3 + 64;
改为
bits = (seedLength << 3) + 64;
显然这是一个已修复的错误,但这意味着给定相同的种子,SecureRandom 将在 Gingerbread 之前和之后生成不同的数据。
我有一个“修复”。我从 android-7 窃取了足够的代码,以便能够以与 SecureRandom 相同的方式生成随机字节。我尝试解密我的信息,如果失败,使用我顶起的 SecureRandom 来解密它。然后我显然可以使用更新的 SecureRandom 重新加密它,尽管我有点想完全摆脱 SecureRandom...
关于java - 升级到 1.45 时出现 BouncyCaSTLe AES 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4405334/