XORファイルの暗号化を行うための短いC++プログラムを作成しました。これは個人ファイルに使用できます(クラックされた場合は大したことではありません-ただの閲覧者から保護しているだけです) 。基本的に、私はASCIIパスワードを取り、繰り返しXORファイル内のデータとパスワードを使用します。
しかし今、私は興味があります:誰かがこれをクラックしたいなら、彼らはそれについてどうするでしょうか?時間がかかりますか?パスワードの長さに依存しますか(つまり、big-Oは何ですか)?
XOR暗号化の問題は、同じ文字を長時間実行すると、パスワードが非常に見やすくなることです。このような長時間実行は、一般的にテキストファイルのスペースです。パスワードは8文字です、およびテキストファイルの一部の行に16個のスペースがあります(たとえば、ASCIIグラフィックテーブルの中央)。XORパスワードを使用すると、出力が表示されます攻撃者はそのようなものを探し、元のファイル内の文字を推測しようとし(スペースが最初に試行されます)、繰り返しグループの長さからパスワードの長さを導き出します。
バイナリファイルは、0x00
バイトの繰り返しシーケンスを含むことが多いため、さらに悪化する可能性があります。明らかに、それらとのXORは何もしませんので、パスワードは出力にプレーンテキストで表示されます!ヌルの長いシーケンスを持つ非常に一般的なバイナリ形式の例は、.doc
です。
Pavel Minaev's説明 XORの弱点に同意します。興味のある方のために、ここで簡単にXOR暗号化を数分で破るのに使用される標準アルゴリズムの基本的な概要を示します。
キーの長さを決定します。これは、暗号化されたデータ自体をさまざまな場所にシフトしたXOR演算を行い、同じバイト数を調べることによって行われます。
等しいバイトが特定のパーセンテージ(ブルースシュナイアーの応用暗号化第2版に6%一致)よりも大きい場合、データは次のようにシフトされています。キー長の倍数。大量の等しいバイトをもたらす最小のシフト量を見つけることにより、キー長がわかります。
暗号化テキストをキーの長さだけシフトし、XORそれ自体に対して。 key.メッセージの内容を決定するのに十分な平文が必要です。
詳しくは 暗号化の問題、パート1
XOR暗号化は、次の条件が満たされている場合、かなり強力になります。
*かなり強いという意味は、GeneQの投稿のように、些細な数学的手段では解読できないことを意味します。パスワードよりも強力ではありません。
すでに述べた点に加えて、XOR暗号化は既知の平文攻撃に対して完全に脆弱です。
cryptotext = plaintext XOR key
key = cryptotext XOR plaintext = plaintext XOR key XOR plaintext
ここで、平文のXORリングは互いに打ち消し合い、キーのみを残します。
既知のプレーンテキスト攻撃に対して脆弱ではないことは、同じキーが複数のプレーンテキストブロックに使用される「セキュア」な暗号化方式に必要ですが、十分なプロパティではありません(つまり、ワンタイムパッドはまだ安全です)。
XORを機能させる方法:
各キーの長さが素数に等しいがキーの長さが同じではない複数のキーを使用します。元のファイル名を別のキーとして使用しますが、ファイル名を取得するメカニズムを作成することを忘れないでください。次に、暗号化されたファイルであることを知らせる拡張子を持つ新しいファイル名を作成します。素数の長さの複数のキーを使用する理由は、結果のXORキーが繰り返される前にキーAがキーBになり、キーBの長さが繰り返されるためです。乱数を生成し、XオフセットごとにXORこの番号(この番号も再作成可能である必要があります。ファイル長のランダムシードを使用できます。
これをすべて行った後、長さ31以上の5つのキーを使用すると、約100メガのキー長になります!
キーの場合、ファイル名は1(フルパスを含む)、STR(ファイルサイズ)+ STR(ファイル日付)+ STR(日付)+ STR(時間)、ランダム生成キー、フルネーム、1回作成された秘密キー。
暗号化された各ファイルに使用されるキーを保存するが、DATファイルはコンピューターではなくUSBメモリスティックに保存するデータベース。
これにより、写真や音楽などのファイルの繰り返しパターンを防ぐことができますが、長さ4ギガ以上の映画は依然として脆弱であるため、6番目のキーが必要になる場合があります。
私は個人的にメモリスティック上で暗号化されたdatファイルを持っています(Microsoft Accessで使用するためのdatファイル)。暗号化には3-Key方式を使用しました。これは、THATが大きくなることはなく、関連付けられたキーを持つファイルのディレクトリになるためです。
1つの非常に大きなキーをランダムに生成するのではなく、複数のキーを使用する理由は、素数と素数がすばやく大きくなり、キーの作成をある程度制御できるため、本当に乱数のようなものが実際にないことを知っているからです。 1つの大きな乱数を作成した場合、他の誰かが同じ番号を生成できます。
キーを使用する方法:1つのキーでファイルを暗号化し、次にすべてのキーが使用されるまで次のキーで暗号化します。各キーは、ファイル全体がそのキーで暗号化されるまで何度も使用されます。
キーの長さは異なるため、繰り返しの重複はキーごとに異なるため、キー1回、キー2回の長さの派生キーが作成されます。このロジックは、残りのキーについても繰り返されます。素数の理由は、繰り返しがキーの長さの除算で発生するため、除算を1またはキー、ヘンス、プライムの長さにすることです。
わかりました、これはファイル上の単純なXOR以上ですが、概念は同じです。
ランス
カジュアルな視聴者から保護しているだけです
この仮定が成り立つ限り、暗号化スキームは問題ありません。 Internet Explorerは「インターネット」であると考える人は、それを破ることができません。
そうでない場合は、暗号ライブラリを使用します。 BlowfishやAESのような対称暗号用の優れたアルゴリズムはすでに多数あります。
ノートンのアンチウイルスは、以前の暗号化されていない文字を次の文字のキーとして使用する手法を使用していました。正しく思い出せば、それを理解するのにさらに30分かかりました。
カジュアルな視聴者を止めたいだけなら、それで十分です。実行可能ファイル内の文字列を非表示にするのに使用しました。ただし、実際に試してみる人には10分間は耐えられません。
それはすべて言ったが、最近ではすぐに利用できるはるかに優れた暗号化方法があります。 「カジュアルな」ユーザーから単に隠そうとしている場合、gzipのようなものでさえ、その仕事をより良くします。
もう1つのトリックは、パスワードのmd5()ハッシュを生成することです。保護されたテキストの長さをオフセットとして使用するか、パスワードと組み合わせて短いフレーズをより適切に配布することにより、さらにユニークにすることができます。また、長いフレーズの場合は、各16バイトブロックを前のハッシュと組み合わせてmd5()ハッシュを進化させ、XORキー全体を「ランダム」で繰り返しのないものにします。
RC4は基本的にXOR暗号化です!多くのストリーム暗号と同様に、キーはキーです(しゃれはありません!)。キーを再利用しないでください。
私はlittle答えが遅いですが、まだ誰も言及していないので、これはVigenère暗号と呼ばれます。
ウィキペディアは多くの cryptanalysis attack を与えてそれを破りました。ただし、ほとんどのファイル形式には固定ヘッダーがあるため、さらに簡単になります。XOR暗号化ヘッダーを含むプレーンテキストヘッダーにキーを提供します。
GeneQが言及している「> 6%」は、英語の電信テキストの一致のインデックスです-句読点と数字が綴られた26文字。テキスト(長)の実際の値は0.0665です。
<4%は、26文字のアルファベットのランダムテキストの一致のインデックスで、1/26または0.385です。
別の言語または別のアルファベットを使用している場合、特定の値は異なります。 ASCII文字セット、Unicode、またはバイナリバイトを使用している場合、特定の値は大きく異なります。しかし、プレーンテキストとランダムテキストのICの違いは通常存在します。圧縮されたバイナリにはランダムのICに非常に近いICがあり、最新のコンピューター暗号で暗号化されたファイルには、ランダムテキストのICとまったく同じICがあります)
テキストをそれ自体に対してXORすると、残ったものは自動キー暗号と同等になります。ウィキペディアには、このような暗号を破る良い例があります