如何计算Python中两个字节的异或?

How to calculate the XOR of two bytes in Python?

我用这个函数来应用两个字节之间的异或运算

 def byte_xor(ba1, ba2):
        """ XOR two byte strings """
        return bytes([_a ^ _b for _a, _b in zip(ba1, ba2)])

我用了两个字节R和L的功能

new_R = byte_xor(str(R).encode(), str(self.hash1(str(L).encode())).encode())
  1. 其中 str(R).encode() 等于 b'X: 0x92405a2937fba74a036c002e51dc8405850afe40123b23f2\nY: 0x2b8471aac0e9b2038dd369d376481585bbf0286927d7607e\n(On curve <P192>)'
  2. str(self.hash1(str(L).encode())).encode() 等于 b'4775954696306753387525785228259522227266813277010037244898'
  3. 并且new_R等于b'l\r\x17\x05A\x0c\x06\x02\t\x03R\x02\x0f\x04\x02UQY\x00\x01S\x05\x04\x0eV\x02\x02\nW\x00\x08QQ\n\x06\x02\x02\n\x03\x06YWV\x06\x07\x06\x02\x02R\x02\x00Q\x00>m\x02\x19\x08'

我不明白的是,当我想得到R的值时,它并没有给我全部的值,不知怎么的,它似乎给了我实际值的一半:

R = byte_xor(new_R, str(self.hash1(str(L).encode())).encode())
print('This is R:',R)
This is R: b'X: 0x92405a2937fba74a036c002e51dc8405850afe40123b23f2\nY: 0'

我是不是做错了什么?请帮助我

您可能希望循环第二个参数的字节以覆盖第一个参数的所有内容。 zip() 只会匹配常见的长度:

from itertools import cycle

def byte_xor(ba1, ba2):
        """ XOR two byte strings """
        return bytes([_a ^ _b for _a, _b in zip(ba1, cycle(ba2))])

R = b'X: 0x92405a2937fba74a036c002e51dc8405850afe40123b23f2\nY: 0x2b8471aac0e9b2038dd369d376481585bbf0286927d7607e\n(On curve <P192>)'
H = b'4775954696306753387525785228259522227266813277010037244898'

N = byte_xor(R,H)
print(N)
b'l\r\x17\x05A\x0c\x06\x02\t\x03R\x02\x0f\x04\x02UQY\x00\x01S\x05\x04\x0eV\x02\x02\nW\x00\x08QQ\n\x06\x02\x02\n\x03\x06YWV\x06\x07\x06\x02\x02R\x02\x00Q\x00>m\x02\x19\x08L\x05U\r\r\x02\x05WXU\x03U\x0fU\x07\x03\x00\x00SQ\x01\x03\x0e\\x06\x05\x04\x0c\n\x04\x0c\r\x07PPT\x07\x00\x0e\x00\x01\x03\x04V\x00\x01\x00\x06U:\x1bx\\x14WMKNQ\x17\x0be\x08\x0c\x06\x08\x10'