java - 通过套接字 java 的 CipherOutputStream

标签 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 发送加密数据的正确流程是什么?

最佳答案

我解释代码的方式是,密码被初始化为用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/

相关文章:

c# - 使用 PHP 和 c# 的 Mcrypt 和 base64

encryption - 如何将加密 key 分成几部分?

Java 8 DateTimeFormatter 性能

java - 超出最大允许计数 : Semaphore

java - 如何将数据从一个java程序发送到另一个java程序

objective-c - AsyncSocket/GCDAsyncSocketis 的哪一部分是关于异步的?

redirect - 对于完全加密,我的初始请求需要是 HTTPS 还是足以让服务器将 HTTP 重定向到 HTTPS?

java - Quick Sort 不排序迭代解决方案

Java Read 如何读取输入的第一个单词然后读取其余部分

java - 使用 Java 中的套接字自动重新连接到服务器