Substitution-Cipher

用於無空格單字母替換的正則表達式可搜尋單詞列表

  • October 4, 2017

我正在自學基本的密碼學。在這個過程中,我創建了一個基於單個字母表的簡單替換密碼,以及一個靜態定義的偏移量(暫時沒有密鑰)。現在一切正常,我想開始另一個應用程序來“破解”偏移量。這裡的關鍵是我的密碼刪除了所有空格,所以我無法判斷單個單詞的長度。

為了解決這個問題,我想使用正則表達式。然後,我將獲取(可能)破譯資訊的一部分並查詢單詞列表以確定單詞的開始和結束位置。

這是一個好方法嗎?

我知道我的簡單密碼中的偏移量只有 26 種可能性。但是,我想以程式方式找到答案。

簡單的轉變聽起來像凱撒密碼。

最簡單的破解可能是頻率分析。英語中最常見的字母是 E。數數你的字母,並據此猜測你的班次。

如果你想讓它變得更好,你可以得到你密碼中最常見的 X 個字母,計算你認為的偏移量,並將其與英語中已知的字母頻率進行比較,比如 ETAOIN SHDRLU。差異最小的頻率猜測(具有最低的編輯距離)可能是您的候選者。

您還可以通過使用二元和三元頻率測試來判斷生成的文本有多好。

您可能還會發現這些書中描述的一些方法很有幫助: http ://www.nsa.gov/public_info/declass/military_cryptanalysis.shtml

**更新:**聽起來你實際上想要做的是檢測你何時解碼了你的密文。您不一定需要匹配字典中的單詞來做到這一點。

上面提到的方法應該工作得很好,特別是如果你開始使用二元和三元頻率。

如果您需要一種更複雜的方法來檢測您的文本何時被解密,我建議您詢問 Stack Overflow,並告訴他們您目前的方法是什麼,以及為什麼它不適合您。

請注意,正則表達式對您的想法沒有用處馬爾可夫鏈將是一個更好的工具,特別是因為它可以用來預測一個單詞的結束位置和一個新單詞的開始位置。

當然,您可以將您的單詞列表轉換為匹配任何串聯單詞字元串的正則表達式,例如:

^(a|aardvark|aardvarks|abaci|aback|...|zucchinis|zygote|zygotes)*$

甚至還有優化此類正則表達式的工具,例如 Perl 的Regexp::Assemble模組。

但是,我通常不會推薦這種方法來辨識正確解密的明文。

一方面,即使是明文中的一個拼寫錯誤或無法辨識的單詞也可能導致匹配失敗。另一方面,當您增加字典的大小以減少這種不匹配的機會時,一個錯誤解密的文本越來越有可能仍然匹配,因為它恰好等於一串無意義的晦澀單詞。

基本上,問題在於正則表達式無法區分像“ the ”這樣的常用詞和像“ adz ”這樣的晦澀但有效的詞,它不能區分像“ a quick brown fox ”這樣的合理片語合和像“ bulks fey hoof re ”這樣的無意義片語合. 舉個極端的例子,如果你的單詞列表恰好包含所有單個字母作為有效單詞(就像一些常用的單詞一樣),那么生成的正則表達式將匹配任何字元串!

相反,我建議您使用的是頻率分析。要解密一個簡單的凱撒密碼,通常將候選解密的單個字母頻率與典型英文文本中的頻率進行比較就足夠了,但對於更複雜的密碼,通常最好查看二元組的頻率即相鄰字母對)或更長的n -grams

n- gram 頻率分析的優點是它提供了統計和上下文感知的度量,因此像“thenext”這樣的子串評為比“ irkteal ”或“ xheettn ”更有可能,同時仍然對事物保持相當穩健像行話或小的拼寫變化。也就是說,在應用它時要記住幾個問題:

  • 源語料庫的選擇確實有些重要,因為不同的詞在不同類型的文本中很常見。例如,我曾經嘗試從Wikipedia 數據庫轉儲中編譯一個n- gram 列表,並為 5-gram “ ation ”之類的東西發現了一些相當出乎意料的峰值,這可能是由於列出了“ location ”的大量公式表和/ 或事物的“人口”。正確應用的頻率分析對此類變化相當穩健,但仍需牢記這一點。
  • 特別是,永遠不要將單詞列表用作您的(唯一)n- gram 數據來源。單詞列表將每個單詞列出一次,無論它在典型的英語文本中多麼常見或罕見,而且它也沒有提供任何關於跨越單詞邊界的n- gram 頻率的有用資訊。(也就是說,使用字典作為源數據的一部分,以及大量正常的英文文本,可能有助於確保包含罕見的n元語法。)
  • 特別是對於較長的n- gram,存在過度擬合的風險:如果明文包含一個從未出現在源語料庫中的n - gram ,那麼簡單的n- gram 分析會將其正確的可能性為零。有一些統計技術可以幫助減少這種影響,例如加法平滑,但有效地應用它們是一門藝術。

附言。儘管如此,您的正則表達式方法在某些情況下可能很有用,例如對於非常短的消息,頻率分析可能表現不佳。然而,即使在這些情況下,我建議僅將正則表達式用作將消息分解為單詞的第一步,然後根據它們的頻率和/或同時出現的可能性對結果進行評分。(例如,雖然“ the ”是一個非常常見的詞,但“ the the ”卻不常見,至少除非資訊是關於英國後朋克樂隊的。)

記住,將單個字元串拆分為單詞的方法可能不止一種。如果您不想考慮所有可能的匹配項(這可能很慢),您至少應該按頻率降序排列正則表達式中的單詞(在大多數正則表達式引擎下,這將確保更常見的單詞是首先考慮)。

引用自:https://crypto.stackexchange.com/questions/12122