#node.js #cryptography #aes
#node.js #криптография #aes
Вопрос:
Потеряв секрет открытого текста, но имея хэшированный ключ, можно зашифровать и расшифровать в openssl следующим образом (ключи и iv не являются фактическими):
Ввод:
printf "ciphertext" | base64 -d | openssl enc -aes-256-cbc -d -nosalt -K "0000000000000000000000000000000000000000000000000000000000000000" -iv "00"
Вывод:
«открытый текст»
Теперь, чтобы иметь возможность делать это в приложении NodeJS, openssl вызывается как child_process . Как вы можете догадаться, порождение вызовов openssl не очень эффективно.
Чтобы иметь возможность делать это в node crypto, при создании ключей необходим открытый текст «secret».
Есть ли способ сгенерировать шифр из хэшированного ключа?
Я пытался сделать это так, но безуспешно.
var crypto=require('crypto')
var iv = Buffer.alloc(16, 0);
var key = '0000000000000000000000000000000000000000000000000000000000000000'
var cipher=crypto.createDecipher('aes-256-cbc', newBuffer(key).toString('binary'), new Buffer('0000000000000000', 'hex').toString('binary'));
var enc = cipher.update("ciphertext", 'base64', 'utf8')
enc = cipher.final('utf8')
console.log(enc);
Вывод:
internal/crypto/cipher.js:164
const ret = this._handle.final();
^
Error: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt
Ответ №1:
Попробуйте
new Buffer('0000000000000000000000000000000000000000000000000000000000000000', 'hex')
для ключа и и
new Buffer('00000000000000000000000000000000', 'hex')
для IV. В настоящее время вы кодируете двоичное строковое представление байтов вместо (просто) декодирования шестнадцатеричных значений до 32 байт и 16 байт соответственно.
Чтобы использовать это, вы должны использовать, createDecipheriv
поскольку createDecipher
все равно будет генерироваться ключ с использованием пароля.
Комментарии:
1. Он работает от узла к узлу подобным образом, но не от openssl к узлу. Я продолжу работать над этим, спасибо.
2. Проверьте, не ошибочен ли только начальный блок, IV также является производным, он не установлен на все нули при получении ключа (и IV) из пароля. Одна проблема: вам нужно было бы сохранить его, поскольку вы не можете пересчитать его из ключа и зашифрованного текста.
3. Iv — это что-то вроде «9A00000000000000», на самом деле это не все 0, но, тем не менее, iv кажется неуместным, потому что я получаю один и тот же результат шифрования с, без или с разными iv.
4. Я, наконец, сделал это, используя createCipheriv и createDecipheriv соответственно. Большое спасибо.
5. IV не имеет никакого эффекта, если он не находится в пределах createDecipheriv, по крайней мере, это то, что я делаю вывод.