0

私はプログラミングの本で演習を行おうとしています。演習の 1 つは、シーザー暗号を未知のシフトで使用する暗号文を解読することです。

暗号文は次のとおりです。

HVWGWGHVSPSGHQCADIHSFSLSFQWGSWVOJSSJSFSLDSFWSBQSR

アルゴリズムをまだ決定していないため、期待される出力がわかりません。

Caesar 暗号を使用して復号化を試みるために、次のアルゴリズムを作成しましたが、これは私が得た限りです。これをC#で解読するにはどうすればよいですか?

string s = "HVWGWGHVSPSGHQCADIHSFSLSFQWGSWVOJSSJSFSLDSFWSBQSR";

int[] freq = new int[26];

for (int i = 0; i < s.Length; i++)
{
  // converting 
  string temp = s.Substring(i, 1); 

  // converting to an array
  int itemp = (int)temp.ToCharArray()[0];

  freq[itemp - 65]++;  
}

for (int i = 0; i < 26; i++)
{
  Console.WriteLine(i + " " + freq[i]);
}
4

2 に答える 2

6

これは課題のように見えるので、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にシフトされていると推測できます。そしてE5 番目の文字で、次の計算を行うことができます。

暗号文で最も出現する文字のアルファベットの位置 - アルファベットで最も出現する文字の位置 = 復号化する暗号文をシフトする場所の数

または、より簡潔に:

「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" をハードコードした計算を実際に行う方法など、いくつかのことを意図的に省略しました。いくつかの項目は、割り当てを実施する人に任せる必要があります。私が行ったことのいくつかを行うためのより速くて簡単な方法もおそらくあります。私は楽しみのためにこれをしていました。

于 2013-07-17T01:32:11.413 に答える
3

Caesar cypher にはいくつの可能なキーがありますか? ヒント: 数は多くありません。コンピューターがあれば、すべてのキーを順番に試すことは完全に可能です。次に、出力データから正しいキーを識別する方法を考える必要があります。人間の目は 1 つの代替手段です。

このテクニックは、「アルファベットの実行」と呼ばれることもあります。ウィキペディアの記事で取り上げられています。

于 2013-07-17T15:13:56.583 に答える