PKCS#5 上的 CCA 使用錯誤回饋
我的問題是關於使用錯誤回饋使用 CCA 攻擊 PKCS#5。
我們在課堂上學到的關於 PKCS#5 的內容:
CBC 需要填充到整個塊邊界 PKCS#5:標準填充
- 如果最後一個明文塊有 1 個字節:填充 $ \texttt{07} $ 字節
- 如果最後一個明文塊有 2 個字節:填充 $ \texttt{06} $ 字節
- 如果最後一個明文塊有 7 個字節:pad with $ \texttt{01} $ 字節
- 如果最後一個明文塊有 8 個字節:用另一個塊(8 個字節)填充 $ \texttt{08} $ .
和:
解密過程:應用“正常”CBC模式解密檢查填充:
- 如果 padding Ok,刪除並返回明文
- 如果不正確,錯誤中止
直到現在我什麼都明白了。但最後一部分,用回饋描述了對 PKCS#5 的 CCA 攻擊,這是我無法理解的:
讓 $ (c_1,…,c_8)=F_k(p_1,…,p_8) $ 是一些密文。
查找最後一個字節 $ p_8 $ : 檢查哪個 prev 塊給出了 Ok 解密
讓 $ x_8 $ 成為塊的最後一個字節 $ X $ 給確定填充
大機率, $ x_8 \oplus p_8 = \texttt{01} $ …
就是這樣。
首先,我不知道這裡涉及 IND 測試。
在測試中,攻擊者發送兩條消息 $ m_1 $ , $ m_2 $ 並收到 $ c’ $ 這是其中一個的加密,並且必須使用選擇密文能力來區分哪一個,但是這裡我們只使用錯誤結果,好像忽略了測試。
現在,讓我們看看我是否理解正確:
$ c_1 $ ,…, $ c_8 $ 是我們希望解密的某個密文塊的字節。
它說,為了找出 $ p_8 $ 我們找到最後一個塊,它在填充上是好的 - 假設我們找到了一個……這個塊看起來像這樣: $ c’=(c’_1,…,c’_8) $ ,我知道明文 $ c’ $ 以。。結束 $ \texttt{01} $ , 或者 $ \texttt{02},\texttt{02} $ 等..直到 $ \texttt{08},…\texttt{08} $ (8 次)。
現在我們將最後一個字節(解密為明文)表示為 $ x_8 $ .
為什麼會 $ x_8 \oplus p_8 $ 是 $ \texttt{01} $ 大機率?
如果有人能啟發我,那就太好了,我也願意接受其他解釋,而不是我在這裡描述的解釋。
PS閱讀那個問題,似乎相關,但我仍然不明白如何推斷我的問題的答案。 你能解釋一下 Bleichenbacher 對 PKCS#1 v1.5 的 CCA 攻擊嗎?
好的,假設我們有一個密文 $ (c_1, c_2, …, c_8) $ 我們希望解密。
我們開始做的是猜測 $ p_8 $ ,即對塊的最後一個字節的解密。假設我們猜測是0x07;然後我們需要驗證這個猜測。
我們所做的是創建一個兩塊消息;第二個塊是挑戰密文塊 $ (c_1, c_2, …, c_8) $ ; 第一個塊有 7 個隨機字節;其次是 $ 0x07 \oplus 0x01 = 0x06 $ . 然後我們將其發送給 Oracle 進行解密。
讓我們回憶一下CBC模式解密的時間;這是 $ P_i = C_{i-1} \oplus D_k( C_i ) $ . 在最後一個塊的具體情況下,解密過程首先會在內部解密最後一個密文塊 $ (c_1, c_2, …, c_8) $ ,並得到明文塊 $ (p_1, p_2, …, p_8) $ ; 然後它將與前一個密文塊獨占或獨占;該結果的最後一個字節將是 $ p_8 \oplus 0x06 $ (因為我們將 next-to-last-block 的最後一個字節設為 0x06)。
現在,如果我們的猜測是正確的;那是 $ p_8 = 0x07 $ , 這個異或的結果是 $ 0x07 \oplus 0x06 = 0x01 $ ; 最後一個字節為 0x01 的最後一個塊是有效的填充,因此該消息將被接受。
另一方面,如果我們的猜測不正確,那麼這個異或的結果不是 0x01。現在,結果也可能看起來像一個有效的填充(例如,最後三個字節可能是 0x03 0x03 0x03),但這也可能涉及其他字節(我們隨機設置),所以這不太可能。
因此,要實際執行這種攻擊,我們會猜測 $ p_8 $ ,並發送密文來測試這些猜測。而且,一旦我們確定了 $ p_8 $ ,我們可以開始猜測 $ p_7 $ (它的工作方式相同,只是我們的目標是 $ 0x02 $ $ 0x02 $ 最終模式)。
順便說一句:Bliechenbacker CCA 攻擊實際上是無關的。