2017-08-30 48 views
0

最近我試圖用Python Twisted設計物聯網設備的自定義協議。由於大多數物聯網設備(終端節點)的功能不足以支持TLS,因此我必須實施經過修改的輕量級傳輸安全性。但是,與standrad TLS相同,AES128/256用於數據加密。我應該使用AES加密的TCP流實現數據包分隔符嗎?

衆所周知,TCP是一個流,並且傳遞的消息可能需要在TCP流中分隔符。在面向文本的消息如HTTP/FTP中,使用\ n \ r。在二進制消息中,我們應該定義自己的結構,如TLV,V代表有效載荷數據。這可以通過Java中的Netty,Python中的Twisted實現。

當TCP被加密時,情況變得複雜。理論上,純文本應該用AES加密,然後在TCP流上進行。文本消息很容易,但是在二進制消息中,類型/長度字段也被加密。此外,AES是面向塊的算法,這意味着消息可能需要下一條消息來進行加密/解密。儘管AES可以是透明傳輸,但是對於二進制消息分片和解析來說很難實現。還有另一種方法,我們可以將TLV中的TL字段保留爲純文本,同時保持AES加密的V加密。但它只適用於二進制數據。並且它也需要AES中的填充。

是否有任何建議或參考,包括代碼或項目?謝謝!

回答

0

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(),因此您確保始終接收正確大小(即塊大小)的數據。

+0

以塊大小的倍數讀取數據並僅填充最後一個塊。 – zaph

+0

現在,我明白了。與AES,事情變得更加簡單。接收器只是讀取塊大小的塊(如16B/32B)。而填充方法甚至可以幫助接收者分割數據包流! –