如何使用id-aes256-GCM与Node.JSencryption? “TypeError:DecipherFinal失败”

我想要使​​用经过validation的encryptionscheme(如AES-GCM)在Node.js中encryption一些数据。

如果我运行以下示例代码

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-CTRF而不是“id-aes256-GCM”,这个代码工作正常,并在控制台上打印“bla”。

我究竟做错了什么?

编辑:

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

OpenSSL中的GCM模式工作正常。 它已经与其他实现一起进行了testing。 我知道, PolarSSL SSL库有其自己的GCM实施AES和PolarSSL可以很好地与OpenSSL作为回报。

AES的GCMencryption模式需要特定的GCM相关参数。 当前的NodeJS API不能将这些值提供给OpenSSL。 这样的通话失败,但没有干净的错误。 (这比NodeJS更像一个OpenSSL问题)。

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