Stream-Cipher

如何根據 ASCII 空間與字母異或時發生的情況來攻擊“多次填充”?

  • November 5, 2018

我已經在 Coursera 上Dan Boneh 的密碼學入門課程中發送了我的正確解決方案:

“讓我們看看當多次使用流密碼密鑰時會出現什麼問題。下面是十一個十六進制編碼的密文,它們是使用流密碼加密十一個明文的結果,所有這些都使用相同的流密碼密鑰。你的目標是解密最後一個密文,並將其中的秘密消息作為解決方案送出。

**提示:**將密文異或在一起,並考慮當一個空格與一個字元異或時會發生什麼

$$ a-zA-Z $$。”

我設法通過對密文#1 和#2 進行異或運算來獲得密鑰,然後" the "在每個可能的位置將結果與字元串進行異或運算。結合大量的猜測,這給了我第一個明文。

我的問題是:**如果我想遵循提示,我該怎麼做?**我知道如果我對一個空格和一個字母進行異或運算,我會改變字母的大小寫,但是然後呢?

我不明白我如何辨識空格!假設我看到一封信 $ c_1 \oplus c_2 $ ; 如何判斷其中一個明文中是否有空格?

“**提示:**將密文異或在一起,並考慮當一個空格與一個字元異或時會發生什麼

$$ a-zA-Z $$。”

假設明文僅包含空格和 ASCII 字母。鑑於提示,這似乎是一個合理的假設,即使結果可能只是大部分正確。

現在,取其中一個密文並將其與其他密文進行異或。當然,異或運算會抵消密鑰流,因此您最終會得到與所選密文對應的明文與其他每個明文進行異或。

現在依次查看每個字元的位置。根據假設,所選明文中該位置的字元可能是字母或空格。

  • 如果是空格,則成對異或明文中該位置的字元將是字母(如果另一個明文中該位置的字元是字母)或空值(如果兩個字元都是空格)。
  • 如果是字母,則成對異或明文中該位置的字元將是隨機控製字元(如果另一個明文中該位置的字元是大小寫相同的字母)、數字或標點符號(如果另一個字元是不同大小寫的字母)或翻轉大小寫的特定字母(如果另一個字元是空格)。

這兩種情況應該很容易區分。此外,在第一種情況下,您只需將通過對密文進行異或運算獲得的所有字母的大小寫翻轉,即可輕鬆獲得所有明文中該位置的實際字元。

這樣就可以對所選密文對應的明文有空格的位置上的所有字元進行解碼。完成後,選擇另一個密文並重複該過程。希望當您依次使用所有密文完成此操作時,您將解決大部分字元位置並可以輕鬆填寫其餘部分。


附言。要了解其工作原理,了解 7 位 ASCII 字元集可以分為四個 32 字元塊會有所幫助,如下所示:

Bit 4:     0000000000000000 1111111111111111 |
Bits 0-3:  0123456789ABCDEF 0123456789ABCDEF | Block:
---------+-----------------------------------+---------------------------
Bits  00 | ................ ................ | Control characters
5-6:  01 |  !"#$%&'()*+,-./ 0123456789:;<=>? | Numbers and punctuation
     10 | @ABCDEFGHIJKLMNO PQRSTUVWXYZ[\]^_ | Uppercase letters (mostly)
     11 | `abcdefghijklmno pqrstuvwxyz{|}~. | Lowercase letters (mostly)

特別是,這種結構的結果是,如果您對同一行中的兩個 ASCII 字元(例如兩個大寫字母或兩個小寫字母)進行異或運算,結果將是一個控製字元。類似地,對一個大寫字母和一個小寫字母進行異或運算將在第二行產生一個字元,即一個數字或一個標點符號。此外,正如提示中所指出的,第二行開頭的空格字元的位置意味著與任何其他字元進行異或運算只會翻轉字元程式碼的第五位,從而將字元向上或向下移動一行。

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