padding oracle attack相關之CBC模式

flurry_rain發表於2017-10-12

前段時間遇到一個挺有意思是的題目,用到了padding oracle attack的相關知識,於是惡補了一下padding oracle attack相關內容,本著取之於民用之於民同時也可以方便自己以後複習的心態,我決定整理一下這幾天的所學所得,也算是留下點什麼hhh。
先碼一下原題吧:

In thisassignment, you must decrypt a challenge ciphertext generated using AES inCBC-mode with PKCS #5 padding. (Note: technically this is PKCS #7 padding,since the block size of AES is 16 bytes. But the padding is done in exactly thesame way as PKCS #5 padding.) To do so, you will be given access to a server thatwill decrypt any ciphertexts you send it (using the same key that was used togenerate the challenge ciphertext)...but that will only tell you whether or notdecryption results in an error!


大概要求就是,給你一串CBC模式下使用AES演算法加密的密文(密文按照PKCS #5標準填充)以及一個可以解密傳送的任何密文的伺服器(使用的金鑰與生成密文的金鑰相同)並且這個伺服器會告訴我們密文解密是否錯誤,嘗試解密得到明文(明文編碼對應的ascii字元可以組成有意義的資訊)。原題題目還提示我們使用padding oracle attack來進行解密工作,因此理解padding oracle attack的工作原理是解決這個問題的關鍵。

在說padding oracle attack之前,先簡單介紹一下CBC模式以及PKCS #5的相關知識。

首先是CBC模式:CBC模式是一種分組連結模式,目的是為了使原本獨立的分組密碼加密過程形成迭代,使每次加密的結果影響到下一次加密。這可以強化加密演算法的”敏感性”,即實現所謂的”雪崩效應”,在香濃理論中這就是”擾亂原則”。加密過程直接看下圖:

解密過程就是加密過程的逆過程,如下圖:

採用不同的加密演算法,密文塊(Block Cipher)的長度會不一樣,具體看分組密碼演算法的要求,以AES演算法為例,每個分組的長度為16位元組。CBC模式下的AES加密過程簡單說就是提交一個IV值(長度為16位元組)和金鑰key,將待加密的內容每十六位元組分為一塊劃分為n塊,然後第一塊與IV值異或,第二塊和第一塊異或...第n塊和第n-1塊異或,將異或得到的值作為明文輸入,用AES演算法進行加密,金鑰都是key,這樣就可以得到密文了。

解密過程是加密過程的逆過程,還是接著上面的例子,以AES演算法為例,將密文每十六位元組一組劃分開,然後用AES演算法進行解密,解密後得到中間值(Intermediary Value

),第一塊中間值與加密時提交的IV值異或,第二塊中間值與第一塊密文異或...第n塊中間值與第n-1塊密文異或,異或得到的結果便是明文。

相關文章