繁体   English   中英

Java:通过套接字加密的数据

[英]Java: encrypted data over Socket

我正在尝试通过套接字发送加密的数据。

我建立了一个服务器和一个客户端,并且可以成功地与典型的交换数据(这是一个客户端示例,在服务器上的工作原理相同)

int count = 0;
byte[] buffer = new buffer[4096];

while ((count = fileInputStream.read(buffer)) >= 0) 
{
    outToServer.write(buffer, 0, count);
    outToServer.flush();
}

我也有一个方法,它需要一个byte[]和一个密钥,并返回一个用AES 128bit加密的byte[] 另一种方法以相同的方式解密。

现在,我将如何通过Socket发送加密的数据? 由于加密缓冲区的大小与普通缓冲区不同,因此我遇到了很多问题。 因此,例如,我从文件中加载4096个字节,对其进行加密,最后得到4112 该数字对于传输不是最佳的。 我无法将其分解,因为显然服务器需要读取“整个”块(因为它们已加密),否则它将无法解密。

即使我先对整个文件进行加密然后再发送,我仍然必须逐块对其进行加密,当我将其读回以对其进行解密时,这些块将被分解。

显然,服务器无法知道加密块的填充大小(在接收任何内容之前),因此它始终每次读取4096个字节。

我能做什么?

如果您打算以4096字节的块发送数据,则可以以较小的块(大约4095字节,如果填充以我认为的方式工作)读取未加密的数据,然后发送填充的线上有4096字节的块。

确实,未加密的明文和加密的密文的大小是不相同的,但是对任何两个等长的明文进行加密应该会产生等长的密文。 如果您始终加密相同大小的明文,则通过套接字发送的加密密文的大小应始终相同。 因此,作为上述替代方案,您可以继续读取4096个大块的文件,并仅告诉接收缓冲区期望4112个字节。

您没有提到您正在使用哪种AES模式(我怀疑是CBC)还是正在使用哪种填充方案(我怀疑是PKCS#7),因此我不确定该填充在您的方案中如何工作,但是我猜想您的方案将被填充为下一个16字节的倍数(如果已经是16的倍数,则会添加完整的16字节)。 因此,您应该能够以4095字节或最坏的4080字节的块为单位读取文件,并将其填充为4096。

我还鼓励您切换到GCM模式,该模式(1)不需要填充,而(2)除了加密外还提供身份验证。

我能做什么?

您不必做任何事情。 无论您发送什么内容,TCP都会对其进行分段,而IP则会按其喜欢的方式对它进行打包。 在接收端,TCP是字节流,而不是消息传递系统。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM