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 fail」というエラー メッセージが表示されます。「id-aes256-GCM」の代わりに暗号 AES-256-CTR を使用すると、このコードは正常に機能し、コンソールに「bla」と出力されます。

私は何を間違っていますか?

編集:

さらに調査すると、cipher.update("bla") は "â" (単一の文字...奇妙な) を返し、cipher.final() は空の文字列を返すことがわかります。これは、少なくとも平文のサイズを持つべき正しい暗号文にはなり得ないと思います...

4

1 に答える 1

6

OpenSSL の GCM モードは正常に動作します。他の実装でもテストされています。PolarSSL SSL ライブラリには AES 用の独自の GCM 実装があり、PolarSSL は OpenSSL と正常に連携できるという事実を知っています。

AES の暗号化の GCM モードには、特定の GCM 関連のパラメーターが必要です。現在の NodeJS API は、これらの値を OpenSSL に提供できません。そのため、呼び出しは失敗しますが、クリーンなエラーではありません。(これは NodeJS の問題というよりも OpenSSL の問題です)。

(StevenLoomenもコメントで理由を指摘していますが、みんなに見てもらいたいです)

于 2012-12-14T08:34:14.040 に答える