我有这个代码可以通过网络发送加密数据:
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
发送加密数据的正确流程是什么?
最佳答案
我解释代码的方式是,密码被初始化为用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 key )。
我假设您想要完成的是在两个端点之间创建安全连接?如果是这样,那么您不应该费心所有低级加密并创建 TLS 连接。尽管设置起来并不简单,但它仍然比从头开始构建安全的加密通信 channel 要容易得多。
关于java - 通过套接字 java 的 CipherOutputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23018474/