java - 在java中使用模式ctr解密aes加密字节

标签 java cryptography aes

让我简单解释一下。我在 python 中有这个加密器:

它使用 PyCrypto 库。

from Crypto import Random
from Crypto.Cipher import AES
from Crypto.Util import Counter

iv = Random.new().read(8)
encryptor = AES.new(
    CRYPTOGRAPHY_KEY,    // 32 bytes
    AES.MODE_CTR,
    counter=Counter.new(64, prefix=iv),
)

我想在 java 中为其解密。

我写了这段代码,但它引发了 java.security.InvalidAlgorithmParameterException: Wrong IV length: must be 16 bytes long

SecretKeySpec key = new SecretKeySpec(KEY, "AES");
IvParameterSpec ivSpec = new IvParameterSpec(iv);
Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);

附言我应该指出,我不是经验丰富的 Java 开发人员。


更新。 问题出在初始化 vector 上。 特别感谢@Andy 抽出时间。

解决方法:

byte[] nonceAndCounter = new byte[16];
System.arraycopy(iv, 0, nonceAndCounter, 0, 8);
nonceAndCounter[15] = (byte) 1; // PyCrypto's default initial value is 1
IvParameterSpec ivSpec = new IvParameterSpec(nonceAndCounter);

最佳答案

如果您尝试使用 AES-256(您使用的是 32 字节 key ),那么您需要有 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files安装。并且必须在该应用程序需要运行的任何地方安装它。如果您计划分发此应用程序,因此您无法控制可能的 Java 运行时,那么您必须通过它们自己的 API 而不是通过 JCE API 使用其他库(如 Bouncy Castle )。 (即在 JCE 中使用 Bouncy CaSTLe 作为“BC”之类的提供者会导致同样的问题。)

编辑:首先你说你得到了无效的 key 大小异常,现在改变了问题。对于 java.security.InvalidAlgorithmParameterException 情况,问题是 AES-256 的 block 大小为 16,而不是 32。256 表示 key 大小,而不是 block 大小。 AES (128, 192, 256) 的 block 大小始终为 128。因此,iv 必须为 16 字节。

编辑 2: 不是此异常的原因,而是您的代码的另一个可能问题是,您从哪里获得 Java 中的 iv?你会像在 Python 中那样随机生成它吗?那将是一个大错误,因为您必须在解密期间使用相同的 IV 才能使其工作。请记住这一点。

关于java - 在java中使用模式ctr解密aes加密字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42233915/

相关文章:

ios - `arc4random` 函数族是线程安全的吗?

c# - AES 算法名称的 CryptDeriveKey 失败

java - AES 解密适用于 Solaris 机器 SunJCE,但不适用于具有 IBMJCE 的 AIX 机器

c# - 无法解密使用 AesManaged 加密的文件

java - 检查异常

java - new Object { } 做什么?

java - 检查数组中的数字是否在 0-array.length -1 之间

java - 在java中转换美国距离测量和公制系统的程序

math - 带圆圈的加号是什么意思?

Java AES 解密检测到不正确的 key