2013-07-17 16 views
0

我正在試圖在一本編程書籍中做練習,其中一個練習是解密使用Caesar cipher以及未知變化的密文。如何編寫算法來打破凱撒密碼?

這裏的密文:

HVWGWGHVSPSGHQCADIHSFSLSFQWGSWVOJSSJSFSLDSFWSBQSR

我不知道預期的輸出,因爲我還沒有確定的算法呢。

我已經寫了下面的算法,試圖使用凱撒密碼進行解密,但這是我得到的。我如何解密這在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]); 
} 
+0

輸出字符串應該使用最重複字母的移位,然後使用該字母將字符串s = HVWGWGHVSPSGHQCADIHSFSLSFQWGSWVOJSSJSFSLDSFWSBQSR解密爲使用移位的其他字符。我已經到了這樣的地步,我得到了每個字母重複的數字這就是所有。我沒有得到一個字符串的輸出,我不知道是什麼字母重複發現後繼續。 –

+2

這些是編輯到你的問題的細節。我們仍然錯過了你認爲輸出字符串應該實際存在的東西,而不是你所得到的。 –

+0

字母順序應該使用最常見的字母,然後使用它將字符串更改爲解密的字符。我不知道如何解釋它 –

回答

5

由於這似乎是一項任務,我不打算在C#中給你答案。我將解釋這個算法,並用Python給出一個解決方案。

Caeser Cipher通過移動字母「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] 

這是重要的,因爲自從凱撒密碼使用普通的字母移位,產生的密文可以計算通過頻率分析,就像普通的字母表一樣。

在英文中,the letter "E" appears most often。根據理由,密文中最常出現的字母將是一個對應於「E」的移位字母。

由於S最頻繁地出現在你的密文(共13次),因爲我們知道,E最常出現在英文中,我們知道,S可能E

鑑於我們知道這是一個凱撒密碼,我們可以假設其他字母被移位,就像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 

此輸出以下破譯的文字:

THISISTHEBESTCOMPUTEREXERCISEIHAVEEVEREXPERIENCED

我已經有意留下了一些事情,例如,如何在我已經很努力的情況下實際進行計算在第二個算法中使用「14」。有些項目需要留給進行任務的人員。也許有一種更快更簡單的方法來完成我所做的一些事情;我是爲了好玩而做的。

+0

E是定義換檔鍵的基本因素背後的故事是什麼?找到最常用的字母很好,我只是不明白爲什麼E成爲定義實際轉變的基本因素。 – Prix

+1

@Prix給出了假設明文是英文的假設,猜測密文中最頻繁出現的字母表示明文中的E是破壞替換密碼的標準起點。由於凱撒密碼是一個簡單的旋轉而不是任意的置換,一旦確定了一個字母的移位,相同的移位適用於所有字母。 –

+0

@JeffreyHantin謝謝,現在更有意義。 – Prix

3

凱撒密碼有多少個可能的密鑰?提示:不是一個大數字。給定一臺電腦,完全可以依次嘗試所有的鑰匙。然後您必須想辦法從輸出數據中識別出正確的密鑰。人眼是一種選擇。

該技術有時被稱爲「拼寫字母」。它在維基百科文章中有所介紹。