2013-11-01 61 views
0

嗨想使用模块隐窝从的NodeJS隐窝一些数据的NodeJS加密密码AES256最大数据大小

这里我的代码

toCrypt = "message"; 

var cipher = crypto.createCipher('aes256', key); 
cipher.update(toCrypt, 'utf-8', 'base64'); 

var nowItisCrypted = cipher.final('base64'); 


var deCipher = crypto.createDecipher('aes256', key); 
deCipher.update(nowItisCrypted,'base64','utf-8'); 

var unCrypted = deCipher.final('utf-8'); 

,可以是包含在消息变量caracters的大小取决于关键的尺寸。 如果我发送一个过长的代码,我得到了以下错误:

TypeError: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length 
at Decipher.Cipher.final (crypto.js:287:27 

有谁可以告诉我关键尺寸和邮件大小之间的关系。

回答

5

密钥大小和消息大小之间没有直接关系。密钥大小与块大小不同,不管密钥大小如何,AES的大小都是128。即使在这种情况下,如果使用块操作模式,块大小也是很重要的。当您使用CBC时,块大小为的是正在使用。

但是,上述代码的问题不在于块大小或密钥大小。检查Cipher.update()方法的文档:

返回加密的内容,并且可以在流式传输时使用新数据多次调用。

的问题是,你是假定该可以Cipher.update()方法要返回的数据可以被丢弃。只有当所有数据正在通过致电Cipher.final()的呼叫返回时才是如此。

现在通常你不会得到这个异常,如果你输出原始字节的数据;返回的数据总是x方向的块大小的Cipher.update()Cipher.final()方法。任何理智的实现只是在块被加密后才返回数据。所以你只需要解密最后一块没有错误。

这里的另一个问题是base 64编码不适用于块大小或2的幂。它将3个字节编码为4个字符。换句话说,Cipher.final()可能会比整个块返回多个字符。现在解密程序被要求比整个数据块多解密几个字节,所以它会失败。

所以最后的解决方案;您应该将连续调用返回的密文连接到Cipher.update()Cipher.final()

+0

感谢您的帮助,它完美的工作 – goten

+0

只是另一个小问题。它是一种很好的做隐窝数据发送和api与以前的方法接收或它是没有必要的。 – goten

+1

这取决于*用例*,在99%的*用例中*最好选择TLS。如果在接收端存在填充oracle,上面的代码对于发送密文是不安全的;接收方应在解密之前验证(H)MAC。这些问题不在TLS中,因此请不要创建自己的安全传输层安全性。 –