Encryption

不知道明文位置的已知明文攻擊

  • December 6, 2017

我試圖了解已知的明文攻擊,因為我最好通過實踐來學習,所以我破解了 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 種組合)。

搜尋空間隨著您不知道的字元數量呈指數增長。但反過來也是正確的:搜尋空間隨著你知道的每個字元呈指數級減小。這就是為什麼攻擊者可以訪問明文和密文是可怕的。

所以,不,你不能直接檢索知道一段純文字的密鑰,是的,你確實需要搜尋空間。然而,知道部分明文,您可以大大縮小搜尋範圍,並結合其他因素(如了解明文的結構或加密算法)可以使搜尋在金錢或時間方面難以解決,成為攻擊者負擔得起。

這只是一個簡單的例子,更複雜的密碼不太容易被攻擊,但是概念是相似的;每條知識(明文結構、密鑰結構、算法)都減少了搜尋空間。

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