2016-05-12 2 views
3

Шаг 1: Создайте ключ с pbkdf2

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

Создание ключа с паролем, prancy poodle, соль его с sherylcrowe итерацию в 10000 раз, из положить длинный ключ 32 байт (AES-256-CBC требуется эта длина).AES-256-CBC Bad Расшифровать

Шаг 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) 

Что я делаю неправильно? Кажется, это так, но это так неправильно.

ответ

4

Вам необходимо предоставить режим IV для CBC, и он должен быть размером блока (16 байтов для AES). «dogsarefun» - всего 10 байт, поэтому оставшиеся байты не определены и могут (возможно,) содержать мусор.

Поскольку PKCS набивка по умолчанию и режим CBC используется некорректный IV приведет к неправильной прокладки на дешифрования, вероятно, с ошибкой: процедуры: EVP_DecryptFinal_ex: плохо расшифровать.

P.S. Остерегайтесь: это Интернет, который вызывается кошками.

+0

Есть хорошая ссылка для ключей, что длина и IVS различные алгоритмы нужны? – Breedly

+1

Хорошая точка зрения, [Википедия] (https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) предоставляет размеры ключей и размер блока, но не упоминает, что размер IV такой же, как размер блока, до тех пор, как предполагается. Есть несколько хороших книг, таких как [* Handbook of Applied Cryptography *] (http://cacr.uwaterloo.ca/hac/index.html) см. Скачать бесплатно * Прикладная криптография * от Bruce Schneier * Практическая криптография * от Niels Ferguson и Bruce Schneier * Криптография расшифрована * HX Mel и Дорис М. Бейкер (хороший стартер мне очень нравится). – zaph

0

Вам необходимо использовать функцию 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? 
+0

Действительно лучше отображать зашифрованные данные в шестнадцатеричном виде, так как многие (большинство) байтов не являются печатными символами. Что-то вроде «# j ( » довольно бессмысленно, так как так много байтов отсутствует. – zaph

+1

А, я в основном делал это, чтобы продемонстрировать, что он когда-то был затенен (потому что он зашифрован!), А теперь нет . :П – Switch

Смежные вопросы