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