可能性のある複製:
ビット単位XOR
私はXOR Pythonの2つの16進文字列を試みており、どこから始めればよいのか本当に知りませんでした。
2つの16進文字列があります。
_a = "32510ba9a7b2bba9b8005d43a304b5714cc0bb0c8a34884dd91304b8ad40b62b07df44ba6e9d8a2368e51d04e0e7b207b70b9b8261112bacb6c866a232dfe257527dc29398f5f3251a0d47e503c66e935de81230b59b7afb5f41afa8d661cb"
b = "32510ba9babebbbefd001547a810e67149caee11d945cd7fc81a05e9f85aac650e9052ba6a8cd8257bf14d13e6f0a803b54fde9e77472dbff89d71b57bddef121336cb85ccb8f3315f4b52e301d16e9f52f90"
_
これを使用する必要がありますか?
return "".join([chr((x) ^ (y)) for (x,y) in Zip(a[:len(b)], b)])
return "".join([chr(ord(x) ^ ord(y)) for (x, y) in Zip(a[:len(b)], b)])
上記の2つのコードの違いがわかりません。なぜchr
とord
ですか?また、int(hex,16)
を使用している人もいます。
ここでいくつかのことが欠けています。
まず、XOR those文字列。エンコードされた形式の文字列があるため、最初に.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()
を使用して、バイナリ文字列をフォームに戻し、きれいに印刷します。
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