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 算法3.7 验证主口令
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 文件中的公钥加密(证书加密)和签名,感兴趣的朋友可以继续关注。
彻底破解加密PDF文件相关推荐
- 破解加密PDF文件pdfcrack
破解加密PDF文件pdfcrack PDF是常见的文档格式.它允许用户设置双重密码来保护文档.第一重是用户密码(user password),当打开PDF文档,输入该密码.第二重是所有者密码(ower ...
- 520晚上,我用python破解了前女友发来的加密pdf文件,结果却发现...
前言 事情是这样的 520晚上,正跟队友 啪啪啪 组团开黑 突然,微信上前女友的头像跳动了起来 快一年了,难道是想要复合? 发来的竟是一个 " 520快乐.pdf " 的加密文件 ...
- 计算机加密解除,pdf文件加密怎么解除?解除加密pdf文件的教程
原标题:pdf文件加密怎么解除?解除加密pdf文件的教程 pdf文件被加密了之后怎么解除呢?很多人为了让文件更加安全,都会给一些重要的文件加密.但是,文件如果是带有密码的话,进行转换.合并或编辑等操作 ...
- 使用PDFbox加密pdf文件
pdf 文件加密解密,并转换成byte[]类型传输 使用PDFbox加密pdf文件的方法 总结 参考链接 使用PDFbox加密pdf文件的方法 1.引入依赖 <!-- pdfBox加密 --&g ...
- 4种方法加密PDF文件
PDF文件加密可以保护文件内容,今天讲PDF文件加密的4种方法: 方法一:打开密码 这个是PDF文件自带加密方式之一,设置了打开密码,则需要输入正确的密码才能够打开查看并编辑PDF文件.设置方法需要打 ...
- Python:使用pypdf2合并、分割、加密pdf文件。
朋友需要对一个pdf文件进行分割,在网上查了查发现这个pypdf2可以完成这些操作,所以就研究了下这个库,并做一些记录.首先pypdf2是python3版本的,在之前的2版本有一个对应pypdf库. ...
- Win7下提取加密PDF文件(pdf加密成exe)
这种方法是在有阅读密码的情况下,提取pdf文件的!!! 所以该方法仅适合有阅读密码,但是想得到pdf源文件分享给朋友的人,这就达到了从一人受益到众人受益的目的了!!! 起因:在某论坛下载了一本期待已久 ...
- C#使用iTextSharp给PDF文件添加水印,PDF文件加密,PDF文件旋转
//添加水印public void AddWaterMark(string filePath, string text){iTextSharp.text.pdf.PdfReader pdfReader ...
- php图片生成加密pdf文件,php生成PDF格式文件并且加密
本文给大家介绍的是如何使用php生成pdf文件,并且把该文件加密或设置访问密码的方法,有需要的小伙伴可以参考下. 项目需求:php生成pdf文件,,并且把该文件加密或设置访问密码 开源的TCPDF是基 ...
最新文章
- PAT A1098 堆排序
- var s=+newDate();
- Kotlin难点解析:extension和this指针
- unlegal android,百度地图定位 Cordova 插件 cordova-plugin-baidumaplocation
- json返回值为null显示key值的设置
- 在python中使用什么工具管理模块_怎么使用Python pip(管理模块工具)
- ubuntu12.04 安装 setuptools
- 三星 smarttv android,三星SmartView
- 推荐一款windows下好用的文件夹加密、文件加密软件(含使用说明)
- 纯前端实现—按钮操作字体放大缩小
- octobercms mysql_在Ubuntu 18.04/Debian 9上安装October CMS
- P1538 迎春舞会之数字舞蹈
- BPEL与XPDL的定位区别
- 旅行青蛙服务器维护时间,旅行青蛙小青蛙多久出门一次?要什么时候才会出门...
- 晒一晒程序员桌面,你惊呆了没?
- Mac Office Word设置多级标题
- 【总结】举例说明数据库自增字段的 3 种实现方式
- Git下载和安装步骤
- JavaEE12_EL和JSTL
- Android 微信支付调不起
热门文章
- 大数据管理与应用专业总结笔记
- C语言编程>第十周 ⑦ 请编写函数fun,该函数的功能是:统计一行字符串中单词的个数,作为函数值返回。一行字符串在主函数中输入,规定所有单词由小写字母组成,单词之间由若干个空格隔开,一行……
- 网络安全-MS17-010漏洞-永恒之蓝
- 字体图标 fa fa html5,Font Awesome 4.2.0的所有图标参考
- 计算机毕业设计开题报告怎么写?【详细说明】
- From Word Embeddings To Document Distances论文总结
- linux下解压iso镜像文件方法
- 获取复选框的状态判断复选框是否选中状态
- 导出多个excel,打包成zip压缩包进行下载~~~~~~~~~
- 1066 Root of AVL Tree——PAT甲级 | 参考mooc实现完整代码