辨識和攻擊提議的密碼(多重替換)
我剛剛開始涉足密碼學,一位朋友提出了一種密碼,並要求我弄清楚如何攻擊它。我知道用於加密的過程,但我很難想出一種方法來攻擊它。
密碼是一種簡單的替換密碼(可能有 26 個字元,每個字元直接映射到另一個字元),並且文本顯然是簡單的 ole 英語。複雜的(至少對我而言)因素是,在他的過程中,他執行了 N 次替換,其中 N 是字元的索引。
前任。 純文字 = “測試” 字母 = "abcdefghijklmnopqrstuvwxyz" key = "bdfhjlnprtvxzywusqomkigeca"(字母排列) plain[0] = 't' (第一個 char subs 0 次,所以仍然是 't') plain[1] = 'e' -> 'j' (2nd char subs 1 time, 變成 'j') plain[2] = 's' -> 'o' -> 'w' (3rd char subs 2 次,變成 'w') plain[3] = 't' -> 'm' -> 'z' -> 'a' (4th char subs 3 次,變成 'a') 編碼=“tjwa”
這個密碼有名字嗎?如果是這樣,我很難在網上找到一個。
至於攻擊它,他給了我一個大的編碼字元串(100k+ 字元)。我編寫了一個簡單的 Java 程序來執行編碼/解碼給定一個已知的密鑰,但是 26!密鑰太多而無法暴力破解。所以我查看了字母頻率並註意到單個字母(在我的情況下為“x”)出現的次數非常少(更接近於其他字元的預期英語頻率),這讓我相信也許它映射到自身。但顯然這仍然會留下 25!鍵。
我真的很想找出其他技術來解決這個問題,並且不要求一個簡單的解決方案,但是有人對其他方法來攻擊它有任何想法嗎?我知道純文字的第一個字母,可能還有另一個字母的位置,但可能在鍵(a ->b->c->a) 到目前為止讓我難以理解如何攻擊它。起初我以為我會知道每 26 個字元,但只有在密鑰沒有創建“循環”時才會如此。
任何幫助/方向/指針/建議將不勝感激。謝謝。
解決這個問題的明顯方法是嘗試恢復排列的循環結構,首先要嘗試重建每個字母的順序。
字母的“順序”是在字母變回該字母之前需要對字母應用多少次排列。
首先,你相信你有墊子
x -> x
;這意味著字母“x”的順序是 1。讓我們擴展這個想法,如果我們有映射
e -> w -> g -> e
,那麼字母“e”(以及“w”和“g”)的順序是 3。那麼,我們如何估計一個字母的順序呢?好吧,我們開始查看密文的每個第 n 個字母(即位置 0、n、2n、3n 等);如果字母的順序是 n(或 n 的除數),那麼在這些位置,該字母將映射到自身(因此密文中這些位置的字元頻率將恰好是明文中的字元頻率);假設明文是英文文本,那麼提出合理的猜測應該是相當簡單的。
一旦你嘗試過,並且對所有字母的順序提出了合理的猜測,我們就需要重建構成排列的“循環”。第一個明顯的起點是找到
e
映射到的元素;如果我們發現 的階數e
是 3,我們可以從查看偏移 1 的每個第 3 個元素開始(例如,在位置 1、4、7、10、13 等處);在這些位置,’e’ 將加密到它被排列的任何字母,因此,如果在這些位置,該字母w
非常頻繁地出現,我們可以推斷出這e -> w
可能是排列中的映射。這些提示應該會給你一個好的開始……