【发布时间】:2017-06-07 16:00:34
【问题描述】:
我正在尝试通过 Socket 发送加密数据。
我搭建了一个Server和一个Client,可以成功的交换数据,典型的(这是一个client的例子,在server上也一样):
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 个字节。
我能做什么?
【问题讨论】:
-
您所说的“最佳转移数量”是什么意思?
-
指定负载大小。如果需要,您的服务器可以调整缓冲区,或者简单地读取多个
0-4096块,直到获得整个有效负载。4096是单次读取可以读取的数据量,这并不意味着所有有效负载都必须在该范围内。 -
看看
CipherInputStream和CipherOutputStream。不要在循环内部冲洗。 -
注意“不是最适合传输”是错误的。无论如何,TCP 都会以任何它喜欢的方式对数据进行分段。不要担心试图超越 TCP。你不会的。
-
@AJNeufeld 你不需要
DataOutputStream。对于任何输出流,OutputStream.write()已经这样做了。
标签: java sockets encryption cryptography