让我简单解释一下。我在 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/