web-dev-qa-db-ja.com

文字列で任意の長さの繰り返しパターンを検索することは可能(そして実用的)ですか?

私は最近、暗号化に大きな関心を抱き、ECBモードのブロック暗号の弱点のいくつかを調査しています。一般的な攻撃シナリオには、暗号化されたCookieが含まれ、そのフィールドは(比較的)短い16進文字列として表すことができます。

これまで、繰り返しブロックを選ぶのは目で頼っていましたが、これはかなり面倒です。文字列内の繰り返しパターンの検索を自動化するのに、どのようなアルゴリズム(ある場合)が役立つのでしょうか。

誰かが私を正しい方向に向けることができますか?

5
blz

このタスクには、広く使用されている2つのアルゴリズムがあります。一致指数(IC)とKasinskiの方法です。どちらかをグーグルで検索すると、かなりの数のヒットが得られるはずです。 Kasiskiの方法は古いです-少なくともIMO、特に限られた量の暗号文で作業している場合は、ICがより効果的です。 Kasiskiの方法canはうまく機能しますが、通常、有効になる前により多くの暗号文が必要です。

おそらく追加する必要があります。これらは両方とも、実際にはポリアルファベット置換暗号を攻撃することを目的としています。それぞれの最初のステップは、使用されているキーの長さを見つけようとすることです。あなたの場合、ECBモードでブロック暗号を操作する場合、おそらくブロックサイズをすでに知っているでしょう(これはおそらく、ポリアルファベットの換字式暗号のキーの長さに最も近いものです)。残っているのは、主にブロックを歩いて、ブロックが発生した回数を数えて、繰り返しを見つけることができるかどうかを確認することです。その場合、アルゴリズムの大部分をスキップして、ハッシュテーブルのようなものを使用して、さまざまなブロック値が発生する回数をカウントするのはおそらく簡単です。

ほとんどの通常の文字列検索アルゴリズム(Knuth-Morris-Pratt、Boyer-Moore-Horspoolなど)は、この追求ではほとんど役に立ちません。

4
Jerry Coffin

Donald Knuthは、文字列照合パターン理論について多くのことを書いています。多くのアルゴリズムは、時間と隠れた定数において非常に効率的です。ここでいくつかの優れたアルゴリズムを見つけることができます:

http://delab.csd.auth.gr/~dimitris/courses/cpp_fall05/books/SIAM_JNL_Comp_77_KMP_string_matching.pdf

5
g.annunziata