В настоящее время я пытаюсь создать хэш пароля пользователя для PDF, учитывая зашифрованный файл PDF и простой пароль. Следую инструкции этого статья. Однако хэш, который я вычислил, отличается от хеша, хранящегося в файле 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.
Во-первых, я дополнил свой пароль "123456" жестко заданной 32-байтовой строкой, что дает мне
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
Я попытался вычислить хэш с помощью RC4, используя в качестве ключа 5-байтовый файловый ключ. Согласно статье:
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
. Я закодировал дополненный пароль RC4 с помощью криптии, используя первые 5 байтов хеша MD5 в качестве ключа. Однако он возвращается
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
Какой шаг я делаю неправильно? Я подозреваю, что проблема возникает из-за
Файлы: Исходный PDF манекен.pdf, фиктивная защита.pdf (Пароль: 123456)
Пожалуйста помоги
Конечно, я поместил ссылку в обновленный вопрос.
Проблема, вероятно, связана с разными версиями: статья относится к PDF версии 1.3, тогда как ваш документ был создан с помощью PDF версии 1.6. Согласно это, алгоритмы (и, предположительно, детали шифрования) различаются.
Я думаю, вы правы, где я могу найти детали хеширования пароля для > V1.3 PDF?
Может быть интересна эта ссылка: stuff.mit.edu/afs/sipb/contrib/doc/specs/software/adobe/pdf/…, глава 3.5.1. Общий алгоритм шифрования.
В вашем расчете есть две проблемы:
В статье для использования упоминаются алгоритмы шифрования PDF, доступные для PDF-1.3, но ваш документ зашифрован с использованием алгоритма, представленного в PDF-1.5.
Вы делаете ошибку при добавлении идентификатора файла - на самом деле должна быть добавлена только первая запись массива Я БЫ, а не обе (что не совсем ясно из статьи, которую вы используете).
В комментарии вы спросили соответственно
where can I find the password hashing detail for >V1.3 PDF?
Я бы предложил использовать спецификацию PDF, ISO 32000.
Что касается спецификаций ISO, они не бесплатны, но Adobe раньше предоставляла версию ISO 32000-1 с удаленным только заголовком ISO на своем веб-сайте. Несколько дней назад он был удален (по замыслу? По ошибке? Я пока не знаю.), но вы все еще находите его копии в поисках «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. Спецификацию можно найти в «Приложении Adobe к ISO 32000, базовая версия 1.7, уровень расширения 3».
Кроме того, с ISO 32000-2 схема шифрования Adobe AES-256 и все более старые схемы стали устарел, единственная схема шифрования, используемая с PDF-2.0, — это новая схема шифрования AES-256, описанная в ISO 32000-2, которая основана на Adobe, но вводит некоторые дополнительные итерации хеширования.
Можете ли вы поделиться PDF в вопросе?