AES-256-CBC坏解密
问题描述:
第1步:pbkdf2
var key = crypto.pbkdf2Sync('prancypoodle', 'sherylcrowe', 10000, 32, 'sha512');
创建的密码,prancy poodle
,盐,它sherylcrowe
一键创建键,重复10000次,出把一个32字节长的密钥( AES-256-CBC需要这个长度)。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会导致不正确的填充上解密可能出现错误:套路:EVP_DecryptFinal_ex:坏解密。
P.S.注意:这是猫被猫叮的互联网。
答
您需要使用createDecipheriv函数进行解密,并且您的IV必须是16个字符。
例子:
var crypto = require('crypto');
var buffer = require('buffer');
var key = crypto.pbkdf2Sync('prancypoodle', 'sherylcrowe', 10000, 32, 'sha512');
// Initialization vector must be 16 characters.
var cipher = crypto.createCipheriv('aes-256-cbc', key,
new Buffer('1234567812345678', 'binary'));
var crypted = cipher.update('wherearemysocks?');
console.log('Encrypted: %s', crypted);
crypted = Buffer.concat([crypted, cipher.final()]);
// Again, IV must be 16 characters.
var decipher = crypto.createDecipheriv('aes-256-cbc', key,
new Buffer('1234567812345678', 'binary'));
var decrypted = decipher.update(crypted);
console.log('Decrypted: %s', decrypted);
输出:
Encrypted: #�j���(����
Decrypted: wherearemysocks?
是否有什么长度的密钥一个很好的借鉴和IVS不同的算法需要什么? – Breedly
好点,[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(我真的很喜欢开局很好)。 – zaph