PDF加密、解密内幕(一)- (PDF加密字典对象分析)

PDF加密、解密内幕(一)

- PDF加密字典对象分析

0 几个关键词的说明
PDF加密有两个口令即:Owner(to set the pdf document Permission or change the permission) Password和User Password,在本文中翻译为主(权限)口令和用户口令,我觉得权限口令更好,因此就称作权限口令。
文件加密后会生成一个新的对象,encryption dictionaries Object,本文中以加密字典对象来说明。
其中加密字典对象中的项称为加密字典对象项。
另外文中能以中文来说明的尽量以中文来说明,如果一些关键的英文词没有很好的中文对应词我们还是保留原来的英文说法。
1 几个常见的PDF安全问题
最近经常有人问到几个问题,是关于PDF加解密的,如果你对PDF规范比较熟悉,那么有可能会觉得这这几个问题很简单甚至有些傻。但几乎每个人都会有这么一个阶段,总是从无知到有知,再到无知,…,一个个轮回。
在文章的最开始我把问题给提出来,然后作一个简单的回答,如果觉得这有助于你对PDF加解密的认识,那我会非常开心的
如果你需要对PDF加密解密有更深入地了解和学习,那么可以继续关注系列文章。当然这些文章的大部分内容你都可以从PDF规范里面找到,在这里,我只是以我个人的理解帮助大家可以更快地理解和应用。
 
²        问:PDF有那些加密算法?
PDF文件采用的加密算法目前在用的有两种,RC4和AES。
PDF的早期版本是通过RC4加密算法对内容进行加密的,加密的长度为(40-128位)而从PDF1.6起,引入了AES加密算法(128位),对应的阅读器有ACROBAT7.0 。因此说PDF中的加密算法是固定的,没有其他第三种加密算法。关于RC4和AES,你可以到相关网站找到答案,见参考资料。
 
²        问:为什么我的PDF已经设置了权限设置,并且屏蔽了打印,但是为什么别人可以很容易地破解?
答::打个不恰当的比方,这只是“防君子而非小人”。但是很多人都对PDF的权限设置产生误解。认为作了权限设置就已经对文件内容进行了加密而一定要输入口令,其实不然,典型的例子有:http://www.kenwong.cn/post/how-to-use-gmail-to-break-pdf-restrictions.html。GMAIL这样做确实是一个非常大的BUG,这是明显违反PDF规范的,在这一点上GMAIL做的太不严谨,幸好它能及时作修正。
PDF中的权限设置只是一串字符而已,用这些字符的某些位来表示PDF是否允许某个操作或者禁止某个操作,而只有权限口令没有打开口令的情况下文件虽然是加密了,但是可以通过加密字典对象和PDF生成加密密钥的规则来得到加密密钥(下一篇文章会详细解释),从而对文件内容进行解密,如果你解密后把它另存为一个新的文件,那么就可以修改或去除这个字符串和相关的信息,那么PDF文件权限就不受限制了。
如果是要确保文件内容加密,那只有设置打开口令。
 
²        问:为什么我设置了打开口令,还被别人破解?
答:如果你设置了打开口令,那么这个时候文件内容是加密的。要打开这类文件是必须要得到加密口令的,这个时候如果还被破解的话,那很有可能是因为你设置的打开口令太过于简单,长度比较小的缘故,这样的情况是可以通过穷举来破解的,当然也可以使用口令字典来破解。
那是通过怎样来破解的呢?
PDF文件加密的时候,你输入一个打开口令,比如说是123456, 其实不是直接由你输入的口令作为PDF加密内容的密钥的,还需要有一个转换过程才得到加密密钥。
而怎么才能判断你输入的口令是否正确呢?
那是因为在加密PDF文件的时候会在PDF文件中放入一个由打开口令运算得到的HASH序列,当你输入口令的时候就需要对你输入的口令作一系列的运算而得到另一个HASH序列,如果两个HASH序列一致,那么就可以根据这个HASH序列和你输入的口令生成解密密钥开始解密,否则提示口令错误。这在我的上一篇文章《PDF加密仿真》中可以得到答案。
 
²        问:什么是ACROBAT中自定义的Security Handler?
答:PDF允许自定义Security handler,如果大家访问过PDF电子书网站,那一定会明白这是怎么一回事。一般的PDF电子书网站都会要求你下载一个PLUGIN(acrobat 或adobe pdf reader的插件),在这个PLUGIN里就会用到自定义的Security Handler。
那这些新的PDF Security Handler是否使用了新的加密方法呢?当然不是,对PDF内容的加密还是使用RC4或AES,只是加密密钥的生成方法不同。
如果大家对这个感兴趣,我也将给大家作一个比较全面的介绍。
 
