2013-05-27 8 views
9

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

レガシーインターフェイスを使用すると、自動埋め込みのように見えます。私はここで何か間違っていますか?私の理想的なNode.jsの世界では

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(); 

、(縮小)暗号ストリームパッドソースストリームが閉じられている最後のブロックを、自動的だろう。私はこれが設計の欠陥だと思う。

opening an issue以外に、この現象を回避するにはどうすればよいですか?ソケットと(De-)暗号ストリームの間にバイトカウンタを置く必要がありますか?

+0

次の行で暗号にアクセスする場合は、応答する前に 'crypto = {algorithm: 'aes192"、password:password} 'を使用しないでください。 –

+0

ああ、申し訳ありません。私はそれをカットしなければならなかった。もともとこの行は 'this.crypto = {...};'でした。一定。 – buschtoens

+0

https://raw.github.com/philips/node-cryptostream/master/lib/cryptostream.jsを確認してください。問題のアプリケーションは非常にまれです。 –

答えて

1

あなたはこのようなあなたのパイプを設定している:

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(); 

デモンストレーションの目的で、私はから自動埋め込みを削除しました210のオブジェクトがあるので、残りのパディングを見ることができます。 (コマンドラインではなく、ノード内)XXDでプログラムをパイプした私は、この出力に含まを与える:0x06

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

は6回繰り返します。

関連する問題