17

我想使用经过身份验证的加密方案(如 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());
});

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

我究竟做错了什么?

编辑:

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

4

1 回答 1

6

OpenSSL 中的 GCM 模式工作正常。它也已经通过其他实现进行了测试。我知道PolarSSL SSL 库有自己的 AES GCM 实现,PolarSSL 可以与 OpenSSL 一起正常工作。

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

(StevenLoomen 在评论中也指出了原因,但我想给大家一个答案)

于 2012-12-14T08:34:14.040 回答