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)
有谁能告诉我密钥大小和邮件大小之间的关系.
密钥大小和消息大小之间没有直接关系.密钥大小与块大小不同,无论密钥大小如何,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().
| 归档时间: |
|
| 查看次数: |
1770 次 |
| 最近记录: |