2017-12-03 20 views
0

は、私は私のネットワークソフトウェアでchacha20暗号化を使用しようとするが、私は4バイトのデータを暗号化する場合、私は問題ストリーム暗号を使用してTCPデータを暗号化する方法

が発生します。0x01 0x02 0x03 0x04サーバー

に暗号文を取得:0xd2 0xd3 0xc4 0xd5を、クライアントに送信

クライアントは、提供時間

で< = 4バイトを受信することができ、その最初のクライアントのみRECV 0xd2 0xd3

それが適切にデータを復号化し、平文0x01 0x02

を取得しますが、クライアントは最後の2バイト0xc4 0xd5

をrecvをするとき、そうそこにはあるデータが同じナンス、キー

を使用して復号化することができないと思われることができます問題を解決する方法

送信前にプレフィックスとして長さデータを追加するのは解決策ですが、私はストリーム暗号を使用しているので奇妙です。

答えて

1

ChaCha20は、キーとナンスを使用してストリームを生成します。 (S0, S1, S2, S3)をストリームの最初のバイトとし、(M0, M1, M2, M3)をメッセージの最初の4バイトとします。

暗号文は(M0⊕S0, M1⊕S1, M2⊕S2, M3⊕S3)と計算されます。これは、M0...M3がすぐに利用できる場合です。

を暗号化し、同じキーとナンスを使用して(M2, M3)を暗号化すると、(M0⊕S0, M1⊕S1)(M2⊕S0, M3⊕S1)になります。 (C0⊕S0, C1⊕S1, C2⊕S2, C3⊕S3)を使用して復号化することはできません。

さらに悪いことに、S0S1が異なるメッセージで再利用されているため、攻撃者はメッセージを知っているから回復できます。

これを避けるには、ブロックサイズに達するまでデータをバッファし、部分ブロックを暗号化するのではなくブロック全体を暗号化するのが最も簡単です。

+0

また、メッセージの長さをプレフィックスにすることは、メッセージを送信するパケットの数をほとんど予測できないため、ほとんどの場合、TCPを使用する必要があります。 –

+0

問題は正しく読まれていません。暗号化ではありません。 –

+0

「chacha20暗号化」で通常とは異なるモードが選択されていない限り、暗号化と復号化は同じ操作です。たぶん私は質問を正しく理解していないかもしれません。 Dk、n(m0)|| Dk、n(m1) '? –

3

ChaCha20暗号インスタンス(または、より一般的にはコンテキスト)を再起動する代わりに、そのインスタンスを有効に保つ必要があります。

ほとんどの暗号APIでは、断片的な暗号化/復号化を実行できます。これは、通常、平文/暗号文の終わりが検出されたときに、finalメソッドの後に、最初の部分と2番目の部分についてはupdateメソッドを呼び出すことを意味します。 APIに応じて、これらの各メソッドの出力を期待する必要があります。

APIでストリームを正しく処理できない場合にのみ、暗号文を集約して、完全な暗号テキストで復号化を実行する必要があります。

関連する問題