10

入力ストリームを暗号化し、TCP 経由で別のサーバーに送信したいと考えています。ここまでは順調ですね。接続が閉じられるまで、すべてがスムーズに実行されます。ほとんどの場合、必要な 192 ビットのブロック サイズが満たされず、スクリプトは でクラッシュしwrong final block lengthますが、自動パディングをオンにしました。

従来のインターフェースを使用している場合、自動パディングのみが機能するようです。ここで何か間違ったことをしていますか?

var net = require("net")
  , crypto = require("crypto");

var credentials = { algorithm: "aes192", password: "password" }
  , decipher = crypto.createDecipher(credentials.algorithm, credentials.password)
  , cipher = crypto.createCipher(credentials.algorithm, credentials.password);

decipher.setAutoPadding(true);
cipher.setAutoPadding(true);

net.createServer(function(socket) {
  socket.pipe(socket);
}).listen(2000);

var socket = net.connect(2000);

socket.pipe(decipher).pipe(process.stdout);
process.stdin.pipe(cipher).pipe(socket); 

socket.write("Too short.");
socket.end();

私の理想的な Node.js の世界では、(De-)Cipher Stream は、ソース ストリームが閉じられると、最後のブロックを自動的にパディングします。これは設計上の欠陥だと思います。

問題を開く以外に、この動作を回避するにはどうすればよいですか? Socket と (De-)Cipher Streams の間にバイト カウンターを配置する必要がありますか?

4

1 に答える 1

2

次のようにパイプを設定しました:

stdin | cipher | socket (loopback) | decipher | stdout

ただし、次のように使用して、ソケットに直接書き込むことで暗号化をバイパスします。

socket (loopback) | decipher | stdout

このコードで試してください:

var net = require("net")
  , crypto = require("crypto");

var credentials = { algorithm: "aes192", password: "password" }
  , decipher = crypto.createDecipher(credentials.algorithm, credentials.password)
  , cipher = crypto.createCipher(credentials.algorithm, credentials.password);

decipher.setAutoPadding(false); //set to false to keep the padding
cipher.setAutoPadding(true);

//Loopback
server = net.createServer(function(socket) {
  socket.pipe(socket);
})

server.listen(2000);

var socket = net.connect(2000);

//cipher to the loopback socket, to decipher and stdout
cipher.pipe(socket).pipe(decipher).pipe(process.stdout);

//write some data 
cipher.write("Too short.");

//Clean exit
cipher.end();
server.unref();

デモンストレーションの目的でDecryptor、残ったパディングが見えるように、オブジェクトから自動パディングを削除しました。プログラムをxxd(ノードではなくコマンドラインで)にパイプすると、次の出力が得られます。

$ nodejs so.js | xxd
0000000: 546f 6f20 7368 6f72 742e 0606 0606 0606  Too short.......

6回0x06繰り返します。

于 2013-08-02T05:27:57.803 に答える