我想使用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 fail”。 如果我使用密码AES-256-CTR而不是“id-aes256-GCM”,这段代码工作正常并在控制台上打印“bla”。
我做错了什么?
修改
进一步调查显示,cipher.update(“bla”)返回“â”(单个字符......奇怪),cipher.final()返回一个空字符串。我认为这不应该是一个正确的密文,至少应该有明文的大小......
答案 0 :(得分:6)
OpenSSL中的GCM模式运行正常。它已经与其他实现一起测试过。我知道PolarSSL SSL library有自己的AES的GCM实现,而PolarSSL可以与OpenSSL一起使用。
AES的GCM加密模式需要特定的GCM相关参数。当前的NodeJS API无法将这些值提供给OpenSSL。因此,调用失败,但没有干净的错误。 (这更像是一个OpenSSL问题,而不是NodeJS问题。)
(StevenLoomen也在评论中指出了原因,但我希望每个人都能找到答案)