2017-08-30 4 views
0

最近IoTデバイスのカスタムプロトコルをPython Twistedで設計しようとしています。ほとんどのIoTデバイス(エンドノード)はTLSをサポートするほど強力ではないため、軽量のトランスポートセキュリティを実装する必要があります。しかし、AES128/256はstandrad TLSと同じようにデータの暗号化に使用されます。AESで暗号化されたTCPストリームを使用してパケット区切り文字を実装する必要がありますか?

TCPはストリームであり、配信されたメッセージはTCPストリームにデリミタを必要とすることがよく知られています。 HTTP/FTPのようなテキスト指向のメッセージでは、\ n \ rが使用されます。バイナリメッセージでは、TLVなどの独自の構造を定義し、Vはペイロードデータを表します。これは、NettyのJava、Twisted in Pythonで実装できます。

TCPが暗号化されると、状況が複雑になります。理論的には、プレーンテキストはAESで暗号化され、TCPストリームで運ばれます。テキストメッセージは簡単ですが、バイナリメッセージではType/Lengthフィールドも暗号化されています。さらに、AESはブロック指向アルゴリズムであり、これはメッセージが暗号化/復号化のために結合するために次のメッセージを必要とすることを意味する。 AESはトランスペアレントトランスポートになる可能性がありますが、バイナリメッセージのスライスと解析に実装するのは難しいです。

TLフィールドをTLVにそのまま残しておき、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のような)のチャンクを読みました。また、パディング方法は、受信者がパケットストリームを区切るのにも役立ちます。 –

関連する問題