奇妙な理由で、Node のビルトインCipher
とDecipher
クラスが期待どおりに動作しません。ドキュメントには、cipher.update
「暗号化されたコンテンツを返し、ストリーミングされた新しいデータで何度でも呼び出すことができます。」
ドキュメントにも次のように記載されていますcipher.final
「暗号化された残りのコンテンツを返します。」
ただし、私のテストでは、すべてのデータを取得するために呼び出す必要cipher.final
があるため、Cipher オブジェクトの価値がなくなり、次のブロックを処理するには、新しい Cipher オブジェクトを作成する必要があります。
var secret = crypto.randomBytes(16)
, source = crypto.randomBytes(8)
, cipher = crypto.createCipher("aes128", secret)
, decipher = crypto.createDecipher("aes128", secret);
var step = cipher.update(source);
var end = decipher.update(step);
assert.strictEqual(source.toString('binary'), end); // should not fail, but does
これは、シークレットを初期化ベクトルとしてcrypto.createCipher
orを使用した場合に発生することに注意してください。crypto.createCipheriv
修正は、6 行目と 7 行目を次のように置き換えることです。
var step = cipher.update(source) + cipher.final();
var end = decipher.update(step) + decipher.final();
しかし、これは、前述のように、両方ともcipher
価値decipher
がありません。
これは、Node の組み込み暗号化が機能すると私が期待する方法ですが、明らかにそうではありません。これは私の使い方の問題ですか、それともノードのバグですか? それとも私は間違ったことを期待していますか?AES を直接実装することもできますが、時間がかかり面倒です。暗号化または復号化が必要になるたびに、新しいCipher
またはオブジェクトを作成する必要がありますか? Decipher
ストリームの一部としてそうしている場合、それは高価に思えます。