java - 升级到 1.45 时出现 BouncyCaSTLe AES 错误

标签 java android cryptography bouncycastle

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

相关文章:

100 个用户的 JAVA MYSQL 聊天性能问题

java - 如何通过键从gson对象获取值

android - Jetpack Compose 1.0.0-alpha11如何手动导入扩展函数?

java - 我可以在同一个 Windows 服务器上使用 Java 1.4.2_12 和 Java 1.5 的应用程序吗

java - 如何以 : filepath (int, int) (int,int) 格式编写 java 模式?

android - 无法关闭转换

android - 如何解决 android 中日期选择器对话框中面临的这个问题?

java - 谷歌/叮当 : How use public key to verify signature

javascript - 从 DER 证书中提取通用名称