如何在Node.JS加密中使用id-aes256-GCM?"TypeError:DecipherFinal失败"

Hei*_*nzi 16 javascript security cryptography node.js express

我想使用经过身份验证的加密方案(如AES-GCM)加密Node.js中的某些数据.

如果我运行以下示例代码

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());
});
Run Code Online (Sandbox Code Playgroud)

我没有得到控制台输出,但错误消息"TypeError:DecipherFinal失败".如果我使用密码AES-256-CTR而不是"id-aes256-GCM",此代码工作正常并在控制台上打印"bla".

我究竟做错了什么?

编辑:

进一步调查显示,cipher.update("bla")返回"â"(单个字符......奇怪)和cipher.final()返回一个空字符串.我认为这不能是一个正确的密文,至少应该有明文的大小......

Dav*_* R. 6

OpenSSL中的GCM模式运行正常.它已经与其他实现一起测试过.我知道PolarSSL SSL库有自己的AES的GCM实现,而PolarSSL可以与OpenSSL一起使用.

AES的ECM加密模式需要特定的GCM相关参数.当前的NodeJS API无法将这些值提供给OpenSSL.因此,调用失败,但没有干净的错误.(这更像是一个OpenSSL问题,而不是NodeJS问题).

(StevenLoomen也在评论中指出了原因,但我希望每个人都能看到答案)