「トレーニング」暗号化プロトコルを使用する危険性

@AstralManからの最初のコメントとして、ユーザーEugeneSukhovからの投稿自体ではなく、この記事を書くことに触発されました。



実際に、高レベル暗号プロトコルの説明または完成した実装(説明に対応)をよく見ると、一部の人々はそれを自分のプロジェクトですぐに実装し、一般の人々に発表しようとします(これをAstralManの庭の石と見なさないでください)。 しかし、そのような解決策は最も成功しているとはほど遠いです! 暗号プロトコルの説明には、原則として、参加者の側でのさまざまな必要なチェックと、実際の使用における非常に重要な説明が含まれていません。 歴史は、プロトコルが強力で実績のある暗号化、ハッシュなどに基づいているときの多くの例を知っています。 まさに構築のロジックと、チェックや説明などの「些細なこと」のために、正確にハッキングされたことが判明しました。 まさにそのアイデアを実証する暗号プロトコルの説明は、教育と呼ばれます。



すぐに、EugeneSukhovの記事の認証プロトコルはトレーニング用のものであることに注意してください。 これは、特定の条件下では、彼に対して攻撃を実行する可能性が非常に高いことを意味し、これは将来実証されます。 ただし、これはプロトコルが不良であることを意味するものではなく、その作成者は専門家ではありません。 それは、著者がプロトコルの高レベルの概念を読者に伝えたいことを意味し、不適切な理由で、さらなる「戦闘」の実装のために開発者に引き渡されたプロトコルの正確で細心の仕様を省略しました。



RSAを例に取り、この暗号システムを使用して1バイトのみを転送することにしたと仮定します。 トレーニングRSAを使用すると、当然失敗します! 暗号文を傍受した攻撃者は、0から255までの数字を完全に列挙することにより、即座に平文(同じバイト)を復元します。「戦闘」RSAは、このような意性を許可すべきではありません。



将来、攻撃者(または攻撃者)は、通信チャネルの「盗聴」、傍受したすべてのメッセージの保存、メッセージのなりすまし、以前に傍受したメッセージの送信など、さまざまな不快なアクションの完全な武器にアクセスできると想定します また、攻撃者がサーバーからデータベースを盗む可能性があると想定します。 これらの仮定はすべて、分析された教育用暗号プロトコルの作成者の仮定と変わらないことを明確にします。



著者が提示した種類のプロトコルに移りましょう。



画像



クライアントからサーバーへの最新の転送に注意してみましょうM =ハッシュ(RND)。 なぜハッシングなのでしょう? RNDを転送して終了するだけです。 しかし、それほど単純ではありません。 まず、最後の転送でハッシュを使用せずに、認証プロトコルの脆弱なバージョンを検討し、その欠点を指摘します。 プロトコルスキームは次のようになります。



画像



最初の欠点は、プロトコルの脆弱なバージョンでは、クライアントがいわゆる「復号化オラクル」の役割を果たすことです。 実際、サーバーはクライアントの公開キーで暗号化されたメッセージをクライアント(この場合はRND)に送信します。 クライアントは秘密鍵を使用してメッセージを復号化し、メッセージを平文でサーバーに送り返します。 このようなプロトコル構築戦略は「非標準」であり、潜在的な脆弱性を抱えており、ある意味ではプロトコル作成者のアマチュアリズムについて語っています。



