Java BouncyCastle中的确定性AES-CTR?

时间:2016-04-20 08:10:28

标签: java node.js cryptography aes bouncycastle

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

正如您在示例中所看到的,我正在使用它而没有填充,我可以指定我想要开始的哪个块(在这种情况下为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实现?

1 个答案:

答案 0 :(得分:1)

如果提供全部为零的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实施