web-dev-qa-db-ja.com

Vigenere Cipher-解読の手助け(手動)

これはVigenere暗号文です

EORLL TQFDI HOEZF CHBQN IFGGQ MBVXM SIMGK NCCSV
WSXYD VTLQS BVBMJ YRTXO JCNXH THWOD FTDCC RMHEH
SNXVY FLSXT ICNXM GUMET HMTUR PENSU TZHMV LODGN
MINKA DTLOG HEVNI DXQUG AZGRM YDEXR TUYRM LYXNZ
ZGJ

一致のインデックスは6のシフトを与えました:私はこれが正しいことを知っています(私はオンラインのJavaアプレットを使用して、キー「QUARTZ」を使用して全体を復号化しました)。

ただし、この質問では、キーの最初と最後の2文字(「Q」と「TZ」)しか聞かれません。

これまでのところ、私は this 素晴らしいアプレットを使用して暗号文をスライスに分割しました。したがって、最初のスライスは0、k、2k、3k、4kです。 2番目は1、k + 1、2k + 1、3k + 1です。など。

KeyPos=0: EQEQQSCXQJJHDEYIUTSVMTVUMTYJ
KeyPos=1: OFZNMICYSYCWCHFCMUULILNGYUX
KeyPos=2: RDFIBMSDBRNOCSLNERTONOIADYN
KeyPos=3: LICFVGVVVTXDRNSXTPZDKGDZERZ
KeyPos=4: LHHGXKWTBXHFMXXMHEHGAHXGXMZ
KeyPos=5: TOBGMNSLMOTTHVTGMNMNDEQRRLG

私のアイデアは、各ブロックで最も頻度の高い文字を計算することでした。最も頻度の高い文字が「U」、「A」、「R」を見つける方法についての手掛かりを与えてくれることを期待していました。ただし、これらのブロックで最も頻繁に使用される文字は次のとおりです。

KeyPos=0: Q,4 T,3 E,3, J,3
KeyPos=1: C,4 U,3 Y,3
KeyPos=2: N,4 O,3 R,3 D,3 B,2
KeyPos=3: V,4 D,3 Z,3
KeyPos=4: H,6 X,6 M,3 G,3
KeyPos=5: M,4 T,4 N,3 G,3

QCNVHMまたはQUNVHM(寛大)を生成しますが、どちらもQUARTZに近いものではありません。この問題を解くことができる オンラインアプレット があるので、ブロックからまともな頻度カウントを生成するにはテキストが短すぎてはいけません。

私はこれに間違った方法でアプローチしているに違いないと思います。私はあなたの一人が私がどこで間違っているのかについていくつかの手掛かりを提供できるかもしれないことを願っています。

助けてくれてありがとう!

4
eggonlegs

あなたはこれに間違った方法で取り組んでいます。ここにあるのは暗号文です。これは、各ブロックで最も頻繁に使用される文字が、クリアテキストで最も頻繁に使用される文字に対応する(または対応する必要がある)ことを意味します。テキストが十分に長い場合、これは文字「E」であると想定できます。各位置で最も頻繁に使用される文字は、キーワードの文字ではありません。

これは、ある位置で最も頻度の高い文字と文字「E」からのオフセットを使用して、キーの各文字を検索できることを意味します。文字「A」は0のオフセットを提供し、文字「Z」は25のオフセットを提供することがわかっているので、元のキーを推測するのは簡単です。

ただし、これは長いテキストでのみ機能します。これは、文字の配布が短いテキストを混乱させるほど簡単だからです。質問のクリアテキストを使用すると、最も頻繁に使用される文字は、実際には「E」ではなく「O」です。さらに、テキストが非常に短いため、キーの各位置での文字の頻度はさらに歪んでいます。

どのようにしてこれを自動的にデコードできたかはわかりません。私が考えることができる唯一の方法は、意味のないキーを無視して、キーと結果の出力の両方で辞書の単語をチェックすることです。

一般に、Vigenere暗号は、より短いキーを持つより長いテキストに対して簡単に解読できます。短いテキスト(ここなど)または長いキーを使用すると、難しくなります。理想的には、プレーンテキストよりも長いランダムなキーを使用し、それが繰り返されることがないようにします。これにより、キーなしでは暗号文をデコードできないことが保証されます。

7
Soumya

私の答えをコピーして StackOverflowから

元の暗号文を解読するためのプログラムによる解決策はありませんが、少しの注意力といくつかの役立つJavaScriptでそれを解決することができました。

私は このページ (現在は機能していません)とあなたが提供した情報を使用することから始めました。暗号文とキー長6を入力し、初期化をヒットします。ここでのアプローチの良い点は、プレーンテキストまたはキーのいずれかの未知数がハイフンとして残されることです。

Q---TZを知っているものだけを追加してキーを更新し、[プレーンテキストを更新]をクリックします。この時点で、次のことがわかります。

o --- sua --- opo --- oca --- nha --- enc --- rom --- dth --- AMA --- int --- ept --- our --- mun- --tio --- ewi --- eus --- the --- ond --- loc --- onf --- now --- hed --- off --- ere --- nsw --- esd --- tmi --- ght

ここで私は少し頭脳力を適用しました。平文のビットを認識し始めます。 thenowoffが表示されます。最後に、ghtがあります。これにより、前の手紙は母音である可能性が高いと思いました。たとえば、lightまたはthought。対応するハイフンをuに置き換え、updateキーワードをクリックして、その組み合わせを生成する文字を見つけました。一致する文字はFであることがわかります。結果を見るために平文を更新したと思います。彼らは有望に見えませんでした。だから私は代わりにiを試してみました:

o--usua--ropo--loca--onha--eenc--prom--edth--eama--eint--cept--gour--mmun--atio--wewi--beus--gthe- -cond--yloc--ionf--mnow--thed--poff--mere--insw--nesd--atmi--ight

今、私たちはどこかに着いています。最初にusualのようなものが表示され、さらにint--ceptと末尾近くにw--nesd--atmi--ightが表示されます。出来上がり。 wednesdayの文字を入力し、キーワードを更新すると、QUARTZが生成されました。

...では、このアプローチをコードに移植する方法は?そのための最良の方法はまだわかりません。鍵に既知の文字を使用し、暗号文を部分的に復号化し、残りを総当たりにするという考えは魅力的です。しかし、便利な辞書がなければ、私は最善の総当たりの方法がどうなるかわかりません...

続く(たぶん)...

6
Tails

Tailsが上で見つけたものを処理する:

o--usua--ropo--loca--onha--eenc--prom--edth--eama--eint--cept--gour--mmun--atio--wewi--beus--gthe- -cond--yloc--ionf--mnow--thed--poff--mere--insw--nesd--atmi--ight

欠けている文字を推測するだけで、これは次のようになります。

oUR
usuaAL
ropo--
locaTIon
haS
Been
cOMpromISed
th--eama--e
intERceptINg
our
COmmunICatioNS
we
wiLL
be
usINg
the
--cond--y
locATion
fROm
now
ON
the
dROp
off
--mere--insw--nesd--
at
miDNight
0
NULLZ