Как использовать id-aes256-GCM с Node.JS крипто? "TypeError: DecipherFinal fail" - программирование

Как использовать 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() возвращает пустую строку. Я думаю, что это не может быть правильный зашифрованный текст, который должен иметь по крайней мере размер открытого текста...

4b9b3361

Ответ 1

Режим GCM в OpenSSL отлично работает. Он также был протестирован с другими реализациями. Я знаю, что библиотека PolarSSL SSL имеет свою собственную GCM-реализацию для AES, а PolarSSL может отлично работать с OpenSSL в ответ.

Режим шифрования GCM для AES требует определенных параметров, связанных с GCM. Текущий NodeJS API не может предоставить эти значения OpenSSL. И как таковые вызовы терпят неудачу, но не с чистыми ошибками. (Это скорее проблема OpenSSL, чем проблема NodeJS).

(StevenLoomen также указывает на причину в комментариях, но я хотел бы получить ответ для всех)