2014-04-11 49 views
0

我有這樣的代碼,通過網絡發送encryted數據:CipherOutputStream通過套接字的Java

s = new Socket(serverAddress, serverPort); 
is = s.getInputStream(); 
os = s.getOutputStream(); 

Cipher decryptCipher = Cipher.getInstance("RSA"); 
decryptCipher.init(Cipher.DECRYPT_MODE, ClientSocket.clientPrivateKey); 
cis = new CipherInputStream(is,decryptCipher); 

Cipher encryptCipher = Cipher.getInstance("RSA"); 
encryptCipher.init(Cipher.ENCRYPT_MODE, this.serverPublicKey); 
cos = new CipherOutputStream(os,encryptCipher); 

此代碼的工作,但是當我嘗試使用CipherOutputStream通過網絡發送加密數據,該數據是不直到我打電話cos.close(),但如果我關閉了流,我關閉了網絡連接。用CipherOutputStream發送加密數據的正確過程是什麼?

回答

1

我解釋代碼的方式是,密碼被初始化爲用RSAES-PKCS1-v1_5加密一條消息,因爲根據http://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#Cipher「RSA」指的是「PKCS#1中定義的RSA加密算法」,我猜的是最老的用填充方案實現,應該是RSAES-PKCS1-v1_5。如果這是正確的,那麼在讀取整個消息(整個流)之前,流無法產生部分結果。此外,您不應該能夠使用密碼發送長消息(使用應小於256字節的2048位RSA密鑰)。

我假設你想要完成的是在兩個端點之間創建安全連接?如果是這樣,那麼你不應該打擾所有的低級密碼學,並創建一個TLS連接。即使設置它不是微不足道的,它仍然比從頭構建安全的加密通信通道要容易得多。