【发布时间】:2020-04-29 15:29:38
【问题描述】:
在 AES(CTR 模式)下使用 cryptoJS 加密和解密消息时,AES 算法依赖一个随机数(Number Once)值来混淆您的流块并防止重放攻击。在cryptoJS中,设置你的nonce:
const cli_verify = CryptoJS.AES.encrypt(CryptoJS.enc.Latin1.parse(originalString), key, {
mode: CryptoJS.mode.CTR,
iv: iv,
padding: CryptoJS.pad.NoPadding
});
同样,您可以在解密消息时使用相同的方法:
const decryptedString = CryptoJS.AES.decrypt(encryptedStringB64, key, {
mode: CryptoJS.mode.CTR,
iv: iv,
padding: CryptoJS.pad.NoPadding
}).toString(CryptoJS.enc.Latin1);
但是:如果您这样做,您需要自己跟踪 nonce。如果您开始处理可变大小的消息(即不是 16 字节的倍数),这 a) 很痛苦,b) 真的很困难。
我已经分解了我在另一边与之交谈的 AES 库,并弄清楚了 nonce 计数器和偏移量是如何工作的。基本上,如果您开始发送非常小的消息,例如 4 个字节,则 4 个字节将使用流的前 4 个字节进行解密,并且偏移量将增加到 4 以跟踪这一点。如果随后加密了 6 个字节,则使用流的下 6 个字节(不增加 nonce),并将偏移量更新为 10... 如果下一次传输是 143 个字节,您可以看到这开始变得复杂自己实施。使用当前流的最后 6 个字节,增加随机数等等。
我的问题是:如何让 CryptoJS 在会话期间为您处理这个问题。我尝试在第一次调用中设置 IV、填充和模式,然后在下一次将其留空,但它不起作用。它是一个很棒的图书馆,我相信它就在那里。只是不清楚如何使用它。
【问题讨论】:
标签: javascript cryptography aes cryptojs nonce