生成 PDF 用户密码哈希
Generating PDF user password hash
目前,我正在尝试为 PDF 生成用户密码的哈希值,给定加密的 PDF 文件和普通密码。我遵循这个 article 的说明。但是,我计算的散列值与 PDF 文件中存储的散列值不同。
The hashed user password (/U entry) is simply the 32-byte padding
string above, encrypted with RC4, using the 5-byte file key. Compliant
PDF viewers will check the password given by the user (by attempting
to decrypt the /U entry using the file key, and comparing it against
the padding string) and allow or refuse certain operations based on
the permission settings.
首先,我使用硬编码的 32 字节字符串填充了我的密码 "123456",这给了我
31 32 33 34 35 36 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
我尝试使用 5 字节文件密钥作为密钥,使用 RC4 计算哈希值。根据文章:
The encryption key is generated as follows:
1. Pad the user password out to 32 bytes, using a hardcoded
32-byte string:
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
If the user password is null, just use the entire padding
string. (I.e., concatenate the user password and the padding
string and take the first 32 bytes.)
2. Append the hashed owner password (the /O entry above).
3. Append the permissions (the /P entry), treated as a four-byte
integer, LSB first.
4. Append the file identifier (the /ID entry from the trailer
dictionary). This is an arbitrary string of bytes; Adobe
recommends that it be generated by MD5 hashing various pieces
of information about the document.
5. MD5 hash this string; the first 5 bytes of output are the
encryption key. (This is a 40-bit key, presumably to meet US
export regulations.)
我将经过哈希处理的所有者密钥附加到填充的密码中,这给了我
31 32 33 34 35 36 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
C4 31 FA B9 CC 5E F7 B5 9C 24 4B 61 B7 45 F7 1A
C5 BA 42 7B 1B 91 02 DA 46 8E 77 12 7F 1E 69 D6
然后,我附加了 /P 条目 (-4),它被视为一个四字节整数,用小端编码,这给了我
31 32 33 34 35 36 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
C4 31 FA B9 CC 5E F7 B5 9C 24 4B 61 B7 45 F7 1A
C5 BA 42 7B 1B 91 02 DA 46 8E 77 12 7F 1E 69 D6
FC FF FF FF
最后,我附加了文件标识符。我的 PDF 的预告片是:
trailer
<<
/Size 13
/Root 2 0 R
/Encrypt 1 0 R
/Info 4 0 R
/ID [<B5185D941CC0EA39ACA809F661EF36D4> <393BE725532F9158DC9E6E8EA97CFBF0>]
>>
结果是
31 32 33 34 35 36 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
C4 31 FA B9 CC 5E F7 B5 9C 24 4B 61 B7 45 F7 1A
C5 BA 42 7B 1B 91 02 DA 46 8E 77 12 7F 1E 69 D6
FC FF FF FF B5 18 5D 94 1C C0 EA 39 AC A8 09 F6
61 EF 36 D4 39 3B E7 25 53 2F 91 58 DC 9E 6E 8E
A9 7C FB F0
MD5 散列此数据块 returns 942c5e7b2020ce57ce4408f531a65019
。我使用 MD5 哈希的前 5 个字节作为密钥,用 cryptii RC4 编辑了填充的密码。然而,它 returns
90 e2 b5 21 2a 7d 53 05 70 d9 5d 26 95 c7 c2 05
6e 2a 28 40 63 e7 4a d4 e9 05 86 71 43 d1 39 d6
而 PDF 中的哈希是
58 81 CA 74 65 DC 2E A7 5D D2 39 D4 43 9C 0D DE
28 BF 4E 5E 4E 75 8A 41 64 00 4E 56 FF FA 01 08
我哪一步做错了?我怀疑问题的发生是因为
- 我附加的文件标识符格式错误
- 我在 RC4 中使用了错误的丢弃字节。
- 哈希函数不适用于 PDF 1.6
- 我在那些过程中犯了一些错误
- 或者这篇文章实际上是错误的
文件:原始 PDF dummy.pdf, dummy-protected.pdf(密码:123456)
请帮忙
你的计算有两个问题:
要使用的文章提到了适用于 PDF-1.3 的 PDF 加密算法,但您的文档是使用 PDF-1.5 引入的算法加密的。
附加文件标识符时出错 - 实际上只附加 ID 数组的第一个条目,而不是两个(这不是真的从您使用的文章中清除)。
在您相应提问的评论中
where can I find the password hashing detail for >V1.3 PDF?
我建议使用 PDF 规范,ISO 32000。
随着 ISO 规范的发展,它们不是免费的,但 Adobe 曾经提供 ISO 32000-1 版本,仅在其网站上删除了 ISO header。几天前它已被删除(按设计?按错误?我还不知道。)但你仍然可以找到它的副本谷歌搜索“PDF32000”。
ISO 32000-1 中的相关部分是 7.6 加密,尤其是 7.6.3 标准安全处理程序.
根据该信息,您应该能够正确计算出相关值。
(或者,您也可以使用旧的 Adobe PDF 参考资料,PDF 1.5、1.6 和 1.7 的版本也应该为您提供解密文档所需的信息。但这些参考资料的特征是 杰出的 Adobe 员工本质上不是规范,所以我会选择 ISO 规范。)
但请注意:在 ISO 32000-1 发布后,Adobe 引入了 AES-256 加密方案作为扩展,这显然不包含在 ISO 32000-1 中。您可以在“ISO 32000 的 Adobe 补充,基本版本 1.7,扩展级别 3”中找到规范。
此外,在 ISO 32000-2 中,Adobe AES-256 加密方案和所有旧方案都已 弃用 ,唯一可用于 PDF-2.0 的加密方案是新的 AES ISO 32000-2 中描述的 -256 加密方案基于 Adobe 方案,但引入了一些额外的哈希迭代。
目前,我正在尝试为 PDF 生成用户密码的哈希值,给定加密的 PDF 文件和普通密码。我遵循这个 article 的说明。但是,我计算的散列值与 PDF 文件中存储的散列值不同。
The hashed user password (/U entry) is simply the 32-byte padding string above, encrypted with RC4, using the 5-byte file key. Compliant PDF viewers will check the password given by the user (by attempting to decrypt the /U entry using the file key, and comparing it against the padding string) and allow or refuse certain operations based on the permission settings.
首先,我使用硬编码的 32 字节字符串填充了我的密码 "123456",这给了我
31 32 33 34 35 36 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
我尝试使用 5 字节文件密钥作为密钥,使用 RC4 计算哈希值。根据文章:
The encryption key is generated as follows:
1. Pad the user password out to 32 bytes, using a hardcoded
32-byte string:
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
If the user password is null, just use the entire padding
string. (I.e., concatenate the user password and the padding
string and take the first 32 bytes.)
2. Append the hashed owner password (the /O entry above).
3. Append the permissions (the /P entry), treated as a four-byte
integer, LSB first.
4. Append the file identifier (the /ID entry from the trailer
dictionary). This is an arbitrary string of bytes; Adobe
recommends that it be generated by MD5 hashing various pieces
of information about the document.
5. MD5 hash this string; the first 5 bytes of output are the
encryption key. (This is a 40-bit key, presumably to meet US
export regulations.)
我将经过哈希处理的所有者密钥附加到填充的密码中,这给了我
31 32 33 34 35 36 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
C4 31 FA B9 CC 5E F7 B5 9C 24 4B 61 B7 45 F7 1A
C5 BA 42 7B 1B 91 02 DA 46 8E 77 12 7F 1E 69 D6
然后,我附加了 /P 条目 (-4),它被视为一个四字节整数,用小端编码,这给了我
31 32 33 34 35 36 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
C4 31 FA B9 CC 5E F7 B5 9C 24 4B 61 B7 45 F7 1A
C5 BA 42 7B 1B 91 02 DA 46 8E 77 12 7F 1E 69 D6
FC FF FF FF
最后,我附加了文件标识符。我的 PDF 的预告片是:
trailer
<<
/Size 13
/Root 2 0 R
/Encrypt 1 0 R
/Info 4 0 R
/ID [<B5185D941CC0EA39ACA809F661EF36D4> <393BE725532F9158DC9E6E8EA97CFBF0>]
>>
结果是
31 32 33 34 35 36 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
C4 31 FA B9 CC 5E F7 B5 9C 24 4B 61 B7 45 F7 1A
C5 BA 42 7B 1B 91 02 DA 46 8E 77 12 7F 1E 69 D6
FC FF FF FF B5 18 5D 94 1C C0 EA 39 AC A8 09 F6
61 EF 36 D4 39 3B E7 25 53 2F 91 58 DC 9E 6E 8E
A9 7C FB F0
MD5 散列此数据块 returns 942c5e7b2020ce57ce4408f531a65019
。我使用 MD5 哈希的前 5 个字节作为密钥,用 cryptii RC4 编辑了填充的密码。然而,它 returns
90 e2 b5 21 2a 7d 53 05 70 d9 5d 26 95 c7 c2 05
6e 2a 28 40 63 e7 4a d4 e9 05 86 71 43 d1 39 d6
而 PDF 中的哈希是
58 81 CA 74 65 DC 2E A7 5D D2 39 D4 43 9C 0D DE
28 BF 4E 5E 4E 75 8A 41 64 00 4E 56 FF FA 01 08
我哪一步做错了?我怀疑问题的发生是因为
- 我附加的文件标识符格式错误
- 我在 RC4 中使用了错误的丢弃字节。
- 哈希函数不适用于 PDF 1.6
- 我在那些过程中犯了一些错误
- 或者这篇文章实际上是错误的
文件:原始 PDF dummy.pdf, dummy-protected.pdf(密码:123456)
请帮忙
你的计算有两个问题:
要使用的文章提到了适用于 PDF-1.3 的 PDF 加密算法,但您的文档是使用 PDF-1.5 引入的算法加密的。
附加文件标识符时出错 - 实际上只附加 ID 数组的第一个条目,而不是两个(这不是真的从您使用的文章中清除)。
在您相应提问的评论中
where can I find the password hashing detail for >V1.3 PDF?
我建议使用 PDF 规范,ISO 32000。
随着 ISO 规范的发展,它们不是免费的,但 Adobe 曾经提供 ISO 32000-1 版本,仅在其网站上删除了 ISO header。几天前它已被删除(按设计?按错误?我还不知道。)但你仍然可以找到它的副本谷歌搜索“PDF32000”。
ISO 32000-1 中的相关部分是 7.6 加密,尤其是 7.6.3 标准安全处理程序.
根据该信息,您应该能够正确计算出相关值。
(或者,您也可以使用旧的 Adobe PDF 参考资料,PDF 1.5、1.6 和 1.7 的版本也应该为您提供解密文档所需的信息。但这些参考资料的特征是 杰出的 Adobe 员工本质上不是规范,所以我会选择 ISO 规范。)
但请注意:在 ISO 32000-1 发布后,Adobe 引入了 AES-256 加密方案作为扩展,这显然不包含在 ISO 32000-1 中。您可以在“ISO 32000 的 Adobe 补充,基本版本 1.7,扩展级别 3”中找到规范。
此外,在 ISO 32000-2 中,Adobe AES-256 加密方案和所有旧方案都已 弃用 ,唯一可用于 PDF-2.0 的加密方案是新的 AES ISO 32000-2 中描述的 -256 加密方案基于 Adobe 方案,但引入了一些额外的哈希迭代。