1

您好想使用 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');

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

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

有谁可以告诉我密钥大小和消息大小之间的关系。

4

1 回答 1

6

密钥大小和消息大小之间没有直接关系。密钥大小与块大小不同,对于 AES,块大小为 128,与密钥大小无关。即使这样,块大小也仅在使用块操作模式时才重要。当您使用 CBC 时,正在使用块大小

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

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

问题是您假设可以丢弃该方法可能返回的数据。Cipher.update()仅当调用返回所有数据时才如此Cipher.final()

现在,如果您输出原始数据字节,通常不会出现此异常;Cipher.update()对于orCipher.final()方法,返回的数据始终是块大小的 x 倍。任何理智的实现都只是在一个块被加密后返回数据。因此,您只需解密最后一个块而不会出错。

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

所以终于解决了;Cipher.update()您应该创建连续调用和返回的密文的串联Cipher.final()

于 2013-11-02T12:33:36.973 回答