爲了簡單起見,我假設您正在嘗試解密凱撒(或移位)密碼。儘管涉及的原則也適用於其他密碼。
你表示你想找到最常見的字符。這並不能真正幫助你,因爲這封信可以成爲其他任何信件。然而,你可以用這個做一個字母頻率攻擊...然而這隻對非常長的字符串非常有效......
解決這個問題的最簡單方法可能是強制解決方案。由於只有極少數解決方案,因此強力可能非常有效。字母表中有26個字母,所以我們可以移動0-25。這意味着只有25個可能的字符串需要檢查。
找到這些字符串是相對平凡的。在1-25範圍內使用循環。現在,只需將字符串中的每個字符轉換爲數字0-25 [A = 0,B = 1 ... Z = 25]並添加移位[1-25]。 (char_value + shift) % 26
會給你新的角色價值。 (您也可以使用ASCII字符值,但我爲了理解而使用這些值。
然而,不太重要的是確定哪個字符串是最有可能的在我看來,最好的方法是這是使用一個普通單詞的字典 - 你可以在這裏閱讀更多關於這種類型的攻擊:http://en.wikipedia.org/wiki/Known-plaintext_attack。用你的字典,你只需要查找已知單詞數量最多的字符串 - 雖然它可以比這更復雜。機會是,這將是您的解決方案。
這將爲所有情況。
如果您只有想要查看哪些最常見的字母被轉換爲E
的問題,問題就變得非常簡單。但是,在實際的例子中,字符串中最常見的字母不一定是E
,所以這種策略並不是最優的。
通過循環字符串找出最常見的字母,保持每個字母出現的運行計數。你可以用很多方法來做到這一點。你可以使用整數列表,地圖,或幾乎任何東西......
從這裏,確定從這封信到E
轉變的大小。例如,如果S
是最常見的,則移位爲12. E的值爲4.S的值爲18.移位是(26-18)+4。可以使用餘數函數將其轉換爲所有可能的字母,例如((26-o)+4) % 26
,其中o
是最常用字母的值。所以如果最頻繁的字母是A = 0,26 + 4%25 = 4,這是正確的轉變。
現在,您可以如上所述移動所有字符。
我們在這裏談論什麼樣的密碼?簡單的移位密碼或更復雜的東西? – DinoOcch
簡單的密碼,你轉移信件的前進 –
我可以添加我已經做了,但我覺得它不會改變 –