目前,我正在嘗試為 PDF 生成用戶密碼的哈希,給定加密的 PDF 檔案和純密碼。我按照本文的說明進行操作。但是,我計算的哈希值與存盤在 PDF 檔案中的哈希值不同。
散列的用戶密碼(/U 條目)只是上面的 32 位元組填充字串,使用 RC4 加密,使用 5 位元組檔案密鑰。兼容的 PDF 查看器將檢查用戶提供的密碼(通過嘗試使用檔案密鑰解密 /U 條目,并將其與填充字串進行比較)并根據權限設定允許或拒絕某些操作。
首先,我使用硬編碼的 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 散列這個資料塊回傳942c5e7b2020ce57ce4408f531a65019。我使用cryptii使用 MD5 哈希的前 5 個位元組作為密鑰對填充密碼進行了 RC4 編輯。但是,它回傳
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
- 我在這些程序中犯了一些錯誤
- Or maybe the article is actually wrong
Files: Original PDF dummy.pdf, dummy-protected.pdf (Password: 123456)
Please help
uj5u.com熱心網友回復:
你的計算有兩個問題:
要使用的文章是指可用于 PDF-1.3 的 PDF 加密演算法,但您的檔案是使用 PDF-1.5 引入的演算法加密的。
附加檔案識別符號時出錯 - 實際上只應附加ID陣列的第一個條目,而不是兩者(從您使用的文章中并不清楚)。
在評論中你相應地問
在哪里可以找到 >V1.3 PDF 的密碼哈希詳細資訊?
我建議使用 PDF 規范 ISO 32000。
按照 ISO 規范,它們不是免費的,但 Adob??e 過去提供了一個 ISO 32000-1 版本,只是在其網站上洗掉了 ISO 標頭。幾天前它已被洗掉(按設計?錯誤?我還不知道。)但您仍然可以在谷歌搜索“PDF32000”找到它的副本。
ISO 32000-1 中的相關部分是 7.6 Encryption,特別是 7.6.3 Standard Security Handler。
根據該資訊,您應該能夠正確計算有問題的值。
(或者,您也可以使用舊的 Adob??e PDF 參考資料,PDF 1.5、1.6 和 1.7 的版本也應該為您提供解密檔案所需的資訊。但這些參考資料已被Adob??e 知名員工描述為本質上不規范,因此我會選擇 ISO 規范。)
但請注意:在 ISO 32000-1 發布后,Adobe 引入了 AES-256 加密方案作為擴展,這顯然不包含在 ISO 32000-1 中。您可以在“Adobe Supplement to ISO 32000, base version 1.7, extension level 3”中找到規范。
此外,隨著 ISO 32000-2(Adobe AES-256 加密方案和所有舊方案已被棄用),唯一可與 PDF-2.0 一起使用的加密方案是 ISO 32000-2 中描述的新 AES-256 加密方案,它基于Adobe 方案,但引入了一些額外的散列迭代。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/447057.html
標籤:pdf encryption hash
上一篇:使用iText5向PDF添加水印
