首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何查找受密码保护的PDF的密码相关信息?

如何查找受密码保护的PDF的密码相关信息?
EN

Stack Overflow用户
提问于 2019-09-07 19:00:14
回答 1查看 284关注 0票数 0

我正在尝试收集有关用于保护PDF的密码的信息。我使用PeePDF和xxd编辑器来查看所有受密码保护的structure.When对象。我知道密码信息存储在PDF PDF的尾部部分。我运行此命令,得到

xxd -n |尾部xxd 4

代码语言:javascript
复制
00022c60: 5d0a 2f49 6e66 6f20 3220 3020 520a 2f45  ]./Info 2 0 R./E
00022c70: 6e63 7279 7074 2034 2030 2052 0a3e 3e0a  ncrypt 4 0 R.>>.
00022c80: 7374 6172 7478 7265 660a 3134 3139 3934  startxref.141994
00022c90: 0a25 2545 4f46 0a                        .%%EOF.

我知道/Encrypt字典在object 4中。现在使用PeePDF,我尝试了

代码语言:javascript
复制
PPDF> object 4

<< /O ��%�}�&��
v����o
      B��z���B�

/Filter /Standard
/Length 128
/V 2
/U ZM����S��3�
fmL
/R 3
/P -1 >>

/O是所有者密码

/U为PDF的用户密码

代码语言:javascript
复制
PPDF>  info 4

Offset: 699
Size: 206
MD5: 8a74ac53f9e6c1f4da44bcdbb65509e9
Object: dictionary
References: []

我得到了这个信息。我甚至连密码的哈希都没拿到。垃圾文本代表什么?是加密密码吗?什么是MD5哈希?

请告诉我,如果有任何其他工具,可以分析PDF和获得散列的密码,这是保护PDF。谢谢

EN

回答 1

Stack Overflow用户

发布于 2019-09-10 18:21:38

如果没有其他帮助,请阅读规范。

在手头的情况下,要阅读的规范是PDF规范,即ISO 32000-1和ISO 32000-2。

32000-1的副本是由Adobe在https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/PDF32000_2008.pdf上发布的-它是完整的,只是用Adobe headers替换了正式的ISO headers。请阅读其中的7.6节加密。

对于您的PDF,加密字典条目V与值2指示使用7.6.2“通用加密算法”中的“算法1:使用RC4或AES算法加密数据”,但允许加密密钥长度大于40位。值为3的条目R表示标准安全处理程序的修订。此算法/处理程序对已在ISO 32000-1中进行了说明。

特别是,您可以在那里阅读OU值是如何计算的:

算法3:计算加密字典的O(所有者密码)值

A)如“算法2:计算加密密钥”的步骤(a)所述,填充或截断所有者口令字符串。如果没有所有者密码,请改用用户密码。

B)初始化MD5散列函数,并将步骤(a)的结果作为输入传递给该函数。

C)(修订版3或更高版本的安全处理程序)执行以下50次:从先前的MD5散列中获取输出,并将其作为输入传递到新的MD5散列中。

D)使用来自最终MD5散列的输出的前n个字节创建RC4加密密钥,其中对于修订版2的安全处理程序,n应始终为5,但对于修订版3或更高版本的安全处理程序,应取决于加密字典的长度条目的值。

E)填充或截断用户密码字符串,如“算法2:计算加密密钥”的步骤(a)所述。

F)利用在步骤(d)中获得的加密密钥,使用RC4加密函数对步骤(e)的结果进行加密。

G)(修订版3或更高版本的安全处理器)执行以下19次:从先前调用的RC4函数获取输出,并将其作为输入传递给新的函数调用;使用通过获取在步骤(d)中获得的加密密钥的每个字节并在该字节与迭代计数器的单字节值(从1到19)之间执行异或(异或)运算而生成的加密密钥。

H)将最终调用RC4函数的输出存储为加密字典中O条目的值。

Algorithm 5:计算加密字典的U(用户密码)值(修订版3或更高版本的安全处理程序)

A)根据用户密码字符串创建加密密钥,如算法2:计算加密密钥中所述。

B)初始化MD5散列函数,并将“算法2:计算加密密钥”的步骤(a)中所示的32字节填充字符串作为输入传递给该函数。

C)将文件的文件标识符数组的第一个元素(文档尾部字典中ID条目的值;参见表15)传递给散列函数并完成散列。

D)使用具有来自步骤(a)的加密密钥的RC4加密函数来加密散列的16字节结果。

E)执行以下19次:获取来自先前RC4函数调用的输出,并将其作为输入传递到新的函数调用;使用通过获取在步骤(a)中获得的原始加密密钥的每个字节并在该字节与迭代计数器的单字节值(从1到19)之间执行异或(异或)运算而生成的加密密钥。

F)将16字节的任意填充附加到RC4函数的最终调用的输出中,并将32字节的结果作为U条目的值存储在加密字典中。

在这两种情况下,都引用了“算法2:计算加密密钥”的步骤(a):

Algorithm 2:计算加密密钥

A)将密码字符串填充或截断为恰好32个字节。如果密码字符串长度大于32个字节,则仅使用其前32个字节;如果长度小于32个字节,则通过从以下填充字符串的开头添加所需数量的额外字节来填充密码字符串:

< 28 BF 4E 5E 4E 75 8A 41 64 00 4E 56 FF FA 01 08 2E 2E 00 B6 D0 68 3E 80 2F 0C A9 FE 64 53 69 7A >

也就是说,如果密码字符串的长度为n字节,则将填充字符串的前32 -n字节追加到密码字符串的末尾。如果密码字符串为空(长度为零),表示没有用户密码,请替换为整个填充字符串。

...

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57833042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档