最近从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/