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

10-10 05:51