web-dev-qa-db-ja.com

疑似乱数ストリームによる暗号化の欠陥(PGPドキュメントから)

私は PGP docs を読んでいて、Phil Zimmermann(PGPの作成者)が私の好奇心を刺激する部分を見つけました。

70年代前半に大学にいたとき、素晴らしい暗号化方式だと思っていたものを考案しました。単純な疑似乱数ストリームが平文ストリームに追加され、暗号文が作成されました。これは一見暗号文の周波数分析を妨害するようであり、最も機知に富んだ政府情報機関にとっても解読不可能です。私は自分の業績をとても独りぼっちに感じました。

数年後、私はいくつかの紹介暗号文とチュートリアル論文でこれと同じスキームを発見しました。いいね。他の暗号学者も同じスキームを考えていました。残念ながら、このスキームは、基本的な暗号解読技術を使用して簡単に解読する方法に関する簡単な宿題として提示されました。私の華麗な計画はこれで終わりです。この卑劣な経験から、暗号化アルゴリズムを考案すると、誤った安心感に陥りやすいことがわかりました。

この方法でエンコードされたテキストを簡単に解読できるのはどのようなテクニックでしょうか?疑似RNGが十分に複雑である(期間が暗号化されたテキストよりはるかに長い、各文字に追加される平均サイズが文字のサイズよりも大幅に大きい)場合、これは1回限りのパッド(パッドなしでは壊れない)とほぼ同等に見えます。適切に複雑なシード(すべてのシードを総当たりすることはできません)。

たとえば、 Mersenne-Twister (2 ^ 19937 -1〜4.3x10 ^ 6001の周期)とランダムな256ビットのシードを生成するパスフレーズを使用します。種を与えられなければ、それは割れないようです。

または、周期が2 ^ 32-1〜43億の単純な乱数ジェネレータを生成しましたか(70年代でした。メルセンヌツイスターは1990年代半ばまで発明されていませんでした)。 43億個のランダムシードのそれぞれをブルートフォースで試して、暗号テキストをすばやくチェックして、辞書の単語が表示されるか、単純な頻度分析(スペースとeの数が多い)を確認できますか?

27
dr jimbob

A PRNG "good"(強い統計的ランダム性が保証されていること、および長い期間があることなど)であっても、そのセキュリティについては何も言われていません。たとえば、 this thread の説明を参照してください。

スレッドは、以下の違いについて説明します。

  • ワンタイムパッド(リークされたり再利用されたりしない限り、原則として破損しませんが、通常は実用的ではありません)
  • ストリーム暗号 (必要に応じて安全にすることができ、非常に実用的です)
  • ストリーム暗号として使用されるPRNG(暗号的に安全であるように設計されていません)(通常は簡単に破られます)

