1 回答
TA贡献1921条经验 获得超9个赞
两个代码中都有几个缺陷会阻止执行。但是,由于两者都在您的系统上运行,因此这些似乎是复制/粘贴错误:
钥匙太短了。AES 要求密钥大小为 16、24 或 32 字节。
Go 代码中存在关于
iv
和的命名冲突cipher
。
在这些修复之后,程序被执行,但解密失败。问题是由不同的 CFB 变体引起的:在 aes-js-code 中使用 CFB8,在 Go-code 中使用 CFB128。这里的数字表示移位寄存器[1]中移位的位数。
Go仅支持 CFB128,至少无需进行更深入的修改[2] [3]。
aes-js 默认使用 CFB8。但是,也可以使用 cfb 构造函数的第三个参数显式定义 CFB 变体。使用[4]可以更改 CFB128 :
var segmentSize = 16; var aesCfb = new aesjs.ModeOfOperation.cfb(keyBytes, ivBytes, segmentSize);
请注意,该值必须以字节为单位指定,即 1 对应 CFB8,16 对应 CFB128。
CFB是一种流密码,因此可以对任意长度的明文进行加密而无需填充,并且密文的长度等于明文的长度[5]。不幸的是,aes-js [6]中似乎存在一个错误,它要求明文的长度是段大小的整数倍,即在 CFB128 的情况下为 16 个字节。否则,将显示以下错误消息:
invalid plaintext size (must be segmentSize bytes)
即,如果使用的明文还没有这个长度,则该错误需要显式填充,尽管流密码实际上不需要填充。
在这些问题的背景下,您可能想要使用不同的模式或不同的库。
除了:
IV 不是问题的原因:在当前示例中,
CryptoJS.lib.WordArray.random(8)
使用WordArray
随机 8 个字节创建并编码为长度为 16 个字节的十六进制字符串,使用toString()
. 这个十六进制字符串是 Utf8 编码的,因此在两个代码中是相同的。尽管如此,评论中关于IV的评论当然是正确的。aes-js 错误可能与过时的 Python 库PyCrypto中的相同错误有关,后者已在后续PyCryptodome [7]中修复。
- 1 回答
- 0 关注
- 209 浏览
添加回答
举报