Stream-Cipher

使用空格來破解多次填充流密碼

  • July 11, 2021

我對 Dan Boneh 在 Coursera 上的密碼學課程中的第一個程式作業有疑問。你得到了 10 個用相同密鑰加密的密文,你可以假設明文只包含字母和空格。

該提示表明您應該考慮將空格與字母異或時會發生什麼。這個想法是檢查密文組合的異或子部分是否對應一個字母,這應該可以讓我們找出密鑰。

如果我們確實找到了一封信,我認為我們應該能夠通過執行以下操作來恢復與我們目前正在處理的信相對應的那部分密鑰:

c_sub1c_sub2是密文的子部分,我們目前檢查c1c2m_sub1m_sub2是明文的相應子部分。其中一個m_sub1orm_sub2必須是空格。為了弄清楚是哪一個,我們嘗試以下操作:假設是一個空格,通過與(空格字元的二進製表示)進行異或m_sub1,獲取密鑰()的相應子部分,並檢查是否加密了大小寫-用yield翻轉字母(因為 xor-ing 用空格翻轉字母的大小寫),如果它是,我們應該知道這是密鑰的正確子部分。如果不是,請嘗試假設 m_sub2 是空格。k_sub``c_sub1``00100000``k_sub = xor(c_sub1,00100000)``k_sub``c_sub2``k_sub

我在那個推理中找不到任何邏輯錯誤,但我的實現產生了一個不正確的解決方案,我相當確定我已經消除了所有其他錯誤可能性。誰能告訴我這種方法是否錯誤,好嗎?

檢查是否用 k_sub 加密大小寫翻轉的字母(因為用空格進行異或運算會翻轉字母的大小寫)產生 c_sub2,如果是,我們應該知道 k_sub 是密鑰的正確子部分。如果不是,請嘗試相同的方法,假設 m_sub2 是空格

目前,您正在配對兩個密文流,而其中有 10 個。您應該從 10 個流中選擇一個,然後與所有其他 9 個在同一位置執行 XOR。如果這些流中的大多數返回字母(並且沒​​有 XOR 的無效組合 - 但這更難測試),那麼您可以非常確定加密字元是一個空格,並且您可以通過您在答案中執行的 XOR 找到密鑰.

我認為 Boneh 的作業可能就是這種情況,但請注意,您可能會遇到明文組合在一起也可能產生一個字母。因此,您不能簡單地對兩個流執行 XOR,並以這種方式驗證您的猜測。您擁有的流越多,您就越有把握;最後,您當然也可以通過查看純文字消息來驗證和/或使用您的語言技能來填補空白。


如果我沒記錯的話,我對它的看法有點不同。我取了一個流,對每個位置的字母表中的所有字元進行迭代(注意:可能的輸入字元在這裡稱為“字母表”,我不是指 ABC),然後對所有三個位置進行異或運算。如果所有流都產生了字母表中的結果,那麼我打對了字元。這允許您只處理字母表中的字元,而不是奇怪的 XOR 組合。

如果找到多個字元,則將在所有流中產生最多使用字元的字元一起使用(頻率分析)。

如果仍然沒有產生結果,您也可以嘗試其他流(當然,您只需將流 2 與 8 個流進行比較,因為您已經比較了 #1 和 #2)。


好的,假設我們有第一個位置(變數名稱中未指示位置)和一組流。現在讓我們從第一個流開始,並將它與所有其他流進行異或,表示為 $ y $ 在哪裡 $ y != 1 $ .

您有一對兩個密文值,其中包括 $ c_1 = p_1 \oplus k $ 和 $ c_y = p_y \oplus k $ . 所以 XOR’ing together 給你 $ r = c_1 \oplus c_y = p_1 \oplus p_y $ (這裡沒有什麼新鮮事)。現在如果你猜 $ p_1 $ 並稱之為 $ p’_1 $ 你會得到 $ p’_1 \oplus p_1 \oplus p_y = p’_y $ . 現在如果 $ p’_y $ 顯然是無效字元 $ p’_1 $ 是一個錯誤的猜測。如果你不走運,那麼你需要對所有結果進行頻率分析 $ p’_y $ . 但請記住,您可以使用所有 $ \binom{n+1}2 $ 對才訴諸於此。

一旦你有 $ p’_1 = p_1 $ 那麼顯然關鍵是與密文字元的異或: $ c_1 \oplus p_1 = k $ . 這意味著您只需要遍歷字母表而不是所有鍵,並且您可以很快消除錯誤的嘗試。

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