誰かがPythonのXOR関数を手伝ってくれると嬉しいです。
たとえば、16進コードで記述された2つの非常に大きなメッセージ(約300シンボル)があります。どうすればそれらを適切にXORできますか?一般的な関数を使って別の型に変換してみましたが、できませんでした(
どのタイプのデータに変換する必要があるのかわかりませんか?
私があなたの質問を正しく受け取った場合、文字列として表された2つの16進数がある場合:
a = "e877a5e68bea88d61b93ac5ee0d562e8e9"
b = "23fe3231699ade23482"
intに変換し、ビット単位のxor演算子を適用することにより、マスクを使用してそれらのいずれかをxorできます。
xor_result = int(a, 16) ^ int(b, 16)
print '%x' % xor_result
そして、元の形式を維持したい場合
string_xor_result = hex(xor_result)[2:]
文字列charを繰り返し処理し、各charをint(int(a,16)
)に変換してから、xorを適用しhex
、でhexに再変換し、先頭の「0x」をで削除して[2:]
、最後にすべてを結合します。
stra = 'abc'
strb = 'abd'
''.join(hex( int(a,16) ^ int(b,16) )[2:] for a,b in zip(stra, strb))
コメントで指摘されているように、2つの文字列の長さが同じ場合にのみ機能することに注意してください。そうしないと、長い文字列の一部の文字が無視されます。
2つの文字列の長さが同じでない場合は、cycle()という1行を追加できます。
stra = raw_input("msg: ")
strb = raw_input("key: ")
strb = cycle(strb)
print ''.join(hex( int(a,16) ^ int(b,16) )[2:] for a,b in zip(stra, strb))