nodejs crypt cipher aes256最大数据大小

时间:2013-11-01 17:19:08

标签: node.js encryption cryptography aes

您希望使用nodejs中的模块crypt来加密某些数据

这里是我的代码

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

有没有人可以告诉我密钥大小和邮件大小之间的关系。

1 个答案:

答案 0 :(得分:5)

密钥大小和邮件大小之间没有直接关系。密钥大小与块大小不同,无论密钥大小如何,AES都将为128。即使这样,块大小仅在使用块操作模式时才重要。当您使用CBC时,正在使用块大小

上面代码的问题不是块大小或密钥大小。查看Cipher.update()方法的文档:

  

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

问题在于您假设可以放弃Cipher.update()方法返回可能的数据。只有通过调用Cipher.final()返回所有数据时才会出现这种情况。

现在通常在输出原始数据字节时不会出现此异常;返回的数据始终是Cipher.update()Cipher.final()方法的块大小的x倍。任何理智的实现只是在块加密后返回数据。所以你只需要解密最后一个块而不会出错。

此处的另一个问题是base 64编码不适用于块大小或2的幂。它将3个字节编码为4个字符。换句话说,Cipher.final()可能会返回比整个块更多的字符。现在要求解密例程解密多个字节而不是整个块,因此它将失败。

最终解决方案;您应该创建连续调用Cipher.update()Cipher.final()返回的密文的串联。