徹底破解加密PDF文件

 
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 算法37 驗證主口令
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文件中的公鑰加密(證書加密)和簽名,感興趣的朋友可以繼續關注。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章