Java BouncyCastle 中的确定性 AES-CTR?
Determinisric AES-CTR in Java BouncyCastle?
我一直在 Node 中使用 aes-js 到使用 AES 计数器模式 encrypt/decrypt。
正如您在示例中看到的那样,我使用它时没有填充,我可以指定要从哪个块(在本例中为 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 / 初始点击率值,您应该会得到相同的行为,例如:
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 实现
我一直在 Node 中使用 aes-js 到使用 AES 计数器模式 encrypt/decrypt。
正如您在示例中看到的那样,我使用它时没有填充,我可以指定要从哪个块(在本例中为 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 / 初始点击率值,您应该会得到相同的行为,例如:
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 实现