Stream-Cipher
關於兩次攻擊的基本問題
Dan Boneh 的 Crypto 1 Course 包括關於流密碼的課程,幻燈片如下:
他問這個問題:
而他給出的答案是 $ m \oplus p $ ,這就是為什麼這是不安全的。
但我不明白為什麼這是正確的。
如果:
- $ m = 0011 $
- $ k = 1100 $
- $ p = 1010 $
然後 $$ m \oplus k = 1111 $$
和 $$ (m \oplus k) \oplus p = 0101 $$
和 $$ m \oplus p = 1001 $$
所以 $$ m \oplus p \neq ((m \oplus k) \oplus p) $$
我在上面做錯了什麼?
這不是兩次填充攻擊,這是 OTP 或任何流密碼的延展性。延展性意味著主動攻擊者可以將密文更改為另一個可以解密的密文,而在解密過程中不會出現任何錯誤。這就是為什麼我們需要完整性和身份驗證。
這個怎麼運作; 你發送 $ m\oplus k $ 在通信通道上,主動攻擊者擷取(也可能停止)並修改密文 $ p $ 那麼消息是 $ m \oplus k \oplus p $ , 當接收者用密鑰解密時 $ k $ 他們將收到修改後的消息 $ m \oplus p $ . 如果消息已知或其格式已知,這可能非常危險。例如,攻擊者可以
Attack at the noon!
轉向Attack at the moon!
對於最後一個方程;
$$ m \oplus p \neq (m \oplus k) \oplus p $$
這是我們所期望的,除了 $ k=0 $ .