2013-05-27 82 views
9

我想加密輸入流並通過TCP將它發送到另一臺服務器。到現在爲止還挺好。一切順利,直到連接關閉。幾乎在任何情況下,192位所需的塊大小都不符合,腳本崩潰wrong final block length,儘管我打開了自動填充。如何處理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(); 

在我理想的Node.js世界中,(De-)密碼流將在源流關閉時自動填充最後一個塊。我認爲這是一個設計缺陷。

除了opening an issue,我該如何繞過這種行爲?我是否必須在Socket和(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程序(在命令行,而不是在節點)使我這個輸出中:

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

隨着0x06重複6次。