4

PHP で書かれた認証ライブラリを Python に翻訳しています。それはすべてレガシーコードであり、元の開発者はずっと前にいなくなっています。彼らは、PHP の「pack」コマンドを使用して、「H」フラグを使用して文字列を 16 進数に変換しました。PHP のドキュメントでは、これを「16 進文字列、上位ニブルが最初」と説明しています。binascii.unhexlify() の使用を提案した別の質問 ( PHP パックに相当する Python)を読みましたが、16 進数以外の文字を渡すたびに文句を言います。

だから私の質問は、PHP パック関数は 16 進数以外の文字で何をするのですか? それらを破棄しますか、それとも翻訳を実行する余分なステップがありますか。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 ライブラリは「ダイジェスト」メソッドを介してバイナリ データを返します。

私の場合、すべての binascii 呼び出しをスキップして、単に使用することができました

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

PHP では次のようになります。

pack("H*", md5("ダミー文字列"));

楽しいもの。知っておくと良い。

4

1 に答える 1

3

逆に必要だと思います。"Dummy String"は有効な数値ではありませんhex。あなたはhexlifyそれをすることができます:

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

しかし、そうではありませんunhexlifyunhexlify文字列を受け取り、hexASCII 表現に変換します。

>>> 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

これにより、ハッシュと非 hexlified ハッシュが生成されます。

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

注:出力はあなたのものとまったく同じではありませんが、「??????=?PW??」、「PW」と「=」の両方が正しいことを確信させてくれます。

hashlibbinasciiの詳細

于 2013-03-13T15:11:26.803 に答える