最近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でのパディングも必要です。
コードやプロジェクトなどの提案や参考資料はありますか?ありがとう!
ブロックサイズの倍数でデータを読み取り、最後のブロックのみを埋め込みます。 – zaph
今、私はそれを持っています。 AESでは、物事がより簡単になります。受信機はちょうどブロックサイズ(16B/32Bのような)のチャンクを読みました。また、パディング方法は、受信者がパケットストリームを区切るのにも役立ちます。 –