Как использовать id-aes256-GCM с Node.JS крипто? "TypeError: DecipherFinal fail"
Я хочу зашифровать некоторые данные в Node.js, используя аутентифицированную схему шифрования, такую как AES-GCM.
Если я запустил следующий пример кода
app.get("/test", function(req,res) {
var key = "12345678901234567890123456789012";
var iv = "123456789012";
var cipher = crypto.createCipheriv("id-aes256-GCM",key.toString("binary"),iv.toString("binary"));
var decipher = crypto.createDecipheriv("id-aes256-GCM",key.toString("binary"),iv.toString("binary"));
console.log(decipher.update(cipher.update("bla")));
console.log(decipher.update(cipher.final()));
console.log(decipher.final());
});
Я не получаю консольный вывод, но появляется сообщение об ошибке "TypeError: DecipherFinal fail".
Если я использую шифр AES-256-CTR вместо "id-aes256-GCM", этот код отлично работает и печатает "bla" на консоли.
Что я делаю неправильно?
изменить
Дальнейшее исследование показывает, что cipher.update( "bla" ) возвращает "â" (один символ... странный), а cipher.final() возвращает пустую строку. Я думаю, что это не может быть правильный зашифрованный текст, который должен иметь по крайней мере размер открытого текста...
Ответы
Ответ 1
Режим GCM в OpenSSL отлично работает. Он также был протестирован с другими реализациями. Я знаю, что библиотека PolarSSL SSL имеет свою собственную GCM-реализацию для AES, а PolarSSL может отлично работать с OpenSSL в ответ.
Режим шифрования GCM для AES требует определенных параметров, связанных с GCM. Текущий NodeJS API не может предоставить эти значения OpenSSL. И как таковые вызовы терпят неудачу, но не с чистыми ошибками. (Это скорее проблема OpenSSL, чем проблема NodeJS).
(StevenLoomen также указывает на причину в комментариях, но я хотел бы получить ответ для всех)