我应该使用 AES 加密的 TCP 流实现数据包定界符吗?
Should I implement packet delimiter with AES encrypted TCP stream?
最近我正在尝试使用 Python Twisted 为物联网设备设计自定义协议。由于大多数 IoT 设备(终端节点)的功能不足以支持 TLS,因此我必须实施经过修改的轻量级传输安全性。但是 AES128/256 与标准 TLS 一样用于数据加密。
众所周知,TCP是一个流,传送的消息在TCP流中可能需要分隔符。在像 HTTP/FTP 这样的面向文本的消息中,使用 \n\r。在二进制消息中,我们应该定义自己的结构,例如 TLV 和 V 代表有效载荷数据。这可以在 Java 中由 Netty 实现,在 Python 中由 Twisted 实现。
当TCP被加密后,事情就变得复杂了。理论上,明文应该用AES加密,然后承载在TCP流上。文本消息很容易,但在二进制消息中,Type/Length 字段也被加密。此外,AES 是面向块的算法,这意味着一条消息可能需要下一条消息进行组合才能成为 encrypted/decrypted。 AES虽然可以透明传输,但是对于二进制报文的分片和解析却很难实现。
还有一种方法,我们可以将TLV中的TL字段保持原样,而V则用AES加密。但它只适用于二进制数据。它也需要在 AES 中填充。
是否有任何建议或参考,包括代码或项目?谢谢!
AES 是一种块密码,因此以块大小的块读取数据。在发射器端,您的 AES 加密代码应根据需要添加填充,它应该是 AES 实现的一部分。 (我建议您为此应用程序使用 AES-CBC)。在发射器上,只读取块大小的数据块。
在 java 中,我会使用套接字中的 DataInputStream,然后执行 readFully()。
Socket socket;
DataInputStream ins = new DataInputStream(socket.getInputStream());
while(connectionOpen) {
byte[] aes = new Byte[blockSize];
ins.readFully(aes);
//Decrypt received data aes
...
}
由于您在上面使用了 readFully(),因此您确保始终接收到正确大小的数据,即块大小。
最近我正在尝试使用 Python Twisted 为物联网设备设计自定义协议。由于大多数 IoT 设备(终端节点)的功能不足以支持 TLS,因此我必须实施经过修改的轻量级传输安全性。但是 AES128/256 与标准 TLS 一样用于数据加密。
众所周知,TCP是一个流,传送的消息在TCP流中可能需要分隔符。在像 HTTP/FTP 这样的面向文本的消息中,使用 \n\r。在二进制消息中,我们应该定义自己的结构,例如 TLV 和 V 代表有效载荷数据。这可以在 Java 中由 Netty 实现,在 Python 中由 Twisted 实现。
当TCP被加密后,事情就变得复杂了。理论上,明文应该用AES加密,然后承载在TCP流上。文本消息很容易,但在二进制消息中,Type/Length 字段也被加密。此外,AES 是面向块的算法,这意味着一条消息可能需要下一条消息进行组合才能成为 encrypted/decrypted。 AES虽然可以透明传输,但是对于二进制报文的分片和解析却很难实现。
还有一种方法,我们可以将TLV中的TL字段保持原样,而V则用AES加密。但它只适用于二进制数据。它也需要在 AES 中填充。
是否有任何建议或参考,包括代码或项目?谢谢!
AES 是一种块密码,因此以块大小的块读取数据。在发射器端,您的 AES 加密代码应根据需要添加填充,它应该是 AES 实现的一部分。 (我建议您为此应用程序使用 AES-CBC)。在发射器上,只读取块大小的数据块。
在 java 中,我会使用套接字中的 DataInputStream,然后执行 readFully()。
Socket socket;
DataInputStream ins = new DataInputStream(socket.getInputStream());
while(connectionOpen) {
byte[] aes = new Byte[blockSize];
ins.readFully(aes);
//Decrypt received data aes
...
}
由于您在上面使用了 readFully(),因此您确保始终接收到正确大小的数据,即块大小。