如果没有其他帮助,请阅读规范。
在本例中,要阅读的规范是 PDF 规范,即 ISO 32000-1 和 ISO 32000-2。
ISO 32000-1 的副本由 Adobe 在https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/PDF32000_2008.pdf发布- 它是完整的,只有官方的 ISO 标头替换为 Adobe 标头。阅读其中的第7.6 节加密。
对于您的 PDF ,值为2的加密字典条目V表示使用7.6.2 “通用加密算法”中的“算法 1:使用 RC4 或 AES 算法加密数据”,但允许加密密钥长度大于 40位。值为3的条目R表示标准安全处理程序的版本。这个算法/处理程序对已经在 ISO 32000-1 中进行了解释。
特别是您可以在那里阅读如何计算O和U值:
算法 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 字节附加到密码字符串的末尾。如果密码字符串为空(零长度),即没有用户密码,则用整个填充字符串代替它。
...