PDF加密、解密內幕(三)-破解加密PDF檔案
1 一般的口令驗證
我想很多人在學習某個技術或者其它之前總會想想如果換作自己來設計會怎麼辦,比如說PDF檔案的解密,我就會想,檔案內容是經過加密的,那麼必須要有一個密鑰才能解密檔案的內容。而這一定和要求輸入的口令是有關。那麼這之間有什麼關係呢?當然有很多種可能,在很久以前,一些系統竟然在後台用明文儲存使用者口令和口令,這樣使用者在登入系統的時候就直接比較使用者名稱密碼是否一致,當然這些使用者名稱和密碼全部掌握在管理員的手中;到我們比較注重系統安全的時候,用口令通過HASH函數產生HASH序列儲存在資料庫裡,這樣就比較安全,因為HASH函數是單向的,沒有輸入的口令的話只有用暴力破解的方法了。如果你的口令設定的比較簡單也是很容易被破解的。因此現在一些對安全性比較高的網站都會要求你不要將口令設定的過於簡單。 那麼解密PDF的時候口令是如何來驗證的呢? 是不是由我們的口令產生的HASH序列儲存在PDF檔案裡,然後在開啟的時候由你輸入的口令再產生一個HASH序列,兩者比對,同則由你輸入的口令會同PDF檔案中的其它內容產生密鑰,然後解密?這隻是我們的設想,那麼PDF檔案解密是不是真的這樣做的呢?圖1 假想的PDF解密下面我們來尋找問題的答案。
2 PDF檔案口令驗證
在上幾篇文章中我們也知道了PDF有兩組口令,一為Owner Password, 另外一組稱為User Password,因為Owner Password是用來控制許可權的,在文章中我們把它稱為許可權口令;而User Password是用來開啟檔案的,稱為開啟口令。如果一個檔案同時設定了開啟口令和許可權口令,那麼在開啟PDF檔案的時候只要輸入任何一個口令就可以開啟該加密的PDF檔案了。而當我們輸入口令的時候,一般處理PDF的軟體會先判斷是否許可權口令,如果是,那麼開放所有的操作許可權,使用者就可以沒有任何限制地使用該PDF檔案;如果不是許可權口令,那麼會判斷輸入的口令是否為開啟口令,如果驗證成功,那麼PDF檔案就解密,就可以看到檔案的內容,但是此時檔案的其它操作是受限制的。演算法3.6和演算法3.7分別描述了對使用者口令和許可權口令的驗證。如果你尚未讀過前一篇文章,那麼如果你感興趣的話可以去看一看,然後再回過來看本文。
2.1演算法 3.6 驗證使用者口令1利用使用者提供的口令執行演算法3.4(R2)或演算法3.5(R3或更高)。2 如果步驟1的輸出和PDF檔案中加密字典中的U值一致(R2),或者前16位一致(R3或更高),因為版本3或更高的情況後十六位是任意補足的。那麼該輸入的使用者口令正確,並且可以按照演算法3.1對檔案內容進行解密。
2.2 演算法3.7 驗證主口令1. 根據演算法3.3的1到4步,由提供的口令串計算得到一個密鑰。2. (僅版本2)用步驟1得到的密鑰解密加密字典中的O條目值。((版本3或更高)做20次:用前一次的輸出作為下一次的輸入進行解密;密鑰是由第1步產生的原始密鑰的單個位元組依次和迴圈數和進行XOR(異或)運算得到的(迴圈數從19到0)。下面為該過程的偽碼: Test[32] = 加密字典對象中條目O的32位字串值;temKey = Test[32];keyLength = length/8;for (i = 19; i >= 0; --i) { for (j = 0; j < keyLength; ++j) { tmpKey[j] = fileKey[j] ^ i; } rc4InitKey(tmpKey, keyLength, fState); fx = fy = 0; for (j = 0; j < 32; ++j) { test[j] = rc4DecryptByte(fState, &fx, &fy, test[j]); }}3 步驟2產生的結果假定為開啟口令(user password),用演算法6來驗證該使用者口令。如果正確,那麼提供的口令就為許可權口令(owner password)。
3 可能的破解方法
對加密的PDF檔案進行破解我想是很多人最感興趣的,那麼在此也來討論一下對口令加密的PDF檔案是否可以被破解?有那些方法可以來破解口令加密的PDF檔案? 對於第一個問題的答案是顯而易見的,沒有那種加密方法是絕對安全的,絕對不能被破解的,我們很多時候所說的不能破解是指破解的時間相當長,長到對你破解的內容沒有意義的時候。下面我們來看看有哪幾種常規的破解加密PDF檔案的方法。
3.1 常規暴力破解這是對任何需要口令驗證或解密的系統或加密檔案都有效方法,這個方法最簡單,就是通過窮舉計算HASH序列來比對。當該口令或密碼設定的非常簡單的時候,該方法是有非常有效。破解過程按照演算法3.6和演算法3.7來驗證開啟口令和許可權口令。
3.2 口令表口令表主要是在暴力破解的基礎上改進的,主要是應為一些人設定口令的時候用了一些比較容易記憶的內容,比如電話號碼,比如生日,比如電子郵件等。因此說建立一些常見的口令表或者一些規則,那麼匹配的速度就可能會更快。破解過程同樣要按照演算法3.6和演算法3.7來驗證開啟口令和許可權口令。
3.3 知道部分內容的解密對於那些是由機器隨機產生,複雜,很長的口令(最長可達32位元組),那麼就不太有可能通過上述兩種方法來進行破解。或者說破解的代價相當巨大,依照現在的電腦可能要算成千上萬年。如果你知道檔案的部分內容,那麼你通過猜測檔案的密鑰。比如說你知道檔案的標題是”abc”, 那麼你可以通過你猜測的加密金鑰來對該明文標題”abc”來進行加密,然後比對該密文和PDF檔案中的密文是否一致,如果一致,那麼這就是密鑰,從而不需要經過常規的驗證許可權口令和開啟口令就可以對檔案進行解密。 圖2 知道部分明文的破解 在這種情況下,如果密鑰長度比較短的的話,那將很容易破解該檔案。
3.4 PDF密碼編譯演算法的改進PDF中內容的密碼編譯演算法從PDF1.6開始支援AES密碼編譯演算法,塊大小為16位元組的CBC模式,這種演算法的特點是產生一個隨機字串作為初始加密向量,後面的內容的加密都要和這個初時向量有關,因此說你即使知道了檔案的部分內容,也不能通過方法3來破解PDF檔案密鑰了。
3.5 對於只有許可權口令的PDF檔案解密
只設定了許可權口令的PDF檔案的內容也是加密的,只是這個時候加密的密鑰是可以通過加密字典來計算得到的,因此說解密的時候並不需要你輸入任何密碼。具體的密碼產生過程見上一篇文章。
4 小結本文詳細地介紹了驗證PDF口令的過程,同時也簡單地介紹破解加密PDF檔案可能的方法,當然討論破解方法的目的並不是希望你去做一個軟體,通過你的軟體去非法破解一些加密了的PDF檔案。只是希望能夠使你瞭解整個PDF檔案的解密過程。同時通過對PDF檔案解密過程的介紹,也可以舉一反三地掌握一些其它格式檔案加密的大概過程和方法。當然如果你真的做了一個軟體可以去掉開啟口令的話,那麼你也許可以幫幫類似於”浩然可見”等朋友,忘記了自己設定的口令而打不開PDF檔案。接下去的文章我想和大家一起討論的PDF檔案中的公開金鑰加密(認證加密)和簽名,感興趣的朋友可以繼續關注。