1

奇妙な理由で、Node のビルトインCipherDecipherクラスが期待どおりに動作しません。ドキュメントには、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.createCipherorを使用した場合に発生することに注意してください。crypto.createCipheriv修正は、6 行目と 7 行目を次のように置き換えることです。

var step = cipher.update(source) + cipher.final();
var end = decipher.update(step) + decipher.final();

しかし、これは、前述のように、両方ともcipher価値decipherがありません。

これは、Node の組み込み暗号化が機能すると私が期待する方法ですが、明らかにそうではありません。これは私の使い方の問題ですか、それともノードのバグですか? それとも私は間違ったことを期待していますか?AES を直接実装することもできますが、時間がかかり面倒です。暗号化または復号化が必要になるたびに、新しいCipherまたはオブジェクトを作成する必要がありますか? Decipherストリームの一部としてそうしている場合、それは高価に思えます。

4

3 に答える 3

4

私には 2 つの問題がありました。1 つ目は、ブロックのサイズが 64 ビットまたは 8 バイトになると誤って想定していたことです。これは、「平文」の作成に使用するものです。実際には、AES の内部では、128 ビットの平文が 2 つの 64 ビットのチャンクに分割され、そこから移動します。

2 つ目の問題は、上記の変更を適用した後に正しいチャンク サイズを使用したにもかかわらず、cryptoモジュールが自動パディングを適用していたため、自動パディングを無効にすることで 2 つ目の問題が解決したことです。したがって、実際の例は次のとおりです。

var secret = crypto.randomBytes(16)
  , source = crypto.randomBytes(16)
  , cipher = crypto.createCipheriv("aes128", secret, secret); // or createCipher
  , decipher = crypto.createDecipheriv("aes128", secret, secret);

cipher.setAutoPadding(false);
decipher.setAutoPadding(false);

var step = cipher.update(source);
var end = decipher.update(step);

assert.strictEqual(source.toString('binary'), end); // does not fail
于 2012-08-22T06:01:51.047 に答える
2

AESは16バイトのブロックサイズを使用します(あなたが提案していた8の2倍ではありません)。さらに、パディングが有効になっている場合は、常にパディングする必要があります。そうしないと、パディング解除アルゴリズムがパディングと平文の最後のバイトを区別できないためです。

ほとんどの場合、暗号文がプレーン テキストと同じサイズになるとは考えないでください。doFinal()が常に呼び出されていることを確認してください。独自の暗号化スキームを実装している場合にのみ、暗号化/復号化にこの方法で更新を使用する必要があります。

于 2012-08-22T07:28:58.563 に答える
0

update を連続して複数回呼び出すと、node.jsの問題があります。解決されて次のリリースに反映されていると思います。

于 2012-08-23T08:01:10.923 に答える