Пакет PHP в Python ('H')

Я перевожу библиотеку аутентификации, написанную на PHP на Python. Это весь устаревший код, оригинальных разработчиков давно уже нет. Они использовали команду PHP "pack", чтобы преобразовать строку в шестнадцатеричный формат с помощью флага "H". Документация PHP описывает это как "шестнадцатеричная строка, сначала большой клев". Я прочитал другой вопрос ( Python-эквивалент php pack), в котором предлагалось использовать binascii.unhexlify(), но это вызывает жалобу, когда я передаю не шестнадцатеричный символ.

Итак, мой вопрос: что делает функция пакета PHP с не шестнадцатеричными символами? Выбрасывает ли он их, или есть дополнительный шаг, который выполняет перевод. Есть ли лучший способ в Python, чем binascii.unhexlify?

Так что упаковываю 'H*'

php -r 'print pack("H*", md5("Dummy String"));' 

Возвращает

??????=?PW??

В питоне:

secret = binascii.unhexlify( "Dummy String" )
TypeError: Non-hexadecimal digit found

Спасибо за помощь.

[РЕДАКТИРОВАТЬ]

Так что DJV был принципиально прав. Сначала мне нужно было конвертировать значение в md5, но вот где это интересно. В python библиотека md5 возвращает двоичные данные с помощью метода digest.

В моем случае я мог пропустить все вызовы binascii и просто использовать

md5.md5('Dummy String').digest()

Который в PHP такой же как:

pack ("H *", md5 ("Dummy String"));

Прикольные вещи. Хорошо знать.

1 ответ

Решение

Я думаю, что вам нужно наоборот. "Dummy String" недопустимый номер в hex, Вы можете hexlify Это:

>>> binascii.hexlify('Dummy String')
'44756d6d7920537472696e67'

но нет unhexlify Это. unhexlify принимает строку в hex и превращает его в представление ASCII:

>>> binascii.unhexlify('44756d6d7920537472696e67')
'Dummy String'

Что вам нужно, это md5 строка ("Dummy String" в нашем случае) и unhexlify это хеш:

import binascii
import hashlib

the_hash = hashlib.md5('Dummy String').hexdigest()
print the_hash
the_unhex = binascii.unhexlify(the_hash)
print the_unhex

Который дает хеш, и необъяснимый хеш:

ec041da9f891c09b3d1617ba5057b3f5
ЛLЬ-ю?=¦PWЁУ

Примечание: хотя вывод не похож на ваш - "??????=?PW??", "PW" и "=" в обоих, я уверен, что это правильно.

Больше о hashlib и binascii

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