【发布时间】:2011-04-01 12:54:21
【问题描述】:
我正在尝试在 CBC 模式下使用零填充执行 AES 加密。有谁知道 aesSlow 是否支持零填充?根据我对代码的阅读,它没有,如果是这样的话;谁能告诉我为什么?
我正在使用需要这种加密方法的第 3 方 API。
jsfiddle.net/NMATS/2 是我目前的 POC。调试完成后,我会将其移至节点。此外,输入相似,但安全性不同。
干杯, 丹尼斯
【问题讨论】:
标签: javascript encryption aes
我正在尝试在 CBC 模式下使用零填充执行 AES 加密。有谁知道 aesSlow 是否支持零填充?根据我对代码的阅读,它没有,如果是这样的话;谁能告诉我为什么?
我正在使用需要这种加密方法的第 3 方 API。
jsfiddle.net/NMATS/2 是我目前的 POC。调试完成后,我会将其移至节点。此外,输入相似,但安全性不同。
干杯, 丹尼斯
【问题讨论】:
标签: javascript encryption aes
看来你是对的。它似乎使用PKCS7。那么你的选择是:
至于为什么,我猜他们只是没有必要这样做,也没有时间实施它。
如果您使用选项 1,如果您的明文已经是块大小的倍数,PKCS7 会添加一个完整的 0x10 字节块。因此,您可以用0x00 字节填充您的明文,使其成为块大小的倍数并对其进行加密。然后,您将删除密文的最后 128 位(仅 16 个字节的 0xFF 加密)。你最终会得到一个兼容的结果。
如果您选择选项 2,我不确定您使用的是哪种实现,但我认为它们都足够简单。
这里是 Javascript 实现的填充函数:
padBytesIn: function(data) {
var len = data.length;
var padByte = 16 - (len % 16);
for (var i = 0; i < padByte; i++) {
data.push(padByte);
}
},
您可以将其更改为:
padBytesIn: function(data) {
var len = data.length;
if( len % 16 > 0 ){
var padLen = 16 - (len % 16);
for (var i = 0; i < padLen; i++) {
data.push(0);
}
}
},
【讨论】: