nodejs crypt cipher aes256最大数据大小

got*_*ten 0 encryption cryptography aes node.js

您想使用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');
Run Code Online (Sandbox Code Playgroud)

消息变量中可包含的字符大小取决于密钥大小.如果我发送太长的代码我得到以下错误:

TypeError: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length
at Decipher.Cipher.final (crypto.js:287:27
Run Code Online (Sandbox Code Playgroud)

有谁能告诉我密钥大小和邮件大小之间的关系.

Maa*_*wes 5

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

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

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

的问题是,你是假定该数据可以由被返回Cipher.update()方法可以被丢弃.只有在调用返回所有数据时才会出现这种情况Cipher.final().

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

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

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