PDF文件加密仿真

PDF文件加密仿真

前言:

通過上一篇文章的閱讀,想必大家對基本的PDF文件的格式有所瞭解。其實對PDF具體格式的學習,不光可以幫助我們理解這種格式本身,同時你也會受到它的啓發定義一種自己的文件格式,比如說一種簡單的類似PDF格式,來滿足你對某些項目的需求。

本文就是先仿照PDF(也有借鑑XML加密方式)自定義一種非常簡單的文件格式來說明PDF文件的加密方式和過程。

1 幾個基本概念

我們學習和討論PDF文件的加密原理和過程不需要討論具體的加密算法實現本身,因爲所有流行的加密算法早就有所實現,我們需要做的就是直接加以利用。何況介紹和討論加密算法篇幅巨大,也不應該包含在這短文之中。但是我想下面的幾個概念大家都應該明白:

   (下面所有內容包括圖例都不是嚴格的定義,基本上是我本人的理解,如果要知道確切的定義請自己查詢相關網站。)

 

 

 

 

 

1.1 對稱加密方法

       對稱加密方法指的是加密和解密使用同一密鑰的方法。PDF文件內容的加密採用RC4AES的方法。(關於RC4算法和AES算法請自己搜索相關網站)

 

 

 

 

 

例如下面是對稱加密的兩種簡單實現:

1

1.2 非對稱加密方法

       非對稱加密有一對密鑰(KEY1, KEY2),加解密需要用不同的密鑰,加密的密鑰用KEY1,那麼解密的密鑰就用KEY2;如果加密的密鑰用KEY2,那麼解密的密鑰就用KEY1。但是一般的使用上來說,這一對密鑰中一個稱爲公鑰,作爲公開密鑰,另外一個稱爲私有密鑰,用來解密。

   

2

1.3 散列(hash)

   流行的算法有MD5SHA1,就是不同的任何兩組內容通過一組運算得到的結果也不同,我們稱爲hash數,或者可以叫做數字指紋。

   比如我們常常將系統的登錄口令通過MD5運算後存放在口令表裏,登錄的時候就將用戶輸入的口令通過MD5運算後和口令表中的相關項對比,如相同就通過認證,否則口令錯誤。

3

2 PDF文件加密的仿真

在討論真正的PDF文件加密之前先設計一個自己的文件格式,文件格式只包含文本,主要是讓大家明白加解密的過程而簡化一些次要的屬性。 下文中把這種格式的文件稱爲ZONYPDF,我們把這種稱爲ZONYPDF的文件格式比作PDF文件格式。

同時假定有一個ZONYPDF reader是作爲ZONYPDF文件閱讀器來對應於adobePDF reader

要模擬PDF的加密及解密,這個格式的文件必須滿足下面的條件:

²        必須能夠判斷一個文件是否被加密。

²        輸入一個口令以後必須能驗證其正確與否。

²        輸入的口令能夠產生加密文件內容的KEY,從而解密整個文件。

 

 

 

 

 

2.1 定義自己的一個文件格式

文件頭%ZONYPDF-1.0;文件體包含在bodyendbody之間,文件體包含三個屬性,一是文本的長度/length,二是文件的打開密鑰/userpassword,包含在(和)之間,三是文本本身/content, 也包含在()之間。下面是按照我們的定義的一個最簡單的未加密的ZONYPDF文件。

 

 

 

 

 

ZONYPDF-1.0

Body

/length 11

/userpassword ()

/content (Hello world)

endbody

%%EOF

 

 

 

 

 

2.2 將一個自定義的文件加密

我們規定加密的時候只加密數據而不加密其他的符號(事實上PDF也是這麼做的)。對於文本的加密採用稱爲XC1XC1是爲了說明而虛構的一種對稱加密算法)的對稱加密算法,通過XC1加密的文本的長度和明文的長度一樣。

然後加密完文件內容就將加密口令password進行MD5運算後放入/userpassword後的括號內。

用戶加密的密鑰爲123, 加密後就有下面的文件

 

 

 

 

 

ZONYPDF-1.0

Body

/length 11

