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:
http://www.rsasecurity.com/rsalabs/node.asp?id=2250
AES:
http://www.reference.com/browse/wiki/Advanced_Encryption_Standard
http://www.cisco.com/univercd/cc/td/doc/product/software/ios122/122newft/122t/122t13/ft_aes.htm

PDF加密、解密内幕(一) PDF加密字典对象分析相关推荐

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

    PDF加密.解密内幕(一) - PDF加密字典对象分析 0 几个关键词的说明 PDF加密有两个口令即:Owner(to set the pdf document Permission or chang ...

  2. php自写代码加密,加密解密:教你加密自己写的VBS代码

    今天在删自己的黑历史时,突然发现了几个VBS文件..发现了以前写的vbs代码加密器. [mb_view]手机上就别玩了 至于为什么你懂的[/mb_view] 首先,我们都知道,VBS代码可以直接被看到 ...

  3. AES加密解密SHA1、SHA加密MD5加密

    AES加密解密 SHA1.SHA加密 MD5加密 二话不说马上附上代码: package com.luo.util; import java.io.UnsupportedEncodingExcepti ...

  4. c语言解密pdf,C语言设计-英文加密解密系统资料.pdf

    昆明理工大学 <程序设计基础>课程 综合设计实践教学课题报告 课程名称: C 语言设计 课题名称: 英文加密解密系统 组长: 学号 姓名 组员: 学号 姓名: 学号 姓名 学院: 专业班级 ...

  5. python 加密解密_python实现AES加密解密

    本文实例为大家分享了python实现AES加密解密的具体代码,供大家参考,具体内容如下 (1)对于AES加密解密相关知识 (2)实现的功能就是输入0-16个字符,然后经过AES的加密解密最后可以得到原 ...

  6. 【加密解密】单表加密(Javascript实现)

    2019独角兽企业重金招聘Python工程师标准>>> ■单表加密(monoalphabetic) 替换加密是密码学中按规律将文字加密的一种方式.替换加密中可以用不同字母数为一单元, ...

  7. 【C 语言】文件操作 ( 文件加密解密 | 使用第三方 DES 加密解密库 | 头文件导入 | 兼容 C++ 语言 | 加密解密函数说明 )

    文章目录 一.导入第三方库头文件 二.头文件说明 1.兼容 C++ 语言 2.头文件导入限制 3.加密解密函数说明 一.导入第三方库头文件 对文件进行加密 , 将文件中的数据分成若干块 , 一块一块的 ...

  8. java加密解密代码_base64位加密解密原理及js代码实现

    base64位加密解密原理及js代码实现 在网上找了很多关于Base64加密解密的原理以一个比较通俗易懂的方式理解整理了一下大致原理如下 先上base64对照表 #加密 #1:将明文对照以acsii码 ...

  9. java中完成md5加密解密_java实现md5加密解密 notNET中加密和解密的实现方法

    java实现md5加密解密 notNET中加密和解密的实现方法 亦或是旅途风光 7-14 1918℃ 22 [ ee21.cn - ASP.NET ] .NET将原来独立的API和SDK合并到一个框架 ...

最新文章

  1. 一种基于FPGA硬件求解对数的简化方法
  2. 洛谷:P1901 发射站
  3. 信仰的力量—海归毕业季的选择与入职后的蜕变记
  4. Windows 目录结构,服务以及端口, DOS常用命令学习
  5. 搞嵌入式Linux,做底层还是应用?底层要掌握哪些技能?
  6. 在Jersey 2中进行集成测试自定义验证约束
  7. 动态分区分配的“首次适应算法_动态图划分复制算法:Leopard
  8. 用vs2003调试asp的方法和体会
  9. Spark shuffle:hash和sort性能对比
  10. 我的世界java手机版怎么调按键_博阅Likebook P6高配青春版使用评测
  11. Java字符串分割(split)
  12. 〖Linux〗使用ssh登录远程主机,并在本地打开远程图形界面
  13. 【原创】开源Math.NET基础数学类库使用(04)C#解析Matrix Marke数据格式
  14. 使用EF框架的增删改查和分页的公共类
  15. zabbix3.4+grafana5.0.1数据可视化
  16. matlab求hurst,请问如何用MATLAB计算大盘的HURST
  17. C语言/C++常见习题问答集锦(六十四) 之兔子繁殖(递归与非递归)
  18. 【BDTC 2016】蚂蚁金服人工智能部技术总监李小龙:人工智能驱动金融生活
  19. 天才小毒妃 第914章 无论如何要带她走
  20. 大脑分区与功能简介汇总

热门文章

  1. 设备树之HDMI输出实例
  2. 通过tushare的股票数据绘制股票各曲线图——日K线
  3. 大智慧交易系统测试软件,均线交易系统测试
  4. 原核微生物基因组和宏基因组的基因预测软件——Prodigal的下载安装
  5. 解决:tomcat6 多个web项目页面出现 多次重定向错误无法访问的问题
  6. 常见密码学(积累与特征)坚持更新
  7. cmpp发送超长短信息1
  8. 离心泵水力设计——叶轮设计——5 进口边
  9. 大一新生的C语言选择题程序的尝试与苦难个人分析
  10. js json对象转数组获取key与长度