これは課題のように見えるので、C# で回答するつもりはありません。アルゴリズムを説明し、Python で解決策を示します。
シーザー暗号は、アルファベットの「N」個のスペースをシフトすることによって機能します。配列にアルファベットを設定している場合:
array = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]
これは、アルファベットを操作して、さまざまなシフトがどのように見えるかを確認する簡単な方法です。
次に行うことは、暗号内の各文字の出現回数を数えることです。
count = {}
encrypted_string = "HVWGWGHVSPSGHQCADIHSFSLSFQWGSWVOJSSJSFSLDSFWSBQSR"
for s in encrypted_string:
if count.has_key(s):
count[s]+=1
else:
count[s] = 1
most_occured = 1
last_found = ""
for key in count:
if count[key] > most_occured:
last_found = key
most_occured = count[key]
シーザー暗号はシフトされた通常のアルファベットを使用するため、結果の暗号文は通常のアルファベットと同じように頻度分析によって把握できるため、これは重要です。
英語では、文字「E」が最も頻繁に使用されます。暗号文に最も頻繁に現れる文字が、「E」に対応するシフトされた文字である可能性が高いのは当然のことです。
が暗号文で最も頻繁に出現するためS
(合計 13 回)、これE
が英語で最も頻繁に出現することがわかっていることから、S
可能性が高いことがわかっていE
ます。
これが Caesar Cipher であることもわかっているので、残りの文字はシフトされたのと同じようS
にシフトされていると推測できます。そしてE
5 番目の文字で、次の計算を行うことができます。
暗号文で最も出現する文字のアルファベットの位置 - アルファベットで最も出現する文字の位置 = 復号化する暗号文をシフトする場所の数
または、より簡潔に:
「S」の位置 - 「E」の位置 = 14:
19 - 5 = 14
つまり、すべての文字を 14 桁左にシフトする必要があります。
decrypted_string = ""
for s in encrypted_string:
decrypted_string += array[array.index(s)-14]
print decrypted_string
これにより、次の解読されたテキストが出力されます。
これは今まで経験したことのない最高のコンピューターエクササイズです
たとえば、2 番目のアルゴリズムで "14" をハードコードした計算を実際に行う方法など、いくつかのことを意図的に省略しました。いくつかの項目は、割り当てを実施する人に任せる必要があります。私が行ったことのいくつかを行うためのより速くて簡単な方法もおそらくあります。私は楽しみのためにこれをしていました。