Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java通过套接字发送加密文件_Java_Sockets_Encryption - Fatal编程技术网

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

Java通过套接字发送加密文件,java,sockets,encryption,Java,Sockets,Encryption,我一直在尝试编写一个小型文件服务器。我已经到了文件传输还可以的地步,但现在我已经尝试添加加密,奇怪的事情正在发生。我正在尝试使用密码输入/输出流来使用DES加密发送文件。文件似乎完全由服务器传输,但我无法让客户端正确接收 无论我传输哪种类型的文件,客户机都不会离开我用来接收文件的循环。即便如此,我还是成功地接收到了.pdf和.doc文件,这两个文件似乎都没有任何错误,并且打开得非常完美。但当我发送一张图片时,结尾似乎没有正确通过。图像将打开,但末端从未显示,而是一个灰色区域 我认为这些问题是相关

我一直在尝试编写一个小型文件服务器。我已经到了文件传输还可以的地步,但现在我已经尝试添加加密,奇怪的事情正在发生。我正在尝试使用密码输入/输出流来使用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,但这不会发生,因为你没有关闭另一端的套接字(至少我看不出你的代码是否正确)

我明白了


但这不会关闭插座。如果只是“超出范围”,则在垃圾收集器重新获取对象之前不会关闭它。

您不会关闭CipherOutputStream服务器端


对于块密码,刷新可能会导致某些字节在填充块或执行关闭之前不发送,这将导致填充生效,并允许接收方找到EOF

,正如旁注一样,DES是对称加密的算法,也就是说,没有公钥(或私钥)的概念在处理DES时。变量的名称
publicKey
serverPublicKey
具有误导性,因为它们实际上代表一个共享秘密。您不关闭outputstream服务器端。EOF是-1还是0应该是-1我知道你接受了这个答案,但没有必要关闭插座,这也不是最好的解决方案。同意,但问题是,“什么不起作用?”不是“如何正确操作?”@jdedwards如果接收器读取EOS,这是必要的。可以通过长度字前缀或其他叠加协议避免这两种情况。但考虑到现有的客户机代码,关闭是必要的。
cipherOut.flush() ;