2番目の欠点はより深刻であり、プロトコルがほとんど即座に一部の予約でクラックされるという事実にあります。 攻撃について説明します。 侵入者が番号N、RSA暗号システムモジュールを認識したとします。 登録段階でデータを傍受してこれを行ったのか、サーバーからデータベースを盗んだのかは今では重要ではありません。 主なことは、彼がNを知っていることです。 また、対称キーKでメッセージ{d || N}を暗号化するために、カウンターモードが選択されていると仮定します(非常に現実的な状況)。 つまり、攻撃者はメッセージ{d || p} _Kを簡単に生成でき、メッセージ{d || N} _Kを変更​​できます。ここでpは特別に選択した素数で、クライアントにメッセージを送信します。 この声明の妥当性を読者の肩に置いておきたいと思います。 次。 攻撃者は、p-1が(暗号化の意味で)「良好な」分解を持ち、d(クライアントの秘密キー)を超えるような方法で番号pを選択します。 次に、{RND} _eの代わりに、侵入者はgフォーミンググループZ_p ^ *を送信します。 疑いを持たないクライアントは、最後の転送のプロトコルに完全に準拠して、g ^ d(mod p)を攻撃者に送信します。 Polyg-Hellmanアルゴリズムを使用して、侵入者は多項式時間でクライアントの秘密鍵dを計算します。 その後、犯罪者は常にクライアントになりすますことができます。



そして、作者が提示した「元の」プロトコルの考察に戻ります(最後の転送でハッシュを使用)。 kがビット単位のクライアント秘密鍵の長さdである場合、クライアントがサーバーに対して認証を試みるk回未満で秘密鍵を計算することが現実的であると主張します。 記事自体に提示された声明を証明する数学的計算は行いません。なぜなら、それらは非常に膨大であり、幅広い読者向けに設計されていないからです。 それでも、根拠がないようにするために、サーバー上のクライアントを認証するための1回の試行でdキーの最下位ビットを計算する方法を説明します。 明らかに、このような計算の可能性は、トレーニングプロトコルの脆弱性を示しています。 繰り返しますが、トレーニングプロトコルの脆弱性は「通常の」状況であり、「戦闘」プロトコルの耐久性については何も言えないという事実に読者の注意を喚起します。 攻撃者が数値Nを知っていること、および対称暗号化にカウンターモードが使用されるという以前に行われた仮定は有効のままです。



控えめな例では、素数p = 65537 = 2 ^ 16 + 1を使用します。Z_p^ *では、Z_p ^ *を生成する要素gを選択します。 値hash(g)、hash(g ^ 2)、hash(g ^ 3)、...、hash(g ^ {p-1})を計算し、コンピューターにテーブルの形式で保存します。 この操作にかかる時間とメモリはごくわずかです。 サーバーからクライアントへのデータをインターセプトし、前述のように、Nをpに、RNDをgに置き換えます。 その結果、未知の要素からハッシュを取得します-ハッシュ(g ^ i)、コンピューターでテーブル内でそれを見つけ、iを復元します。 したがって、我々は方程式になります

g ^ d = g ^ i mod p



このことから、d = i + a(p-1)となります。ここで、aは未知の数です。 d = i + 2 ^ 16 * aとわかります。 数値iを長さ16のビット文字列として表すと、クライアントの秘密キーの最後の16ビットになります。



ご注意 この事実が誰かにすぐに明らかでない場合は、10進数システムを検討します。 たとえば、A = B + 10 ^ 3 * Cとしましょう。 Bは数値Aを10 ^ 3 = 1000で割った余りです。1000は10の累乗であるため(10進法で動作します)、BはAの最後の3桁です。A= 12345の場合、A = 345 + 12 * 1000およびこのような分解は、負でないB <= 1000に対して一意です。



当然ながら、攻撃中に、秘密キーの最下位ビットをより多く計算できます。 この量は、ハッシュテーブルを保存できるコンピューターの使用可能なメモリとPCのパフォーマンスに直接依存することに注意してください。



あとがき :この記事では、文学やインターネットでパブリックドメインに見られる暗号化分野の「既製の」ソリューション、アルゴリズム、プロトコルは、「既製」ではなく、教育的なものであることを強調したいと思います。 本当に信頼性の高い防御メカニズムをプロジェクトに組み込む場合は、チームが情報保護の分野で専門的な教育と経験を積んでいることに注意してください。 この領域は非常に広大で、複雑で、多様であるため、簡単に理解することができます。 皆様のご成功をお祈りし、ご清聴ありがとうございました!



All Articles