PDF加密、解密内幕(三) -破解加密PDF文件

PDF加密、解密内幕(三)
-破解加密PDF文件
   
一般的口令验证
我想很多人在学习某个技术或者其它之前总会想想如果换作自己来设计会怎么办,比如说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或更高)。
如果步骤1的输出和PDF文件中加密字典中的U值一致(R2),或者前16位一致(R3或更高),因为版本3或更高的情况后十六位是任意补足的。那么该输入的用户口令正确,并且可以按照算法3.1对文件内容进行解密。
 
2.2 算法3验证主口令
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]);
 }
}
步骤2产生的结果假定为打开口令(user password),用算法6来验证该用户口令。如果正确,那么提供的口令就为权限口令(owner password)。
 
 
可能的破解方法
对加密的 PDF 文件进行破解我想是很多人最感兴趣的,那么在此也来讨论一下对口令加密的 PDF 文件是否可以被破解?有那些方法可以来破解口令加密的 PDF 文件?
        对于第一个问题的答案是显而易见的,没有那种加密方法是绝对安全的,绝对不能被破解的,我们很多时候所说的不能破解是指破解的时间相当长,长到对你破解的内容没有意义的时候。下面我们来看看有哪几种常规的破解加密 PDF 文件的方法。
3.1 常规暴力破解
这是对任何需要口令验证或解密的系统或加密文件都有效的方法,这个方法最简单,就是通过穷举计算 HASH 序列来比对。当该口令或密码设置的非常简单的时候,该方法是有非常有效的。
破解过程按照算法 3.6 和算法 3.7 来验证打开口令和权限口令。
 
3.2 口令表
口令表主要是在暴力破解的基础上改进的,主要是应为一些人设置口令的时候用了一些比较容易记忆的内容,比如电话号码,比如生日,比如电子邮件等。因此说建立一些常见的口令表或者一些规则,那么匹配的速度就可能会更快。
破解过程同样要按照算法 3.6 和算法 3.7 来验证打开口令和权限口令。
 
 
3.3 知道部分内容的解密
对于那些是由机器随机生成,复杂,很长的口令(最长可达 32 字节),那么就不太有可能通过上述两种方法来进行破解。或者说破解的代价相当巨大,依照现在的计算机可能要算成千上万年。
如果你知道文件的部分内容,那么你通过猜测文件的密钥。比如说你知道文件的标题是 ”abc”, 那么你可以通过你猜测的加密密钥来对该明文标题 ”abc” 来进行加密,然后比对该密文和 PDF 文件中的密文是否一致,如果一致,那么这就是密钥,从而不需要经过常规的验证权限口令和打开口令就可以对文件进行解密。如图:
 
知道部分明文的破解
 
在这种情况下,如果密钥长度比较短的的话,那将很容易破解该文件。
 
3.4 PDF加密算法的改进
PDF 中内容的加密算法从 PDF1.6 开始支持 AES 加密算法, 块大小为 16 字节的 CBC 模式 ,这种算法的特点是生成一个随机字符串作为初始加密向量,后面的内容的加密都要和这个初时向量有关,因此说你即使知道了文件的部分内容,也不能通过方法 3 来破解 PDF 文件密钥了。
 
 
3.5 对于只有权限口令的PDF文件解密
只设置了权限口令的 PDF 文件的内容也是加密的,只是这个时候加密的密钥是可以通过加密字典来计算得到的,因此说解密的时候并不需要你输入任何密码。具体的密码生成过程见上一篇文章。
小结
本文详细地介绍了验证 PDF 口令的过程,同时也简单地介绍破解加密 PDF 文件可能的方法,当然讨论破解方法的目的并不是希望你去做一个软件,通过你的软件去非法破解一些加密了的 PDF 文件。只是希望能够使你了解整个 PDF 文件的解密过程。同时通过对 PDF 文件解密过程的介绍,也可以举一反三地掌握一些其它格式文件加密的大概过程和方法。当然如果你真的做了一个软件可以去掉打开口令的话,那么你也许可以帮帮类似于 浩然可见 等朋友,忘记了自己设定的口令而打不开 PDF 文件。
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 提供了许多加密解密 PDF 文档的库。其中一些库是: 1. Apache PDFBox:它是一个开源库,可以用来创建、修改和提取 PDF 文档。它还提供了加密解密 PDF 文档的功能。 2. iText:它是一个广泛使用的 PDF 库,可以用来创建、修改和提取 PDF 文档。它还提供了加密解密 PDF 文档的功能。 以下是使用 Apache PDFBox 加密解密 PDF 文档的示例代码: 1. 加密 PDF 文档: ``` import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.encryption.AccessPermission; import org.apache.pdfbox.pdmodel.encryption.StandardProtectionPolicy; import java.io.File; import java.io.IOException; public class PDFEncryptor { public static void main(String[] args) throws IOException { // 加载 PDF 文档 PDDocument document = PDDocument.load(new File("example.pdf")); // 设置访问权限 AccessPermission ap = new AccessPermission(); ap.setCanPrint(false); // 设置加密策略 StandardProtectionPolicy spp = new StandardProtectionPolicy("password", "ownerpassword", ap); spp.setEncryptionKeyLength(128); // 应用加密策略 document.protect(spp); // 保存加密后的 PDF 文档 document.save("example-encrypted.pdf"); document.close(); } } ``` 2. 解密 PDF 文档: ``` import org.apache.pdfbox.pdmodel.PDDocument; import java.io.File; import java.io.IOException; public class PDFDecryptor { public static void main(String[] args) throws IOException { // 加载加密PDF 文档 PDDocument document = PDDocument.load(new File("example-encrypted.pdf"), "password"); // 解密 PDF 文档 document.setAllSecurityToBeRemoved(true); // 保存解密后的 PDF 文档 document.save("example-decrypted.pdf"); document.close(); } } ``` 这些示例代码使用 Apache PDFBox 库加密解密 PDF 文档。您可以根据需要使用其他库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值