攻擊面應該怎麼選?
我們先來回顧一下 CBC 模式的加密過程。在這個過程中,一個明文分組的加密,需要如下的輸入資料:
上一次的密文分組 Ci-1;這一次的明文分組 Pi;加密和解密共享的金鑰 K。這一次的明文分組 Pi 和上一次的密文分組 Ci-1 進行異或運算,獲得中間結果 Ti。
異或運算獲得的中間結果 Ti,Ti = Ci-1 ^ Pi然後,異或運算獲得的中間結果 Ti 和金鑰 K,透過加密函式的運算,產生密文分組:
密文分組 Ci而加密端的異或運算,發生在明文分組和上一次的密文分組(對於第一次運算,上一次的密文分組就是初始化向量)之間。針對加密端的攻擊,同樣,我們也是在明文分組和上一次的密文分組或者初始化向量上想辦法。
攻擊理論上可行嗎?假設目標明文分組是 Pi,但是攻擊者並不知道 Pi 的明文內容,而他攻擊的目的就是解密出 Pi 的明文資料。由於密文資料不是保密的,所以攻擊者可以知道所有的密文分組,包括參與 Pi 加密運算的上一次密文分組 Ci-1 和這一次的密文分組 Ci。
如果攻擊者可以使用加密介面,攻擊者就可以構造明文分組,然後呼叫加密運算,觀測加密運算後的密文分組。如果攻擊者觀測到密文分組和目標明文分組對應的密文分組相同,那麼他就可以確定目標明文分組的具體資料了。
如何構造明文分組?
像解密端的攻擊方案一樣,我們還是要利用異或運算的歸零律和恆等律。假設已經知道了 Pi,當前的加密運算需要使用上一次的密文分組 Cj-1,如果攻擊使用的明文可以構造成下面的形式,那麼攻擊就能夠成功:
Pj = Pi ^ Ci-1 ^ Cj-1
這段沒看懂公式怎麼來的.
攻擊實踐上可行嗎?2011 年 9 月,兩位天才般的研究人員(Juliano Rizzo,Thai Duong)公開了上述的攻擊方案。並且表示,只要給他們幾分鐘時間,他們就可以利用該漏洞入侵你的支付賬戶。他們給這個攻擊技術取了一個超酷的名字,叫做 BEAST。
有什麼防範措施?其實,防範措施還是要在初始化向量上想辦法。BEAST 攻擊起作用的關鍵,就是要使用上一次加密運算的最後一個密文分組。
如果這一次的加密運算不使用上一次加密運算的資料,BEAST 攻擊就無法運算了。該用什麼替換上一次加密運算的最後一個密文分組呢?
和防範補齊預言攻擊的辦法一樣,替換的辦法就是每一次加密運算,都使用不同的初始化向量。
比較麻煩的是,對於每一次解密運算,解密端需要加密端使用的初始化向量,然後才能執行解密運算。可是,初始化向量的同步不是一件容易的事情,特別是在資料包可能被有意無意丟棄的環境下。
有沒有改進的防範措施?一個改進的辦法,就是繼續使用上一次加密運算的最後一個密文分組,同時把每一次運算的初始化向量當做第一個明文分組來處理。
這個辦法的好處,就是解密端不需要知道加密端選擇的初始化向量,就可以執行解密運算。這個辦法的壞處,就是解密端需要丟掉初始化向量這一段資料,不能把它當做應用資料來處理。