CipherOutputStream在套接字java上

时间:2014-04-11 17:00:25

标签: java sockets encryption outputstream

我有这段代码通过网络发送加密数据:

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 个答案:

答案 0 :(得分:1)

我解释代码的方式是Cipher初始化为使用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。如果这是正确的,则在读取整个消息(整个流)之前,流无法生成部分结果。此外,您不应该使用密码发送长消息(使用2048位RSA密钥,应该小于256字节)。

我假设您要完成的是在两个端点之间创建安全连接?如果是这样,那么您不应该为所有低级加密而烦恼并创建TLS连接。尽管设置它并不容易,但仍然比从头构建安全的加密通信通道容易得多。