您希望使用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
有没有人可以告诉我密钥大小和邮件大小之间的关系。
答案 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()
返回的密文的串联。