如何计算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())
- 其中
str(R).encode()
等于 b'X: 0x92405a2937fba74a036c002e51dc8405850afe40123b23f2\nY: 0x2b8471aac0e9b2038dd369d376481585bbf0286927d7607e\n(On curve <P192>)'
str(self.hash1(str(L).encode())).encode()
等于 b'4775954696306753387525785228259522227266813277010037244898'
- 并且
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'
我用这个函数来应用两个字节之间的异或运算
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())
- 其中
str(R).encode()
等于b'X: 0x92405a2937fba74a036c002e51dc8405850afe40123b23f2\nY: 0x2b8471aac0e9b2038dd369d376481585bbf0286927d7607e\n(On curve <P192>)'
str(self.hash1(str(L).encode())).encode()
等于b'4775954696306753387525785228259522227266813277010037244898'
- 并且
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'