6

最近从 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 有两个不同的值。

它也可能与 BouncyCastle 无关(我正在 Android 2.3 上进行测试)

4

3 回答 3

6

我刚刚完成了对这个的追踪。这是因为 engineNextBytes() 方法中 SHA1PRNG_SecureRandomImpl.java 的第 320 行(在 Gingerbread 源代码中)的错误修复,其中

bits = seedLength << 3 + 64;

改为

bits = (seedLength << 3) + 64;

显然这是一个已修复的错误,但这意味着给定相同的种子,SecureRandom 将在姜饼前后生成不同的数据。

我有一个“修复”。我从 android-7 中窃取了足够多的代码,以便能够以与 SecureRandom 相同的方式生成随机字节。我尝试解密我的信息,如果失败,请使用我的自升式 SecureRandom 来解密它。然后我显然可以使用更新的 SecureRandom 重新加密它,尽管我有点想完全摆脱 SecureRandom ......

于 2011-03-18T02:53:27.490 回答
3

看起来问题是 SecureRandom 不能跨 Froyo-Gingerbread 边界移植。这篇文章描述了一个类似的问题:

http://groups.google.com/group/android-security-discuss/browse_thread/thread/6ec015a33784b925

我不确定 SecureRandom 中究竟发生了什么变化,但我发现修复它的唯一方法是使用可移植方法生成的密钥重新加密数据。

于 2010-12-10T22:06:13.003 回答
0

根据发行说明,此修复包含在 1.40 版中:

如果填充长度为 0,PKCS7Padding 验证不会失败。此问题已得到修复。

这听起来可能是相关的。

于 2010-12-10T07:07:48.870 回答