/userpassword (#¥%&…)

/content (#¥%&^=+-!@)

endbody

%%EOF

 

 

 

 

 

    當然PDF文件的加密不是直接把用戶輸入的口令作爲加密PDF文件內容的KEY的,而是要通過一定的變換與運算的, 關於如何運算得到這個加密的KEY會在下一次詳細說明。同時保存在口令字典裏的口令hash也不僅僅是一次MD5運算,會有更多的迭代運算。

 

 

 

 

 

2.3 將加密的文件解密

   首先我們的ZONYPDF reader看到/userpassword後面的長度不爲0,就要求用戶輸入口令,輸入口令password1,然後ZONYPDF reader做一次MD5運算然後和/userpassword後的括號裏的內容去比對,如果一樣那麼就說明是正確的口令,則對內容進行解密然後顯示。在本例中如果password1123那麼就通過驗證並順利解密。

 

 

 

 

 

2.4 將文件加上權限控制

   那麼PDF格式中的權限控制是如何實現的呢?

   ZONYPDF reader加上一個打印的功能,那麼相應地,給ZONYPDF格式中的body部分加上一個打印允許口令/permpassowrd

   如果打印允許口令/permpassowrd爲空則沒有打印限制,如果不爲空則有打印限制,在打印前需驗證口令。口令的生成和打開口令的生成方法一樣,由輸入口令通過MD5運算放入/permpassword 後的括號內。

  

   那麼上面的例子文件就變成。

ZONYPDF-1.0

Body

/length 11

/userpassword ()

/permpassword ()

/content (Hello world)

endbody

%%EOF

 

 

 

 

 

設置打印權限以後爲:

ZONYPDF-1.0

Body

/length 11

/userpassword ()

/permpassword (%+◎#!…)

/content (Hello world)

endbody

%%EOF

可以看到通過權限設置文件的內容是沒有經過加密的,如果是本文中的ZONYPDF

格式的話,直接把/permpassword後的內容直接除去就失去了對打印的控制了。而且如果另外一個人也開發了一個ZONYPDF文件閱覽器ZONYPDF reader1, 如果它在打開的時候完全忽略權限控制這一屬性,那麼對它來說任何的限制都是沒有用的,因爲內容本身是沒有加密的。

對於PDF的權限設置其實也是類似的,設置打開口令時纔對文件的內容進行加密,而只進行PDF權限設置是相對比較容易去除的,雖然不像我們前面定義的ZONYPDF直接去處/permpassword即可,因爲正如上一篇文章所述,PDF有交叉表引用表,如果你刪除了一個條目那麼就會對交叉引用表中的地址產生影響,從而導致PDF文件結構被破壞並不可用。這也是網上的一些PDF破解程序只能去掉權限控制口令而不能去掉打開口令的緣故。

  對於權限控制這一塊,ADOBE公司的相關的文檔裏也清楚地說明了,如果第三方的PDF閱讀器是完全遵循PDF規範的,那麼應該判斷PDF文件的權限控制這個屬性。當然如果第三方的閱讀器不尊重所有的PDF規範,那麼它是完全可以忽略掉這個權限控制而直接打開的。

因此說PDF的權限設置嚴格意義上來說是不安全的。

注意:其實加了權限的PDF文件,內容也是加密的,只不過它的加密密鑰可以通過文件本身包含的加密字典對象計算得到。因此對一般用戶來說它是不加密的。但是你要編程實現從其中抽取內容,那麼必須計算得到密鑰然後解密以後得到對應的流。

 

 

 

2.5 ZONYPDF文件加密和解密的圖例:

 

 

 

 

 

加密:

4

 

 

 

 

 

 

 

 

 

 

解密:

5

3 總結

        通過對一個最小規模的自定義文件加密過程的分析,可以明白PDF文件加密大體過程,之所以給出這個自定義文件格式的加密過程,爲的是讓大家明白其實所有文件格式的加密方式都是有相通之處的,那就是用對稱加密來加密文件內容,用hash數來保存加密文件內容的key.

       如果你只要明白PDF文件的大體流程,那麼這則短文對你的理解應該就可可以了,如果你需要了解PDF文件加密過程的細節, 比如說你要具體實現自己對PDF的加密或者是解密,那麼希望你能去看PDF Reference1.6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章