一個人如何攻擊一個兩次密碼本(即一個密碼重用的密碼本)?
我的問題可能與利用一次性鍵盤鍵重用的問題相同?,但實際上我確實閱讀了所有答案,但沒有一個能幫助我了解我需要的細節。
我是密碼學新手,我的問題是對 OTP 的兩次時間墊攻擊。我在課程中遇到的問題是我有 10 個使用相同密鑰加密的密文 $ K $ . 然後給我另一個我應該解密的密文。
我知道對兩個密碼進行異或運算會給我原始消息的異或。
我的問題是在那之後正確的做法是什麼?
我試圖取 3 個密文 $ C_1, C_2 $ 和 $ C_3 $ .
然後得到 $ S_1 = C_1 \oplus C_2 \oplus $
' '
, 也得到 $ S_2 = C_1 \oplus C_3 \oplus $' '
.之後我比較了所有對應的字元 $ S_1 $ 和 $ S_2 $ , 而如果 $ S_1[i] = S_2[i] $ 然後我計算 $ S_1[i] \oplus C_2[i] $ 要得到 $ K[i] $ .
我在編碼之前在紙上嘗試過它並且它有效,但我可能會遺漏一些東西。
這是正確的方法嗎?為什麼它有效?
好吧,“在你對兩個原始消息進行異或後,正確的做法是什麼”的經典答案是拖拖拉拉。
也就是說,您猜測可能出現在其中一個明文中的常用片語(針對 ASCII 英語的經典範例是 5 個字母“ the ”),然後對兩個原始消息的異或進行異或地點。如果其中一個明文具有嬰兒床的文本(在我們的範例中為“ the ”),那麼異或的結果就是另一個明文在該位置的結果;如果明文都沒有,那麼異或的結果很可能只是胡言亂語。而且,一旦你有了一個合理的短節,你就可以擴展它(例如,如果你知道其中一個明文是“na* *** ”,你可以瀏覽所有以“na”開頭的單詞的字典,使用那些作為嬰兒床,看看哪個使其他明文有意義)。
此外,您通常可以直接從位模式中推斷出一些東西。例如,如果消息是 ASCII 格式,那麼需要注意的是,字母的第 6 位已設置,但空格、數字和(大多數)標點符號的第 6 位是明確的;因為空格比數字和標點符號更常見,那麼這將使您很好地猜測文本中出現空格的位置(儘管沒有告訴您特定空格出現在哪條消息中)。
現在,如果您有 11 條消息都使用同一個 pad(“11-time pad”)加密,事情會變得更加容易。顯然,您可以在一條消息中抓取一張嬰兒床,然後將其與其他 10 條消息進行對比;如果它使所有 10 個都有意義,那麼它幾乎肯定是準確的。更好的是,通過觀察可以區分空格和字母(同樣,通過比較第 6 位),您可以找到所有空格出現在消息中的位置;這些都像 1 個字元的嬰兒床,可能幾乎揭示了所有消息的所有文本。