23

重複の可能性:
Pythonでの16進数のビット単位のXOR

Pythonで2つの16進文字列をXORしようとしていますが、どこから始めればよいのかわかりませんでした。

私は2つの16進文字列を持っています:

a = "32510ba9a7b2bba9b8005d43a304b5714cc0bb0c8a34884dd91304b8ad40b62b07df44ba6e9d8a2368e51d04e0e7b207b70b9b8261112bacb6c866a232dfe257527dc29398f5f3251a0d47e503c66e935de81230b59b7afb5f41afa8d661cb"
b = "32510ba9babebbbefd001547a810e67149caee11d945cd7fc81a05e9f85aac650e9052ba6a8cd8257bf14d13e6f0a803b54fde9e77472dbff89d71b57bddef121336cb85ccb8f3315f4b52e301d16e9f52f90"

これを使うべきですか?

  1. return "".join([chr((x) ^ (y)) for (x,y) in zip(a[:len(b)], b)])
  2. return "".join([chr(ord(x) ^ ord(y)) for (x, y) in zip(a[:len(b)], b)])

上記の2つのコードの違いがわかりません。なぜchrそしてord?を使用している人も見int(hex,16)ました。

4

2 に答える 2

34

ここでいくつか欠けていることがあります。

まず、これらの文字列をXORしたくないでしょう。.decode()文字列はエンコードされた形式であるため、最初に文字列を作成する必要があります。

binary_a = a.decode("hex")
binary_b = b.decode("hex")

次に、すでに述べたようにzip()、2つのシーケンスのいずれかが使い果たされるとすぐに、関数は反復を停止します。スライスする必要はありません。

ループの2番目のバージョンが必要です。最初に、文字のASCII値を取得します。数値をord()生成します。これが必要なのは^、数値に対してのみ機能するためです。

数値をXORした後、数値を次の文字に変換し直しますchr

def xor_strings(xs, ys):
    return "".join(chr(ord(x) ^ ord(y)) for x, y in zip(xs, ys))

xored = xor_strings(binary_a, binary_b).encode("hex")

最後にを使用.encode()して、バイナリ文字列をフォームに戻します。これはうまく印刷されます。

于 2013-01-25T16:50:15.563 に答える
19

int('', 16)16進数を使用して16進文字列を整数に変換します。

>>> int('f', 16)
15 
>>> int('10', 16)
16

だからこれを行う:

result = int(a, 16) ^ int(b, 16) # convert to integers and xor them together
return '{:x}'.format(result)     # convert back to hexadecimal
于 2013-01-25T16:44:58.487 に答える