不知道明文位置的已知明文攻擊
我試圖了解已知的明文攻擊,因為我最好通過實踐來學習,所以我破解了 Python 並做了以下事情:
我有一個明文字元串
s
和一個密鑰k
:s = 'Lorem ipsum dolor sit amet' k = 'key'
當我使用 xor 執行此操作時,這是我的 xor 方法:
def xor(s, k): return ''.join(chr(ord(a) ^ ord(b)) for a, b in zip(s, itertools.cycle(k)))
所以為了得到一個密文,我這樣做:
c = xor(s, k)
我可以通過這樣做來取回明文,所以我知道它有效:
xor(c, k)
現在進行練習,假設我有密文並且知道裡面有“dolor”這個詞。我將如何嘗試獲取密鑰?
我的第一個想法是做,
xor(c, 'dolor')
但由於我不知道這個詞在哪裡,我想我必須嘗試每個位置?我發現使用單詞
dolor
作為鍵並以不同的字元開頭似乎有點工作。所以我嘗試這個:xor(c, 'dolor') xor(c, 'olord') xor(c, 'lordo') xor(c, 'ordol')
等等
使用最後一個 (
ordol
) 我keyke
在結果中發現。因為我知道關鍵是什麼,所以我知道我找到了它。但是如果我不知道密鑰,我怎麼知道呢?是否還有其他方法可以做到這一點,而不是嘗試所有可能性?
如您所知,您的加密/解密功能有效,因為 A $ \bigoplus $ 乙 $ \bigoplus $ B = A。所以對於:
- P = 明文
- K = 鍵
- C = 密文 = (P $ \bigoplus $ ķ)
您可以將明文檢索為 C $ \bigoplus $ K == (P $ \bigoplus $ ķ) $ \bigoplus $ K = P。
你也知道C $ \bigoplus $ P == (P $ \bigoplus $ ķ) $ \bigoplus $ P == K,即知道明文就可以取回密鑰。
基本的東西,你已經知道了。
你問過“如果我只知道一段明文,我將如何嘗試獲取密鑰”?在這種情況下,您無法直接檢索密鑰。但是,您可以大大縮小 K 的搜尋空間。
考慮您知道明文少於 1 個字元的情況,為了簡單起見,我們假設僅在明文中使用小寫字母字元。
在這種情況下,您的已知明文片段可以位於兩個位置,即原始消息中的開頭或結尾。明文片段開頭有26種可能的明文解法,結尾有26種明文解法,所以有52種可能的明文解法。如果您使用密文對所有這些解決方案進行異或,則 52 個結果之一將是您的密鑰。
擁有大量密文有助於知道您擁有“密鑰”(例如在 Mallory 竊取了您的百萬記錄加密數據庫的情況下)。辨識密鑰涉及針對數百萬條被盜記錄測試 52 個候選密鑰,並查看哪些候選密鑰創建了最合理的明文(例如,如果知道原始明文是英語單詞,則找到生成其中最多的密鑰)
您在明文片段中知道的每個字元(大大)增加了搜尋空間。如果您知道一個純文字片段少於兩個字元,那麼該片段可以佔據三個位置,並且對於這些位置中的每一個,都有 $ 26^2 $ 可能的組合(總共 2028 種組合)。
搜尋空間隨著您不知道的字元數量呈指數增長。但反過來也是正確的:搜尋空間隨著你知道的每個字元呈指數級減小。這就是為什麼攻擊者可以訪問明文和密文是可怕的。
所以,不,你不能直接檢索知道一段純文字的密鑰,是的,你確實需要搜尋空間。然而,知道部分明文,您可以大大縮小搜尋範圍,並結合其他因素(如了解明文的結構或加密算法)可以使搜尋在金錢或時間方面難以解決,成為攻擊者負擔得起。
這只是一個簡單的例子,更複雜的密碼不太容易被攻擊,但是概念是相似的;每條知識(明文結構、密鑰結構、算法)都減少了搜尋空間。