Cryptanalysis

如何確定由多次填充加密的消息的密鑰長度?

  • June 12, 2016

留言 $ m $ 和鑰匙 $ k $ 我收到加密資訊 $ c $ ( $ m \oplus k = c $ ) 在哪裡 $ length(k) < length(m) $ . 另外我知道那個消息 $ m $ 是英文文本。我想通過使用諸如“按頻率排序的相對頻率”之類的語言模式估計密鑰長度來縮小可能的密鑰,而不是使用純暴力方法。因此,例如,對於長度為 3 的密鑰,我應該得到三組: $ {c_0, c_{0+3}, c_{0+6}, …}; {c_1, c_{1+3}, c_{1+6}, …}; {c_2, c_{2+3}, c_{2+6}, …} $ ,並且每個集合都應該以某種方式與相對頻率模式進行比較。將這個集合與模式、每個鍵長度的最終分數以及其他鍵長度的分數進行比較的最佳方法是什麼(統計?)?

我的答案基於Cryptopals

基本思想是,由於 {c0,c0+3,c0+6,…} 都被同一個字節異或,c0 和 c3 之間的不同位數與 p0 和 p3 之間的不同位數相同。(這個數字稱為兩個字元之間的漢明距離。

此外, 和 之間的距離與[c0 c1 c2]和之間的距離[c3 c4 c5]相同,假設密鑰長度為 3。在正常英文文本中,兩個明文塊之間的漢明距離應該很小,因為實際使用的字母佔據了高度有序的一小部分總 ASCII 範圍。[p0 p1 p2]``[p3 p4 p5]

[c0 c1 c2 c3]但是,和之間的距離[c4 c5 c6 c7]將是總位數的約 50%,因為異或密鑰不會“自行取消”。

因此迭代一系列可能的鍵大小,併計算前兩個塊之間的漢明距離。然後通過 keysize 規範化這個結果。

最小值應對應於密鑰長度。

現在你有一個 many time pad,其中 many = len(m)/keylength。

每條消息是[c0 c1 c2][c3 c4 c5][c6 c7 c8]

一旦你知道了這一點,然後{c0,c0+3,c0+6,…};{c1,c1+3,c1+6,…};{c2,c2+3,c2+6,…}獨立地應用頻率分析來找到每個關鍵字節。

您也可以應用嬰兒床拖動。這基本上是您猜測某個單詞在某個位置的地方

還有一個很酷的攻擊,它依賴於 ASCII 的一個怪癖:'a' ^ ' ' = 'A'. 也就是說,用空格對英文字母進行異或運算只會翻轉符號。

有用的是,空格在統計上是英文文本中最常見的“字母”。

如果你{c3,c6,c9,c12,…}用 c0 對每個字節進行異或運算,你會得到{p3^p0, p6^p0, p9^p0,...}.

如果這個結果序列大部分(~70%)在“az”聯合“AZ”的範圍內,那麼 9/10 倍,p0 是一個空格。

你當然可以用 p3 或 p6 或 … 來檢查該字元是否為空格。給定一條足夠長的消息,其中一個明文字元將是一個空格,然後您可以立即獲得所有其他明文字元,這些明文字元是用相同的密鑰字節異或的!

作為攻擊 N-time pads 的經驗法則:

  • 頻率分析工作一次 N =~ 6,低於此是一個笑話
  • 超過 N =~ 8 時,嬰兒床拖動變得緩慢,但對於小 N 來說是最好的選擇。
  • 在所有消息大小下,查找空間都比頻率分析效果更好。它甚至可以在 2-time 墊上工作。

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