第 1 步:使用 pbkdf2 创建 key

var key = crypto.pbkdf2Sync('prancypoodle', 'sherylcrowe', 10000, 32, 'sha512');

使用密码 prancy poodle 创建一个 key ,用 sherylcrowe 对其进行加盐,迭代 10,000 次,输出一个 32 字节长的 key (AES-256-CBC 需要该长度)。

第 2 步:加密一些东西
var cipher = crypto.createCipheriv('aes-256-cbc', key, 'dogsarefun'.toString("binary"));

var crypted = cipher.update('wherearemysocks?');
crypted = Buffer.concat([crypted, cipher.final()]);

第 3 步:解密和失败
var decipher = crypto.createDecipheriv('aes-256-cbc', key, 'dogsarefun'.toString('binary'));

var decrypted = decipher.update(crypted);
decrypted = Buffer.concat([decrypted, decipher.final()]);
Error: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt
    at Error (native)
    at Decipher.Cipher.final (crypto.js:150:26)
    at repl:1:48
    at REPLServer.defaultEval (repl.js:272:27)
    at bound (domain.js:280:14)
    at REPLServer.runBound [as eval] (domain.js:293:12)
    at REPLServer.<anonymous> (repl.js:441:10)
    at emitOne (events.js:101:20)
    at REPLServer.emit (events.js:188:7)
    at REPLServer.Interface._onLine (readline.js:219:10)

我究竟做错了什么?看起来是对的,其实是错的。

最佳答案

您需要为 CBC 模式提供一个 IV,并且它需要是块大小(AES 为 16 字节)。 'dogsarefun' 只有 10 个字节,所以剩余的字节是未指定的,可能(可能是)垃圾。

由于 PKCS 填充是默认值并且使用了 CBC 模式,因此不正确的 IV 将导致解密时填充不正确,可能会出现错误:routines:EVP_DecryptFinal_ex:baddecrypt。

附言当心:这是被猫控制的互联网。 👿

关于node.js - AES-256-CBC 错误解密,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37192427/

10-15 04:40