Cryptanalysis

填充預言機攻擊如何工作?

  • December 3, 2018

我不確定填充 oracle 攻擊是如何工作的。

我沒有得到的是如何一次更改一位允許一個人利用(獲取密鑰)ASP.NET 機器。

誰能解釋一下?

定義/介紹

我們定義(這僅用於我們的範例):

  • $ enc() $ 和 $ dec() $ 作為使用CBC模式的加密和解密函式,具有恆定密鑰。任何分組密碼都可以
  • $ \oplus $ 是異或運算。
  • $ n $ 純文字塊的數量。
  • 一個塊的字節長度是 $ 16 $ (即 128 位)。
  • $ m_1 $ 通過 $ m_n $ 純文字塊。
  • $ c_0 $ 通過 $ c_n $ 密文塊,而
  • $ c_0 $ 是初始化向量(即我們這裡還有一個塊!)。
  • 對於每個塊,第二個索引指向字節,即 $ m_{1,0} $ 是我們純文字的第一個字節。
  • $ x_1 $ 通過 $ x_n $ 是中間解密值,之後 $ dec() $ 在異或之前。
  • 單個等號 $ = $ 用於賦值,雙等號 $ == $ 進行比較。

解釋什麼 $ x $ 意思是,這裡又是CBC解密公式。對於每個加密塊 $ c_i $ ,我們確定 $ m_i $ 經過:

$ m_i $ = $ x_{i} \oplus c_{i-1} $ ,(和值 $ dec(c_0) $ 也被命名為 $ x_0 $ )

對於第一個塊,我們使用 IV 如下:

$ m_0 $ = $ dec(c_0) \oplus iv $

我建議快速瀏覽這些圖像以進行解密加密(閱讀整個Wikipedia 文章也不會受到傷害)。

設想

對於這種攻擊,我們需要一個所謂的填充預言機,例如一個 Web 應用程序。這個填充預言機接受任意密文,並給出關於純文字是否無效或解密失敗的不同消息。

讓我們想像一下這個填充:

對於所有純文字,最後一個塊被填充到 16 個字節的長度,如下所示,the end.\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x08. 如果最後一個塊是 15 字節長,則填充是簡單的\x01. 如果最後一個塊是 16 字節長,即如果消息的長度是 16 的倍數,\x10則附加一個由 15 個任意值組成的塊。這意味著,最後一個塊總是用 0 到 15\xFF個字節填充,直到最後一個,這給出了我們填充的長度。

解密後,現在可以讀取最後一個字節並在最後切斷給定數量的字節。等於 0 且大於 16 的值無效並返回填充錯誤。

我們將 Oracle 定義如下:

$$ O(c) = \left{ \begin{array}{l l} 0 & \quad \text{if $c$ has a valid padding and }\ & \quad \text{decryption yields a well-formed plain text} \ 1 & \quad \text{if the padding was valid, but the plain text}\ & \quad \text{was not well-formed (contained \xFF)} \ 2 & \quad \text{if $c$ has an invalid padding}\ \end{array} \right. $$

Web 應用程序期望純文字為 XML(或 JSON 或其他),並在解析失敗時報告不同的錯誤。對於我們的簡化場景,假設存在純文字(刪除填充後)不能包含的邪惡字元,例如\xFF

攻擊

要使這種攻擊起作用,您需要一個有效的密文 $ c $ ,不需要知道正確的明文值 $ m $ .

我們將開始逐塊、逐字節地解密。我們從第一個塊開始,它是最後一個字節。

讓我們取前兩個密文塊 $ c_0c_1 $ ,並將它們發送到預言機。自從 $ c_0 $ 只是 IV,oracle 獲得了純文字的第一個塊(16 個字節)。現在,這取決於值,但填充很可能是錯誤的,所以你會得到一個填充錯誤。

現在通過 XORing 值 $ j $ 從你\x00\xFF最後一個字節 $ c_0c_1 $ 塊,您將獲得總共 256 個不同的結果。這些結果,我們稱之為 $ \tilde{C}_j $ , 用所有可能值中的最後一個字節組成密文,雖然\x00\xFF隨機分佈的。將它們全部發送到預言機將產生 16 個 $ O(\tilde{C}_j) < 2 $ . 這意味著,最後一個字節解密為有效字節,如\x01 through \x10. 在這 16 個值中 $ j $ ,一個必須對應明文字節\x10。按位比較將幫助您注意到,它們都具有相同的第五位(從右數,最右邊是 1),除了一位。異常結果對應於0x10。讓我們記住這個 $ j $ -值作為 $ s $ .

無論價值 $ s $ 有,我們可以用 XOR 它\x11,然後得到純文字\x01。我們現在有一個帶有有效\x01填充的塊。(哦,順便說一句。 $ s \oplus j $ 是最後一個純文字字節 $ c_1 $ )

現在我們有了一個帶有有效 \x01 填充的塊,我們還有 15 個字節要查找。我們知道,只要我們\xFF在純文字中有一個無效字節,Web 應用程序就會停止並說出來。所以現在,我們可以遍歷每個字節並找到如下純文字:

讓 $ c $ 成為目前塊並且 $ p $ 純文字

結果 $ i $ 從 1 到 8(塊中的每個字節):

$ \quad $ 為了 $ j $ 從 0 到 255(所有 ascii 值):

$ \quad $ $ \quad $ $ \hat{c}_{i,j} = c_0c_1…(c_i \oplus j)…c_n $

$ \quad $ $ \quad $ 如果 $ O(\hat{c}_{i,j}) == 1 $ :

$ \quad $ $ \quad $ $ \quad $ $ p_i = j \oplus 0xFF $

對塊對重複此過程 $ c_1c_2 $ , $ c_2c_3 $ , …

免責聲明

這是一個簡化的例子,我試圖強調所有的簡化。我絕不是加密專家,我的知識有限。如果您發現任何未提及的簡化或明顯錯誤,請發表評論/編輯 :) 我強烈建議您閱讀此部落格中對 XML 加密填充 oracle 的良好解釋。關於攻擊的論文也很不錯:Breaking XML Encryption

TODO:這篇文章沒有很好地解釋為什麼 CBC 方案具有延展性,我不介意是否有一個好的圖表可以包含在內。

所有詳細資訊均已在 2011 年 IEEE 安全和隱私研討會的論文中發表:Web 中的密碼學:ASP.NET 中的密碼學設計缺陷案例

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