Java通过套接字发送加密文件

标签 java sockets encryption

我一直在尝试编写一个小型文件服务器。我已经到了文件传输正常的地步,但现在我已经尝试添加加密,奇怪的事情正在发生。我正在尝试使用密码输入/输出流来发送使用 DES 加密的文件。文件似乎完全由服务器传输,但我无法让客户端正常接收。

无论我传输什么类型的文件,客户端都不会离开我用来接收文件的循环。即便如此,我还是成功地收到了 .pdf 和 .doc 文件,这两个文件似乎都没有任何错误,并且可以完美打开。但是,当我发送图像时,结尾似乎没有正确完成。图像打开,但结尾从未显示,只是一个灰色区域。

我认为这些问题是相关的,但我不知道如何解决它们。

这是我用来在服务器端发送文件的代码:

Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
CipherOutputStream cipherOut = new CipherOutputStream(outToClient, cipher);
byte[] fileBuffer = new byte[BUFFER_SIZE];
InputStream fileReader = new BufferedInputStream(new FileInputStream(aFile));
int bytesRead;
while((bytesRead = fileReader.read(fileBuffer)) != EOF){
    cipherOut.write(fileBuffer, 0, bytesRead);
}
cipherOut.flush();

以及在客户端接收它的代码:

Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, serverPublicKey);
CipherInputStream cipherIn = new CipherInputStream(inFromServer, cipher);

byte[] fileBuffer = new byte[BUFFER_SIZE];
FileOutputStream fileWriter = new FileOutputStream(newFileName);
int bytesRead;
while((bytesRead = cipherIn.read(fileBuffer)) != EOF){
    fileWriter.write(fileBuffer, 0, bytesRead);
}
fileWriter.flush();
fileWriter.close();

任何指向正确方向的指针都会很棒。

最佳答案

  while((bytesRead = cipherIn.read(fileBuffer)) != EOF){

只是继续阅读,直到“bytesRead”的数量给你 EOF,但这不会发生,因为你没有关闭另一端的套接字(至少我看不到你的代码) .

我明白了

cipherOut.flush() ;

但这不会关闭套接字。如果它只是“超出范围”,它将不会被关闭,直到垃圾收集器回收该对象。

关于Java通过套接字发送加密文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6052429/

相关文章:

java - 如何使用hashmap将字符设置为等于不同的字符?

java - 使工厂方法更具动态性

java - 使用 maven 依赖项从 ant 运行项目 java 类

Python sendto() 未执行

python - 将数据发送到本地应用程序以及从本地应用程序发送到远程托管服务器

c++ - AES解密和 'invalid pkcs #7 block padding'

c# - 使用.Net Framework 进行AES 文件加密并使用IOS 进行解密

java - 连接和 session 关闭

java - Tomcat 服务器启动失败

java - 具有持久连接的 NioEventLoopGroup 的线程数