Криптомодуль Nodejs v7x возвращает неверную расшифровку

#node.js #encryption #aes

#node.js #шифрование #aes

Вопрос:

Я пытаюсь зашифровать, расшифровать простой текст с помощью Nodejs v7, используя его crypto модуль.

Алгоритм, который я выбрал, является aes 256 cbc

Из документации я понимаю, что

  1. Лучше использовать crypto.createCipheriv(algorithm, key, iv) , чем crypto.createCipher(algorithm, password) (то же самое для объекта decipher)
  2. iv (или salt ) может быть сгенерирован с помощью mySalt = crypto.randomBytes(16)
  3. Затем ключ может быть сгенерирован var myKey = crypto.pbkdf2Sync('secret', mySalt, 100000, 32, 'md5')

Мой полный фрагмент кода выглядит следующим образом:

 //generate salt (iv) and key
var mySalt = crypto.randomBytes(16)
var myKey = crypto.pbkdf2Sync('secret', mySalt, 100000, 32, 'md5');

//create cypher object and encrypt a text
var myCipher = crypto.createCipheriv('aes-256-cbc',myKey,mySalt)
let myEncrypted = myCipher.update('some clear text data', 'utf8', 'hex');
myEncrypted  = myCipher.final('hex')

//create decipher object and decrypt a myEncrypted
var myDecipher = crypto.createDecipher('aes-256-cbc',myKey,mySalt)
var myDecrypted = myDecipher.update(myEncrypted, 'hex', 'utf8');
myDecrypted  = myDecipher.final('utf8')
  

Этап шифрования работает так, как ожидалось, никаких ошибок выдано не было. Однако на этапе дешифрования была выдана ошибка (в самой последней строке):

Ошибка: ошибка: 06065064: процедуры цифрового преобразования: EVP_DecryptFinal_ex: неверное дешифрование при Decipher.final (internal/crypto/cipher.js:164:28)

Я уже провел много исследований по этому вопросу, включая аналогичные вопросы по SO. Кроме того, попытка decrypt.setAutoPadding(false) не сработает.

Комментарии:

1. crypto.createDecipheriv('aes-256-cbc',myKey,mySalt) . Вы забываете iv .

2. crypto.createDecipheriv метод принимает только 3 параметра. В моем коде mySalt является iv

3. Смотрите , а у вас уже 3 параметра.

4. Я перешел по ссылке и вижу подпись crypto.createDecipheriv(algorithm, key, iv[, options]) . Поэтому, когда я вызываю его с помощью crypto.createDecipheriv('aes-256-cbc',myKey,mySalt) , mySalt используется как iv . Не могли бы вы еще раз рассказать мне, в чем, по вашему мнению, проблема с моим кодом?

5. У вас все еще та же проблема?