1998年、有名なアメリカの暗号作成者であるブルースシュナイアーは次のように書いています。
最も愚かなアマチュアから始まり、最高の暗号作成者で終わる誰でも、彼自身が解読できないアルゴリズムを作成できます。
2004年にジャーナリストのCorey Doctorowが提案したこの引用の再定式化は、シュナイアーの法則として知られるようになりました。
誰もがクラックできないセキュリティシステムを発明できます。
私の意見では、シュナイアーの法則の非常に良い例は、DES暗号化アルゴリズムを強化する試みです。
二重暗号化
DESは1977年に標準として採用されました。 新しい標準のキーの長さは56ビットで、当時はかなり大きな数でした。 しかし、ムーアの法則は容赦なく、一部の暗号学者はすでに警告を発し始めました。
新しい標準の鍵の長さを最初に批判したものの1つは、公開鍵暗号の悪名高い創設者であるホイットフィールドディフィーとマーティンヘルマンでした。 彼らの記事の1つで、56ビットキーは小さすぎて、徹底的な検索攻撃の余地があると主張しました。
上記の見解に照らして、多重暗号化技術を使用してDESアルゴリズムの耐久性を高める試みは非常に論理的に思えます。 この方法では、異なるキーで暗号化操作を数回適用することにより、キーの長さを人為的に増やすことができます。
一見すると、DESの問題を解決するには、キーの長さを2倍にすれば十分であるように見えるかもしれません。 暗号化および復号化として次のスキームを使用します。
C = E K2 (E K1 (P))、
P = D K1 (D K2 (C))、Cは暗号文です。 P-平文; E
K (P)とD
K (C)は、それぞれ暗号化と復号化の手順です。
上記のスキームは、キースペースを2
112に増やし、ブルートフォース攻撃を無意味な仕事にします。
解決策が見つかったようです。 しかし、まさにこの瞬間に、シュナイアーの法則を思い出すべき時です。 暗号化スキームを作成し、その中に欠陥を見つけることができない場合、それらがそこにないという意味ではありません。
1981年、Ralph MerkleとMartin Hellmanは二重暗号化のセキュリティを詳細に検討し、2
112暗号化操作ではなく、比較的些細な2
57の暗号化キーを回復する方法を説明しました。
MerkleとHellmanによって提案された方法は、平文に基づく攻撃のクラスに属し、攻撃者がオープンクローズテキストのペアを知っている場合に適用できます。
攻撃の本質は次のとおりです。 攻撃者は平文Pと対応する暗号文C = E
K2 (E
K1 (P))を知っています。
キーを開くために、攻撃者はキーK1のすべての可能な2
56個のバリアントを列挙し、値{E
K1 (P)、K1}をテーブルT1に書き込みます。
次に、値Cを使用して、攻撃者はキーK2の2
56個のバリアントを調べ、値{D
K2 (C)、K2}をテーブルT2に書き込みます。
テーブルT1とT2をソートした後、攻撃者はE
K1 (P)= D
K2 ()の可能性のあるキーとしてK1とK2を受け入れます。
説明されている攻撃は、「中間の会議」と呼ばれます。 暗号化は一方で実行され、復号化は他方で実行されます。 結果の「中間」結果が比較されます。
トリプル暗号化
1978年、Walter Tachmanはトリプル暗号化を使用してDESアルゴリズムの強度を高めることを提案しました。 Tachmanのスキームも2つのキーK1とK2を使用しますが、暗号化と復号化のプロセスは次のとおりです。
C = E
K1 (D
K2 (E
K1 (P)))
P = D
K1 (E
K2 (D
K1 (C)))。
この方法は、中程度の攻撃から保護されています。 攻撃者がテーブル{D
K1 (C)、K1}を作成したとしても、攻撃のためにすべての可能な値{D
K2 ((E
K1 (P))、K1 || K2}を取得する必要があります。本当ではないようです。
しかし、タックマンの方法は長く信頼できるとは考えられていませんでした。
マークルとヘルマンは、トリプル暗号化スキームで選択されたクリアテキストを使用した攻撃オプションについて説明しました。
MeklとHellmanによって提案された攻撃では、いわゆる オラクルの解読。 これは、攻撃者が暗号化機能の入力にメッセージを送信し、暗号化された対応物を受信できることを意味します。
トリプル暗号化に対するMerkle-Hellmanの攻撃は、次のアクションに帰着します。
- 攻撃者は、キーK2のすべての可能な2 56バリアントを列挙し、ゼロバイトで構成されるブロックを解読し、値{D K2 (0)、K2}をテーブルT1に書き込みます
- キーK1の2 56個のバリアントのそれぞれを攻撃すると、ゼロバイトD K1 (0)で構成されるブロックが解読されます。 攻撃者は、値D K1 (0)を暗号化オラクルに送信し、選択したキーK1:D K1 (Enc(D K1 (0)))を使用してオラクルから受信した応答を解読します。 結果の値とキーバリアントK1 {D K1 (Enc(D K1 (0)))、K1}はテーブルT2に書き込まれます
- テーブルT1とT2をソートした後、攻撃者はK1とK2をキーとして受け入れます。
D K1 (Enc(D K1 (0)))= D K2 (0)。
この方法の本質は完全には明らかではありません。 明確にするために、Enc()関数が表すものを記述します。 これは、トリプル暗号化の圧縮記録です。 Enc(x)= E
K1 (D
K2 (E
K1 (x)))。
マークルヘルマン攻撃では、攻撃者はD
K1 (Enc(D
K1 (0)))を計算します。 したがって、K1が正しく推測された場合、結果は式D
K1 (E
K1 (D
K2 (E
K1 (D
K1 (0))))= D
K2 (0)になります。
結果の値がテーブルT1にある場合、キーK1およびK2が候補として選択されます。
攻撃を実装するには、2
57の暗号化操作が必要です。これは、トリプル暗号化2
112の予想される強度とは大きく異なります。
もちろん、MerkleとHellmanが説明した攻撃は本質的に理論的であり、実際の実装はほとんどありませんが、暗号システムの設計でミスを犯しやすいことを非常によく示しています。
シュナイアーの法則
シュナイアーの法則は、未検証のセキュリティシステム、特に独立して設計されたシステムの使用に警告しています。 DESキーの長さの問題を解決するための上記の両方のオプションは、プロの暗号作成者によって提案されましたが、設計中に見落とされた非常に深刻な欠点が含まれていました。 アマチュアが安定したシステムを作成できると信じるのは単純です。
PGPの作成者であるPhil Zimmermannは、これについて次のように書いています。
70年代に私が大学にいたとき、私は理想的な暗号化スキームだと思ったものを思いつきました。 単純な擬似乱数ジェネレーターは、プレーンテキストで加算されるガンマを生成しました。 このスキームは、暗号文の周波数分析に耐性があり、膨大な計算能力を備えた特別なサービスにはまったく使い物になりませんでした。
数年後、私はいくつかの暗号教科書で同様のスキームを見つけました。 素晴らしい。 他の暗号作成者も同様の方向で考えています。 残念なことに、このスキームは単純な宿題として説明されていました。基本的な暗号解析手法を使用してスキームを解読します。
完全に安定したシステムを作成したと思われる場合は、急いでプロジェクトで使用しないでください。 シュナイアーの法則を考え、広く知られている方法をよりよく使用します。
参照資料
ブルース・シュナイアーの法律に関するコメント。マークル、ヘルマン-複数の暗号化のセキュリティについてPGPのPhil Zimmermann