AES-256-CBC错误解密

Bre*_*dly 3 cryptography node.js

步骤1:使用 pbkdf2

var key = crypto.pbkdf2Sync('prancypoodle', 'sherylcrowe', 10000, 32, 'sha512');
Run Code Online (Sandbox Code Playgroud)

用密码创建一个密钥prancy poodle,然后用盐腌sherylcrowe,迭代10,000次,放出一个32字节长的密钥(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()]);
Run Code Online (Sandbox Code Playgroud)

步骤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)
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?看起来似乎是正确的,但却是错误的。

zap*_*aph 5

您需要为CBC模式提供一个IV,并且必须为块大小(对于AES为16字节)。“ dogsarefun”只有10个字节,因此剩余字节未指定,并且可能(可能是)垃圾。

由于默认为PKCS填充,而使用的是CBC模式,因此错误的IV可能导致解密时填充错误,并可能出现以下错误:例程:EVP_DecryptFinal_ex:错误的解密。

PS注意:这是猫所伪装的互联网。

  • 好的一点,[Wikipedia](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard)提供了密钥大小和块大小,但是没有提到IV大小与块大小相同,这在很大程度上是假设的。有好几本好书,例如[**应用密码学手册*](http://cacr.uwaterloo.ca/hac/index.html)可以免费下载*布鲁斯·施耐尔(Bruce Schneier)的*《应用密码学》 * *应用密码学*(Niels Ferguson)和布鲁斯·施耐尔(Bruce Schneier)*“密码学解密”,作者:HX Mel和Doris M. Baker(我真的很喜欢入门)。 (2认同)