0

我试图收集有关用于保护 PDF 的密码的信息。我使用 PeePDF 和 xxd 编辑器查看受密码保护的 PDF 的所有对象。我知道密码信息存储在 PDF 结构的尾部部分。当我运行此命令时,我得到了

xxd my_encrypted.pdf | 尾-n 4

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 字典在对象 4 中。现在使用 PeePDF,我试过了

PPDF> object 4

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

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

/O 是所有者密码

/U 是 PDF 的用户密码

PPDF>  info 4

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

我得到了这个信息。我什至没有得到密码的哈希值。那个垃圾文字代表什么?是加密密码吗?MD5 哈希代表什么?

请告诉我是否有任何其他工具可以分析 PDF 并获取保护 PDF 的密码哈希。谢谢

4

1 回答 1

0

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

在本例中,要阅读的规范是 PDF 规范,即 ISO 32000-1 和 ISO 32000-2。

ISO 32000-1 的副本由 Adob​​e 在https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/PDF32000_2008.pdf发布- 它是完整的,只有官方的 ISO 标头替换为 Adob​​e 标头。阅读其中的第7.6 节加密

对于您的 PDF ,值为2的加密字典条目V表示使用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)之间执行 XOR(异或)运算而生成的加密密钥。

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

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

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

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

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

d) 使用 RC4 加密函数和步骤 (a) 中的加密密钥加密 16 字节的哈希结果。

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

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

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

算法 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 字节附加到密码字符串的末尾。如果密码字符串为空(零长度),即没有用户密码,则用整个填充字符串代替它。

...

于 2019-09-10T10:21:38.357 回答