安全なシステムを構築するために、安全なプログラミングを開始する前に、暗号化が完全性を保証すると仮定できますか?
- 対称暗号化と公開鍵暗号化の両方で、私の質問は十分に証明されていますか?
- いいえの場合、脆弱性は何ですか?例を挙げていただけますか?
安全なシステムを構築するために、安全なプログラミングを開始する前に、暗号化が完全性を保証すると仮定できますか?
いいえ。単純な (理論的には) 完全に安全なシステムであるワンタイム パッドを考えれば、これは簡単にわかります。
出力の一部を変更すると、クリア テキストの一部が変更され、受信者はこれを検出できなくなります。
これは明らかなケースですが、同じ結論がほとんどの暗号化システムに当てはまります。それらは機密性のみを提供し、完全性は提供しません。
したがって、デジタル署名を追加することをお勧めします。興味深いことに、公開鍵暗号方式を使用する場合、署名してから暗号化する (SE)、または暗号化してから署名する (ES) だけでは不十分です。これらはどちらもリプレイ攻撃に対して脆弱です。一般的に安全なソリューションを得るには、署名-暗号化-署名または暗号化-署名-暗号化のいずれかを行う必要があります。その理由を詳しく解説した論文です。
SE を使用すると、受信者はメッセージを復号化してから、別の受信者に再暗号化できます。これにより、送信者の意図した受信者について新しい受信者を欺くことができます。
ES を使用すると、盗聴者は署名を削除して独自の署名を追加できます。したがって、彼らはメッセージを読むことができなくても、元の送信者のふりをして、メッセージの信用を得ることができます。
要するに、答えはノーです。メッセージの整合性と機密性は異なり、異なるツールが必要です。
単純なコイントスを考えてみましょう。この場合、結果に賭けています。結果は単純な bool であり、RC4 のようなストリーム暗号を使用して暗号化し、暗号化されたビットを 1 つ生成し、それをメールで送信します。あなたは鍵を持っていません。答えをメールで返信してください。
このシナリオでは、いくつかの攻撃が発生する可能性があります。
1) 攻撃者は転送中にビットを変更できます。ビットが 0 の場合、50% の確率で 1 になり、その逆です。これは、RC4 がプレーン テキストと XOR された prng ストリームを生成し、ワンタイム パッドと同様に暗号化テキストを生成するためです。
2) もう 1 つの可能性は、あなたの答えが間違っていることを確認するために別のキーを提供することです。これは力ずくで簡単に実行できます。適切なビット フリップが得られるまで、キーを試行し続けます。
解決策は、 CMAC モードであるブロック暗号を使用することです。CMAC は hmac に似たメッセージ認証コードですが、メッセージ ダイジェスト機能の代わりにブロック暗号を使用します。秘密鍵 (K) は、メッセージの暗号化に使用する鍵と同じです。これにより、暗号文に n+1 ブロックが追加されます。私のシナリオでは、これにより攻撃 1 と 2 の両方が防止されます。メッセージが 1 ビットしか占有しない場合でも、プレーン テキストがパディングされるため、攻撃者は単純なビットを反転できません。ブロック暗号を使用して最低 1 ブロックを送信する必要があります。追加の認証ブロックにより、キーの連鎖が防止され、転送中に暗号テキストを変更しようとする人からの完全性も提供されます (これを実際に行うのは非常に困難ですが、セキュリティの追加レイヤーは便利です)。
WPA2 は、これらの理由から AES-CMAC を使用します。
データの整合性が特に重要な場合は、暗号化アルゴリズムと組み合わせて暗号化ハッシュ関数を使用する必要があります。
しかし、それは実際には、仕事に適したツールを使用することに帰着します. 暗号化アルゴリズムには、ある程度のチェックサム検証が組み込まれているものもあれば、そうでないものもあります。