1. 程式人生 > >CTF-web Xman-2018 第二天 CBC加密簡單介紹

CTF-web Xman-2018 第二天 CBC加密簡單介紹

Padding oracle attack

這是一個分塊的加密演算法,當前塊的加密依靠前一個塊的加密結果,形式如下圖:

可以看出,為了滿足當前與前一塊的規則,它初始化了一個向量V,用於第一輪加密。

將分組的明文與上一組的密文進行計算得到該組的密文,繼續做下一組的【V向量】(V就是指初始給的,這裡這麼多就是形象一下)。

我們需要提醒的是,對於分組過程中會出現資料長度不足的情況,那麼我們為了補全,會進行如下的操作:

分組密碼Block Cipher需要在載入前確保每個每組的長度都是分組長度的整數倍。一般情況下,明文的最後一個分組很有可能會出現長度不足分組的長度:

這個時候,普遍的做法是在最後一個分組後填充一個固定的值,這個值的大小為填充的位元組總數。即假如最後還差3個字元,則填充0x03。

這種Padding原則遵循的是常見的PKCS#5標準。

 

那我們再看看解碼,根據加密我們可知,解碼就是反向的過程唄

第一組明文和V得到密文,然後密文作為第二組的V繼續計算

第一組密文等於第一組明文和V,那麼第一組明文就等於密文和V;第二組明文和第一組密文等於第二組密文,那麼第二組明文=第一組密文和第二組密文。簡單說就是根據第一個的密文解出來第一個明文,第一個密文還有用來解第二個密文,以此類推。

 

我們對其攻擊的過程是從第一分塊開始的,原理如下

函式(向量V⊕第一組明文 )= 第一組密文     函式(第一組密文⊕第二組明文)=第二組密文

函式(函式(向量V⊕第一組明文)⊕第二組明文)= 第二組密文

以此類推我們可以知道實際上這就是一個巢狀的過程,那麼實際上最後一組的輸出與前面所有的組和V的每一位都是對應的,因為它們的長度完全是一樣的。

那麼回想一下,我們已經知道最後一組的填充是有固定格式的

對於後面的補充位,必須為固定的格式,而且關鍵的是,如果你給了錯誤的V和密文,解碼出來的格式不對就會提醒你錯誤。關鍵的是,我們在實際情況中密文是可以獲得的。

那麼我們的思路就是在Padding Oracle Attack攻擊中,控制引數V+Cipher密文,我們要通過對V的"窮舉"來請求伺服器端對我們指定的Cipher密文進行解密,並對返回的結果進行判斷,原理就是解碼後的填充位元組錯誤。

回想我們之前說的這個Padding Oracle Attack攻擊的成立條件:

當然我們是不知道中間處理函式是怎樣的,但是伺服器知道的,我們只需要猜測V就可以,因為我們知道最後輸出的值是要滿足一定條件的,不同的V肯定會影響到最後的輸出,並且此時V值只有一種可能,那麼我們就強行猜解。(看圖,就可以明白)

(這裡是轉換的思想,我們雖然知道第一組的V,但是不知道中間的函式過程,轉變一下思想,根據塊分組規則推匯出函式中間值,有理論基礎的)

我們限分析一塊的情況下

我們從最後一位開始,當只有最後一位擴充時,解密結果滿足為0x01,我們測試0-255的所有可能字元,知道最後一塊的解密為0x01,那麼就不會提示錯誤了,對吧。測試V最後一個位元組為0x66時成功了,那麼我們根據流程可知中間值為V和解密的最後位元組的異或,即0x66異或0x01=0x67 即為中間值。

然後猜倒數第二位,此時假設兩位補充,即0x02 0x02 為了滿足這個要求,為了滿足假設最後一位中間值還是0x67,,我們對上一步V的最後一位更新為0x66 ^0x02=0x64。

爆破倒數第二位,得到0x70,在進行異或得到中間值的第二位0x70^0x02=0x72.

接下來,要繼續對IV進行假設,同理,這次"選擇密文攻擊"的假設是Padding 0x03,對IV進行迭代更新,然後對IV的倒數第三個位元組進行"窮舉"迴圈探測。

Padding 0x03

Padding 0x04

Padding 0x05

Padding 0x06

Padding 0x07

Padding 0x08

最後得到了所有的中間值,與真實的V進行異或得到真的明文值。

如果是多塊的話,我們將第一塊的密文作為第二塊的V,繼續推導即可。