由於這似乎是一項任務,我不打算在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」。有些項目需要留給進行任務的人員。也許有一種更快更簡單的方法來完成我所做的一些事情;我是爲了好玩而做的。
輸出字符串應該使用最重複字母的移位,然後使用該字母將字符串s = HVWGWGHVSPSGHQCADIHSFSLSFQWGSWVOJSSJSFSLDSFWSBQSR解密爲使用移位的其他字符。我已經到了這樣的地步,我得到了每個字母重複的數字這就是所有。我沒有得到一個字符串的輸出,我不知道是什麼字母重複發現後繼續。 –
這些是編輯到你的問題的細節。我們仍然錯過了你認爲輸出字符串應該實際存在的東西,而不是你所得到的。 –
字母順序應該使用最常見的字母,然後使用它將字符串更改爲解密的字符。我不知道如何解釋它 –