如何“評分”部分解碼的密文?
我正在嘗試編寫一個基本的密碼破解程序來破解簡單的密碼(想想凱撒密碼和鐵路圍欄),例如https://en.wikipedia.org/wiki/Classical_cipher。
該程序將在解碼密文時進行半隨機嘗試,我需要一種方法來“評分”這些嘗試與完全解碼的明文的接近程度。例如,“hello world”的得分高於“Kello woHld”或“aellp wprld”,後者的得分都高於“KRYYP ZPHYI”,因此程序可以使用爬山或類似的方法來收斂解碼的文本。
我不確定如何對文本進行評分,可能使用字典(+正則表達式?)來檢查解碼的單詞,或者計算常見字母和 2,3 和 4 個字母的常見組的出現,然後可能與已知頻率進行比較。
我不是要求一個完整的算法,只是一些關於如何對文本的“解碼”/接近明文進行評分的指示。
編輯:我正在使用 500 到 1000 個字元長的密文,希望系統在保留或不保留單詞邊界的情況下工作。
您正在尋找一種方法來衡量字元串之間的相似性,這通常稱為字元串度量。現在,在您的情況下,其中一個字元串是原始明文,另一個是(或多或少)通過加密和解密僅部分正確生成的相似字元串。但實際上,其他字元串的來源並不重要,您只需要衡量它們的相似程度即可。
但是,有許多字元串指標,可以根據您的特定需求調整它們。以下是一些常見的:
- 漢明距離:不匹配字元的數量
- Levenshtein distance : 插入/刪除/替換操作的次數
有無數其他方法可以衡量字元串之間的相似性,並且必須確定哪些被認為是相似的,哪些不是。
在對可能的解碼進行評分時,如果我們要求 giw 的消息可能是實際消息。為此,我們需要某種語言或源消息的統計模型(不必是自然語言)。
一個簡單的模型是字元頻率,基本上獨立建模以使用機器學習術語。您可以了解每個字元在語言中的常見程度,並且可以將建議解碼中字元的機率相乘以獲得分數。出於數值原因,我們更喜歡對數求和而不是直接相乘。
顯然一個charchter級別的模型我們有點太簡單了。所以通常你會更喜歡成對或三元組字元頻率的模型。這種簡單的模型實際上非常有用,通常就足夠了。
您顯然可以使用更複雜的模型,使用馬爾可夫鍊或遞歸神經網路。如果你想要一些非常複雜的東西,你可以使用 GAN 在生成的文本和語料庫中的文本之間創建一個鑑別器。這樣的模型不僅會學習字元頻率,還會學習字典單詞和語法。對於大多數密碼來說,這是多餘的,但如果密碼確實存在單詞級別的問題,那麼您的語言模型必須知道一些關於單詞順序的資訊,而 char-gram 頻率是不夠的。