2 一个PDF文件加密
2.1 用ACROBAT7.0英文版给PDF文件口令加密的过程:
1)        打开PDF文件。
2)        选择菜单: File->Document Properties。
3)        选择Security选项卡。
4)        在 Security Method一栏中选择Password Security,点change Settings…按钮,如下图:
 
5)        出现下面加密项设置对话框:
 
 
 
6)        首先选择兼容性,共有acrobat3.0, acrobat5.0,acrobat6.0和acrobat7.0,默认为acrobat5.0,即被实现PDF1.4规范的软件支持。(本文我们就以此为例)
7)        分别设置打开口令和权限口令,注意两个口令不能一样,我们在这个例子里面将分别输入111111和222222,当然你在实际应用中必须使用复杂的口令。
8)        设置你准备给该PDF文档读者授予的操作权限。
9)        按OK按钮后确认打开口令和权限口令,按OK。
10)     文档被加密。
 
2.2 加密后PDF文件发生了什么变化?
  如果想知道PDF加密后发生了什么变化,那么最好的方法是找一个PDF文件,然后对它进行加密,保存后再用Ultra Edit打开,这样所有的变化都会一目了然。
       将我文章最后的PDF文件下载,如果你有ACROBAT的话,那么按照我上面的流程作一加密,加密保存后我们会发现文件发生了变化。
通过观察你会看到PDF文件尾部(trailer)发生了变化,加密前我们看到文件尾为:
trailer
<< /Size 16
/Root 1 0 R
/Info 2 0 R
/ID [<14147840093798E8EDC491FC1B2F19A7><14147840093798E8EDC491FC1B2F19A7>]
>> 
加密后文件尾变为:
trailer
<</Size 18
/Prev 10226
/Root 6 0 R
/Encrypt 5 0 R
/Info 3 0 R
/ID[<14147840093798E8EDC491FC1B2F19A7><3F95D9F08175974E8A55871FCBB2F983>]>>
明显地,红色部分是加密后增加的,说明加密字典对象的对象号为5.
我们可以很容易找到以下的加密字典对象:
5 0 obj
<</Length 128
/Filter/Standard
/O(_憘颖祳>S8+E𪾣櫁-zE{/r脮<渗?
/P -3392
/R 3
/U(v旐厺竌踜鎒h聨                )
/V 2>>
endobj
其实这些加密字典对象项都是通过我们图形界面输入项生成的,那么这些项都表达什么意思呢?
 
下面的内容我们可以从PDF规范1.6中找到:
/Length 密钥的长度
/Filter 生成密钥的方法,就是前面说的security handler
/O 是由用户口令和权限口令得到的,用来生成密钥和验证输入的权限口令
/P 访问权限的标志
/R 标准加密的(standard security handler)的版本
/U由用户口令生成,用来验证输入的用户口令或权限口令,是否要提醒用户输入密码
/V  可选,用来指明加密的算法。
 
当然加密字典还可能包含有其它项,但是这里我不打算介绍每项可能的值和对应的意思,因为这不是PDF规范的中文翻译,而是希望通过一系列的文章让读者能对PDF规范有个更好更快速地了解。
接下来我们结合实际的例子来说明各个加密字典对象项表达的意思。
 
/Length 128 
%密钥的长度为128位
/Filter/Standard 
%内建的标准加密引擎standard security handler,对应的操作是口令加密的第4步,即选择Password Security
/O(_憘颖祳>S8+E𪾣櫁-zE{/r脮<渗?
%由用户口令,权限口令,和文档ID生成的
/P -3392 
%权限标志见PDF规范
/R 3
%加密版本3,如果V为2或3, 那么就属于“版本3或更高”的范畴,在下一篇文章中我们要用到这个概念
/U(v旐厺竌踜鎒h聨                )
%由用户口令得到,用来验证用户口令
/V 2  
%允许加密长度超过40位,在上述这个例子里例子里密钥为128位
 
3 实现PDF加密需要回答的三个问题
加密字典对象是通过我们对加密的方式的选择和输入的口令生成的,那每项的内容对PDF文件的加密和解密都是有关系的,接下来我们最关心的问题是如何来实现对一个PDF文件的加密?这个问题可以分解为四个小的问题:
 
1.         文件的内容是如何被加密的?
2.         加密密钥是如何生成的?
3.         上面的加密字典中的每一项是如何生成的?
4.         加密字典和加密密钥的关系?
 
接下来的文章我将告诉你所有的这几个问题的答案。当然如果你要真正地写一个实现PDF口令加密的程序,那么还得参考PDF规范1.6。但是你觉得阅读起来有困惑的地方,那么我想下篇文章对你来说也会有帮助的,也会详细地告诉你如何通过编程来实现PDF文件的口令加密。
 
 
参考资料
RC4:
AES:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章