0

各バイトが個別に XOR されるように、2 つの 16 進文字列の XOR を実行する必要がありますが、使用する関数が意図した文字列ではなく as 入力をord()取得しているように見えるため、機能しません。int最初に彼のコードを見て、私が何を意味するかを確認してください。

from binascii import hexlify, unhexlify

def xor_hexstr(s1, s2):
    if len(s1) > len(s2):
        q = zip(unhexlify(s1[:len(s2)]), unhexlify(s2))
        return hexlify("".join(chr(ord(c1) ^ ord(c2)) for c1, c2 in q))

    else:
        q = zip(unhexlify(s2[:len(s1)]), unhexlify(s1))
        return hexlify("".join(chr(ord(c1) ^ ord(c2)) for c1, c2 in q))


t1 = "0ec17c9dabb8955c5dfb9cef627ddb4d"
t2 = "4ca00ff4c898d61e1edbf1800618fb28"

xor_hexstr(t1, t2)

そして、私が得ているエラー:

TypeError: ord() expected string of length 1, but int found

次に、q の値を確認したところ、何らかの理由で実際に整数になっていました。私の論理によれば、16進エンコードされた文字列を指定し、16進法を解除してから、各文字をqのスロットに貼り付けたため、文字列であると想定されているため、理由がわかりません。

4

2 に答える 2

2

オブジェクトを返す Python 3を使用hexlifyしています。次に、これらのオブジェクトを圧縮し、オブジェクトを反復処理してペアを作成します。オブジェクトの反復により、整数が生成されます。タイプのドキュメントを参照してください:unhexlifybytesbytesbytesbytes

bytesリテラルと表現は ASCII テキストに基づいていますが、オブジェクトbytesは実際には不変の整数シーケンスのように動作し、シーケンス内の各値は0 <= x < 256.

オブジェクトord()をループする場合は使用する必要はありません。個々のバイトを表す整数が既にありbytesます

bytes値を XOR した後、オブジェクトを再度使用するだけです。

def xor_hexstr(s1, s2):
    if len(s1) > len(s2):
        q = zip(unhexlify(s1[:len(s2)]), unhexlify(s2))
    else:
        q = zip(unhexlify(s2[:len(s1)]), unhexlify(s1))

    return hexlify(bytes(c1 ^ c2 for c1, c2 in q))

オブジェクトもhexlify返すことに注意してください。文字列 (unicode) オブジェクトが必要なbytes場合は、ASCII からデコードします。

xor_hexstr(t1, t2).decode('ASCII')

デモ:

>>> xor_hexstr(t1, t2)
b'426173696320434243206d6f64652065'
>>> xor_hexstr(t1, t2).decode('ASCII')
'426173696320434243206d6f64652065'
于 2013-07-11T15:08:11.660 に答える