【问题标题】:Does slowAES allow/support zero padding?slowAES 是否允许/支持零填充?
【发布时间】:2011-04-01 12:54:21
【问题描述】:

我正在尝试在 CBC 模式下使用零填充执行 AES 加密。有谁知道 aesSlow 是否支持零填充?根据我对代码的阅读,它没有,如果是这样的话;谁能告诉我为什么?

我正在使用需要这种加密方法的第 3 方 API。

jsfiddle.net/NMATS/2 是我目前的 POC。调试完成后,我会将其移至节点。此外,输入相似,但安全性不同。

干杯, 丹尼斯

【问题讨论】:

    标签: javascript encryption aes


    【解决方案1】:

    看来你是对的。它似乎使用PKCS7。那么你的选择是:

    1. 自己用 0 填充并丢弃最后一个密文块
    2. 编辑代码并使填充函数做零填充(注意许可证限制 - 我没有看许可证)

    至于为什么,我猜他们只是没有必要这样做,也没有时间实施它。

    如果您使用选项 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);
                    }
                }
        },
    

    【讨论】:

    • 更正:你加16个字节的值0x10,否则你是正确的。 (或 15 个字节的值 0xF,... 最多为 0x1 的一个字节;如果您不使用 0 填充到 0 mod 16 个字节)
    • Sry Henno,你把我弄丢了?代码会发生什么变化?我有我的示例尝试@jsfiddle.net/NMATS/1 这将在稍后移动到节点,密钥、iv 和成员访问权限都是相似的,但安全性不同。
    • @Henno Brandsma 你能详细说明一下吗?我很确定上面的一切都是正确的。我刚刚又看了一遍。你说的是选项1还是选项2? @Denis Hoctor - 看起来它适合你,是吗?
    • @Luke 这似乎是正确的,但我使用它的服务正在返回一个错误。 jsfiddle.net/NMATS/2 是我的用例,但我显然不能分享我的实际密钥。想我会把这个作为一个问题添加到谷歌代码上的 slowAES 中。谢谢
    • @Denis, @Luke 我只是更正了您将添加 0xFF 块的声明;如果您自己填充到 16 的倍数,则所述解决方案有效。 0xFF 应该是 0x10(填充字节数)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 2011-12-14
    • 2022-01-14
    • 1970-01-01
    • 2012-05-30
    • 2020-04-12
    • 2013-09-17
    相关资源
    最近更新 更多