Генерация хеша пароля пользователя PDF

В настоящее время я пытаюсь создать хэш пароля пользователя для 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

Какой шаг я делаю неправильно? Я подозреваю, что проблема возникает из-за

  • Я добавляю идентификатор файла в неправильном формате
  • Я использую неправильные байты перетаскивания с RC4.
  • Хэш-функция не для PDF 1.6
  • Я делаю некоторые ошибки во время этого процесса
  • А может статья действительно неправильная

Файлы: Исходный PDF манекен.pdf, фиктивная защита.pdf (Пароль: 123456)

Пожалуйста помоги

Можете ли вы поделиться PDF в вопросе?

mkl 19.03.2022 11:50

Конечно, я поместил ссылку в обновленный вопрос.

iLittleWizard 19.03.2022 14:52

Проблема, вероятно, связана с разными версиями: статья относится к PDF версии 1.3, тогда как ваш документ был создан с помощью PDF версии 1.6. Согласно это, алгоритмы (и, предположительно, детали шифрования) различаются.

Topaco 19.03.2022 17:17

Я думаю, вы правы, где я могу найти детали хеширования пароля для > V1.3 PDF?

iLittleWizard 19.03.2022 18:21

Может быть интересна эта ссылка: stuff.mit.edu/afs/sipb/contrib/doc/specs/software/adobe/pdf/‌​…, глава 3.5.1. Общий алгоритм шифрования.

Topaco 19.03.2022 20:00
Как конвертировать HTML в PDF с помощью jsPDF
Как конвертировать HTML в PDF с помощью jsPDF
В этой статье мы рассмотрим, как конвертировать HTML в PDF с помощью jsPDF. Здесь мы узнаем, как конвертировать HTML в PDF с помощью javascript.
Включение UTF-8 в jsPDF с помощью Angular
Включение UTF-8 в jsPDF с помощью Angular
Привет, разработчики, я предполагаю, что вы уже знаете, как экспортировать pdf через jsPDF. Если ответ отрицательный, то вы можете ознакомиться с моей...
1
5
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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, но вводит некоторые дополнительные итерации хеширования.

Другие вопросы по теме