gpt4 book ai didi

javascript - CryptoJS AES 加密输出长度

转载 作者:行者123 更新时间:2023-12-03 08:37:14 36 4
gpt4 key购买 nike

我正在尝试使用 CryptoJS 加密 32 个字符的字符串:

var string = '12345678901234567890123456789012'.

我使用 AES256 的 32 个字符的 key :

var key = '12345678901234567890123456789012':

var _key = CryptoJS.enc.Utf8.parse(key);
var encryptedECB = CryptoJS.AES.encrypt(string.trim(), _key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
}).toString();

我预计加密的 ECB 字符串长度为 44 个字符。相反,它是 64 个字符。我做错了什么?

最佳答案

正如我的评论中已经解释的那样,密文已正确加密:发布的明文长度为 32 字节,是 block 大小的整数倍(AES 为 16 字节)。本例中使用的 PKCS7 填充将整个 block (16 字节)填充到 48 字节,从而产生相同长度的密文。 CryptoJS.AES.encrypt 返回一个 CipherParams 对象,该对象封装了包括密文在内的各种参数。默认情况下,toString() 方法将密文返回为 Base64 编码字符串,长度为 64 字节 (4*ceil(n/3), n=48)。

像 ECB 模式下的 AES 这样的 block 密码需要长度为 block 大小整数倍的明文。否则必须使用 PKCS7 等填充。但是,由于发布的 32 字节明文的长度已经对应于 block 大小的整数倍(32 = 2 * 16 字节),因此也可以省略填充(padding: CryptoJS.pad.NoPadding),它保存整个 block (16字节)。所以密文的长度与明文相同(32字节),变成Base64编码的44字节(4*ceil(n/3), n=32),即可能是您期望的结果:

var string = '12345678901234567890123456789012';
var key = '12345678901234567890123456789012';

var _key = CryptoJS.enc.Utf8.parse(key);
var encryptedECB = CryptoJS.AES.encrypt(string.trim(), _key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.NoPadding
}).toString();

console.log(encryptedECB);
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>

但是请注意,填充对于分组密码来说通常是必需的,并且只有在明文的长度是 block 大小的整数倍时才可以省略。为了完整起见,应该提到的是,除了效率为 75% 的 Base64 之外,还有其他 binary-to-text encodings 。还有其他填充(s. here ),但 PKCS7 是可靠的(与零填充相比)。关于安全性:ECB是一种不安全的模式。

关于javascript - CryptoJS AES 加密输出长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63550592/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com