gpt4 book ai didi

node.js - Node JS 加密密码 aes 256 最大数据大小

转载 作者:太空宇宙 更新时间:2023-11-04 02:58:54 24 4
gpt4 key购买 nike

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

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

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

谁能告诉我 key 大小和消息大小之间的关系。

最佳答案

key 大小和消息大小之间没有直接关系。 key 大小与 block 大小不同,对于 AES,无论 key 大小如何, block 大小都是 128。即使这样, block 大小也仅在使用 block 操作模式时才重要。当您使用 CBC 时,正在使用 block 大小。

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

Returns the enciphered contents, and can be called many times with new data as it is streamed.

问题是您假设 Cipher.update() 方法可能返回的数据可以被丢弃。仅当所有数据都是通过调用 Cipher.final() 返回时才成立。

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

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

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

关于node.js - Node JS 加密密码 aes 256 最大数据大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19731860/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com