Philが使用すべきだったのは、古いPRNGだけではなくストリーム暗号でした。 MT(および以前のPRNG)は、ストリーム暗号としての使用には適していません。 Salsa20/ChaCha (Dan Bernsteinによる)および [〜#〜] isaac [〜#〜] は2つの特定のストリーム暗号です。ISAACは shred によって使用されます。Salsa20はEUの一部です eSTREAM/ECRYPT プログラム。もちろん、Philストリーム暗号を使用しないことは許されます:RC4(壊れていると考えられます-その弱点はWEPを安全でないものにする一部です-しかしISAACの基礎です)は1987年に発明されました。

通常のPRNGの暗号化の弱点(MTおよびWichmann-Hillを含む)は、たとえばTCPシーケンス番号攻撃に脆弱性をもたらしました。これらの脆弱性は、エントロピーを「そのまま」収集する(たとえば、マウス/タイミングジッタから)さまざまな種類のCSPRNG。ストリーム暗号として使用するには、CSPRNGは、次のように収集するのではなく、最初にすべての入力エントロピーを利用できる必要があります。 CSPRNGs および / dev/[u] random に関するウィキペディアのページを参照してください。

12
Misha

Phil Zimmermanが最初に彼の暗号化に使用した方法がわからないので、それについては何も言えません。

ただし、Mersenne-Twisterは、たとえば CryptMT のように、「安全な」ストリーム暗号にすることができます。その後、CryptMTは破られましたが、 CryptMT に対する特徴的な攻撃です。その論文を読むと、メルセンヌ・ツイスターとその同類を攻撃する方法についてかなり良い考えが得られるでしょう。


実は、もう少し調べてみました。まず第一に、私が引用した論文はその後著者によって編集されました。議論を参照してください ここにおよび現在のバージョンであるCryptMTv3ではなく、CryptMTv1に対するものでした。 CryptMTv3に対する既知の攻撃はありません。私が見つけた攻撃に最も近いのは On the Security of Stream Cipher CryptMT v3 で、次のように明示的に言っています:

ただし、キーストリームの出力については、ランダムでないことがわかりませんでした。

また、CryptMTのeSTREAM最終レポートには次のように記載されています。

CryptMT v3。暗号化CryptMTは非常に珍しい設計で、非常に妥当なパフォーマンスを提供します。 eSTREAMの最後のフェーズでは、暗号に対する否定的な暗号化の結果はありませんでしたが、暗号のセキュリティ、特に非線形フィルタコンポーネントは、一部の暗号ほどセキュリティが十分に理解されていない可能性があることを懸念しています。他のファイナリスト。私たちは、CryptMTの要素が引き続き暗号化コミュニティに関心を持つことを期待しており、CryptMT v3に組み込まれたアプローチの完全な利点を評価できることを願っています。ただし、現在のところ、このアルゴリズムを最終的なポートフォリオに含めるには、このアルゴリズムの設計とセキュリティに十分な自信がありません。

ほとんど否定的なメリットはありません!

また、上記の「非常に妥当なパフォーマンス」を eBASH で見ると、CryptMTv3は長いメッセージに対して素晴らしいパフォーマンスを提供しているようです(たとえば、長いメッセージの場合、バイトあたり1.82サイクル)。多くの場合、Salsa20/8によってのみ最適化され、Salsa20/8はすでに壊れています(かろうじて、Salsa20/12は依然として非常に安全です)。

したがって、まだ十分に分析されていなくても、CryptMTは間違いなくストリーム暗号の候補です!

4
Nakedible

私は、暗号の一般人としてこの質問に取り組む最善の方法は、現代の暗号から離れて、代わりに古典的な紙と鉛筆の暗号を検討することだと思います。この場合、おそらく考慮すべき最良の例は 実行鍵暗号 です。

古典的な暗号化では、ランニングキー暗号は一種のポリアルファベット置換暗号であり、通常は本からのテキストを使用して非常に長いキーストリームを提供します。

基本的に、そのような暗号はプレーンテキストと同じくらい長い自然言語テキスト(たとえば、小説の一節)を取り、対応するキーストリーム文字に依存する量だけシフトすることにより、プレーンテキストの各文字を暗号化します。

このような暗号は簡単に解読できます。

[通常]実行キーは自然言語のテキストのブロックであり、そのテキストは暗号解読を支援するために使用できる非ランダムな特性を持っているため、実際にはセキュリティはかなり悪くなります。その結果、平文と実行キーの両方の文字あたりのエントロピーは低く、結合操作は簡単に反転されます。

暗号を攻撃するために、cryptanalystは推測された推定平文を暗号文に沿って実行し、可能な各位置からそれらを差し引きます。結果がわかりやすい何かのチャンクである場合、推測されたプレーンテキストがその位置に対して(実際のプレーンテキストまたは実行中のキーの一部として)正しい可能性が高くなります。 「理解しやすい何かの塊」は、多くの場合、どちらかの端で拡張できます。これにより、さらに可能性のある平文が提供され、これが拡張されます。最終的には、実行中のキーのソースが特定され、ジグが作動する可能性があります。

このような攻撃が機能する理由は次のとおりです。

  1. 攻撃者は通常、平文に関する一部の情報を持っています。古典的な暗号では、これはありそうな平文言語とトピックです(これは、文字と単語の頻度と、連続する文字と単語間の依存関係を意味します)。最近の暗号化では、暗号化されている通信プロトコル(HTTP over SSLなど)、接続のエンドポイント(Googleなど)などです。
  2. 自然言語のキーストリームには、キーストリームから数文字が与えられると、非常に高い確率で次の数文字を推測できるようなパターンがあります。ここで注目すべき重要なことは、非暗号化PRNGにもこのプロパティがあり、したがって同様の攻撃を認めることです。

このブログシリーズ は、単純な線形合同RNGとMersenne Twisterを分割する方法を説明しています。のために Java.util.Random RNG、PRNGからの2つの連続するints出力がある場合、それはその状態を再構築し、残りの疑似ランダムストリーム(前方と後方の両方)を予測するのに十分です。したがって、PRNG=を使用してキーストリームを生成した場合、暗号テキストの連続する8バイトを知っているまたは推測する攻撃者は、実行中の暗号攻撃の変種とブログシリーズのPRNGを適用できます。 -メッセージの残りを解読するクラッキング技術。

パート ブログシリーズの==では、624の連続する出力ワードを取得できる場合に、メルセンヌツイスターの出力を同様に予測する方法を説明しています。したがって、線形合同ジェネレーターよりも困難ですが、依然として脆弱です。

0
Luis Casillas

キーを使用してPRNG=を初期化するために使用される単純なXOR/PRNG暗号は、複雑さ1の既知の平文攻撃に対して脆弱です。

  1. 少なくとも未知の暗号文と同じくらい平文を暗号化します。
  2. 既知の平文とその暗号文のXOR。これで keystream が得られます。
  3. キーストリームと未知の暗号文をXORします。これにより、元の平文が得られます。

すべて「0」で構成されるプレーンテキストを暗号化できる場合は、ステップ2をスキップできます。暗号化プロセスの出力isがキーストリームです。

PRNG使用しているものは関係ありません: [〜#〜] randu [〜#〜] から Fortuna までのすべてこの種のキーストリーム回復攻撃に対して脆弱です。

操作のコアとして「XOR平文とキーストリーム」を使用する暗号があることに注意してください。ただし、この攻撃を防ぐための予防策を講じています。 ワンタイムパッド パスワードを再利用しないでください ストリーム暗号 シングルユースキーまたはシングルユース値が必要です- ノンス 、および 出力フィードバックモードおよびカウンターブロック暗号化動作モード キーと 初期化ベクトル と呼ばれる2番目の使い捨て値の両方を使用して、 RNGが同じ方法で2回シードされることはありません。

0
Mark