2011-04-01 72 views
3

我试图在零填充的CBC模式下执行AES加密。有谁知道如果aesSlow支持零填充?根据我对代码的理解,它不会,如果是这样的话;谁能告诉我为什么?slowAES是否允许/支持零填充?

我正在使用需要此加密方法的第三方API。

jsfiddle.net/NMATS/2是我目前的POC。一旦它被调试,我会一直在努力。此外,输入是相似的,但不同的安全性。

干杯, 丹尼斯

回答

1

看起来你是正确的。它似乎使用PKCS7。您的选项则是:

  1. 与填充它0的自己,丢弃密文
  2. 编辑代码的最后一块使填充功能做到零填充(提防的许可限制 - 我不敢看许可证)

至于为什么,我猜他们只是没有必要去做或者没有时间去实现它。

如果使用选项1,则PKCS7将添加一个0x10字节的完整块,如果您的明文已经是块大小的倍数。因此,您可以使用0x00字节来填充您的明文,使其成为块大小的倍数并对其进行加密。然后你会丢弃密文的最后128位(这只是0xFF加密的16个字节)。你会得到一个兼容的结果。

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

修正:你添加16个字节的值0x10的,否则你是正确的。 (或15个字节的值为0xF,...高达0x1的一个字节;如果你没有填充0 mod 16个字节0) – 2011-04-01 17:52:26

+0

Sry Henno,你失去了我吗?代码更改会是什么?我有我的示例尝试@ http://jsfiddle.net/NMATS/1/这将在稍后移动到节点,密钥,iv和成员访问都是类似的,但对安全性不同。 – 2011-04-01 23:10:47

+0

@Henno Brandsma请你详细说明一下吗?我很确定上面的所有内容都是正确的。我只是再看一遍。你在谈论选项1还是选项2? @Denis Hoctor - 看起来好像适合你,是吗? – Luke 2011-04-02 00:19:52