Java BouncyCastle中的确定性AES-CTR?

我一直在Node中使用aes-js来使用AES计数器模式进行encryption/解密。

正如你可以在例子中看到的,我使用它没有填充,我可以指定哪个块(在这种情况下,0)我想开始。

var aesCTR = new aesjs.ModeOfOperation.ctr(keyBytes, new aesjs.Counter(0)); var encryptedBytes = aesCTR.encrypt(plaintextBytes); 

我想在Java中重现上面的相同行为。 我正在使用BouncyCastle ,如下面的例子。

  SecretKeySpec key = new SecretKeySpec(keyBytes, "AES"); Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding", "BC"); cipher.init(Cipher.ENCRYPT_MODE, key); byte[] encrypted=cipher.doFinal(msgBytes); 

但是这个实现似乎没有输出与上面相同的值。 另外,似乎每次运行都会自动增加计数器(在这种情况下不合需要的行为)。

有没有一种方法来匹配使用Java的Node JS实现?

你应该得到相同的行为,如果你提供一个全部为零的IV /初始ctr值,例如:

 byte[] iv = new byte[16]; Arrays.fill(iv, (byte)0); SecretKeySpec key = new SecretKeySpec(keyBytes, "AES"); Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding", "BC"); cipher.init(Cipher.ENCRYPT_MODE, key, iv); byte[] encrypted=cipher.doFinal(msgBytes); 

在代码中设置的方式,每次调用init()时都会生成一个随机IV。

顺便说一句,如果你省略了BC ,你将得到股票的AES实施