java - Java BouncyCaSTLe 中的确定性 AES-CTR?

标签 java node.js cryptography aes bouncycastle

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

正如您在示例中看到的,我使用它时没有填充,并且我可以指定要从哪个 block (在本例中为 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 实现

关于java - Java BouncyCaSTLe 中的确定性 AES-CTR?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36737643/

相关文章:

java - 使用 for 循环创建网格图

node.js - 如何用密码保护 Node/Express 中的静态 Assets ?

Java - KeyPairGenerator.Initialize(int,SecureRandom)NullPointerException

java - 如果可能,将信息从 Java PrintStream 发送到 JTextPane 的最佳方法是什么?

java - 使用java在表格中打印Selenium列表大小

java - 在字符串中生成字符组合并不完全有效,为什么?

javascript - 在 node.js express 上使用中间件设置简单服务器时出错

node.js - 使用 Node.js 客户端从本地主机连接到 Bigtable 模拟器

python aes 加密/解密不返回相同的结果

java - 在 Node 上生成 AES key