PDF文档的加解密及数字签名技术(三)
读取加密的PDF文档
前文说过,加密的PDF文档,其中的字符串和流都是被加密的,要正确的解读这些信息,就要对其进行解密,解密就需要密钥,那么密钥怎么来呢?与加密时的情况稍稍不同,在加密字典中的O项和U项可以帮助我们计算密钥,所以下面我们讲解一下如何计算出解读加密PDF文档内容所需的密钥。
仅使用了权限口令加密的PDF文档
如果一个PDF文档加密时使用了用户口令(User Password),则在打开PDF文档时必须要输入口令才能计算出密钥,这就是为什么PDF阅读器在打开PDF文档时会弹出个对话框让你输入密码了。如何判断一个加密的PDF文档是否使用了用户口令呢?翻到PDF Reference 1.7的127页,算法3.6。
算法3.6
第一步,根据加密字典中R值的不同,使用算法3.4或者算法3.5用用户口令计算出U项。
第二步,将计算出的U项与加密字典中已有的U项做个比较,如果相同,则用户口令正确。
好,先用空口令尝试用算法3.6进行用户口令校验,如果通过,则说明该文档没有用户口令。没有用户口令的PDF文档,可以直接使用算法3.2计算出全局密钥,计算所需要的一切我们都可以在PDF文档中找到:O项、P项、是否加密Metadata。算出全局密钥再根据算法3.1计算出对象的加密密钥,按照加密字典中声明的加密算法(RC4或AES)进行解密操作就是了。需要一提的是,如果是AES算法,则密文前128位是解密所需的IV,其后才是真正的密文,做解密程序的同学们请注意到这点。
但是根据规范,不提供权限口令,则对该PDF的操作要符合加密字典中P项的限制,例如限制复制内容、限制打印等。不过前文说过了,不符合规范的PDF应用大把,毕竟内容已经完全解密了,怎么操作完全看应用了。最恶劣的当属各类PDF Password Remover之类的程序,会直接根据解密的内容重新生成一个未加密的PDF文档,将加密信息直接抛弃。
使用用户口令加密的PDF文档
如果前述的算法3.6对于空口令无法校验通过,则说明该PDF文档有用户口令,用算法3.2就不能直接计算出全局密钥。我们就需要提供一个口令供算法3.6做校验,校验通过就可以使用算法3.1计算出全局密钥从而解密文档了。
既使用了用户口令又使用权限口令的PDF文档
在实际中,如果一个PDF文档经算法3.6验证使用了用户口令,会弹出对话框要求用户输入口令。而在用户提供了口令后,PDF阅读器会优先判断该口令是否是权限口令,如果是,则解密文档并开放所有权限。如果不是权限口令,而是用户口令,则解密文档并按照权限设定限制用户操作。如何验证是否用户口令,并仅用用户口令计算出全局密钥前面已经讲过了,那么如何验证权限口令并计算出全局密钥呢?翻到PDF Reference 1.7的128页,算法3.7。
算法3.7
第一步,根据用算法3.3的第一到第四步计算出一个密钥。
第二步,如果加密字典R项为2,依据第一步计算出的密钥直接对O项使用RC4算法解密。如果加密字典R项为3或更高,则要做20次以下操作:将第一步得出的密钥,每位分别与循环计数器做异或(XOR)操作,然后对O项(第一次循环时)或者上次循环得出的结果用RC4算法进行解密。其实这就是算法3.3第六、七两步的逆过程。只不过这个循环计数器不同于算法3.3中的1至19,而是19至0。一直还原到算法3.3第五步,看我们把什么还原出来了?
第三步,第二步将会还原出用户口令,使用用户口令用算法3.6做校验,如果通过校验,则说明权限口令校验正确。
好,既然计算出了用户口令,根据算法3.1,就可以得出全局密钥从而解密文档了。
写在最后
自认为PDF使用标准口令加密、解密的全过程已经讲得很清楚了,其实也没什么更多要说的了。根据本文,大家应该已经了解了使用标准口令加密的PDF文档的安全性其实也就那样。虽然使用了用户口令的PDF较难破解,但是想把PDF给人看,就必须得告诉人家用户口令。口令如何分发,这在密码学上是老问题了,随着加密PDF一起发送,显然是愚不可及的办法,同学们千万不要干这种事情,稍好点的办法是邮件传送PDF,用电话告诉别人密码。但是我预计对方显然会把PDF文档保存后再在同一个目录创建一个文本文件,名字叫“PDF密码.txt”>_<。还有一点,如果用户密码设置得较为简单,很容易被专用的软件暴力破解。好,你跟我们说又不能存放在一起,又不能设得太简单,我们按照你说的做。但万一我们把这个十分复杂的用户口令忘了,却又没记下来,怎么办?那我告诉你,神仙也很难救你了。看,这些都是标准口令加密的弊端。
要使用较高安全级别的加密方法,一种是使用Acrobat的插件功能自定义加密方法,但是阅读这种PDF,需要额外安装插件。另一种是使用标准的数字证书加密的方式,它解决了密钥分发与保存的问题,以后我也许会专门写文,介绍这种加密方式。
PDF文档的加解密就介绍到这里,下篇文章我们将说说PDF文档的数字签名技术。