尝试对单个字符键之前的字节字符串进行XOR

时间:2020-10-27 02:30:25

标签: python cryptography xor

我正在尝试使用XOR操作创建一个加密的十六进制字符串。我想编码my_message。我想将my_message中的每个字符与my_key进行异或。我将它们都转换为字节,然后将它们传递到我的xor_encrypt方法中以执行操作并返回encrypt_byte,该结果将作为十六进制编码的字符串打印出来。我在XOR操作上遇到错误: TypeError:^:'int'和'bytes'不受支持的操作数类型。我不确定如何纠正这个问题,因为根据我目前的理解,bytes([b ^ byte_key])应该将它们都转换为正确的字节吗?我对密码学有些陌生,我正尽力了解。感谢您的帮助,随时提出问题,我将在这里为您解答一会儿。预先谢谢你!

# My encryption code
# Take in out byte_msg and XOR it against the byte_key
def xor_encrypt(byte_msg, byte_key):
    encrypt_byte = b''
    for b in byte_msg:
        encrypt_byte += bytes([b ^ byte_key])
    return encrypt_byte

# Ascii encoded
my_msg = 'Execute order 66'
my_key = 'b'
# Convert ASCII message and key to Bytes 
byte_msg = bytes(my_msg.encode("utf-8"))
print(byte_msg)
key_array = bytes(my_key.encode("utf-8"))
print(key_array)

# Print out the XOR'd message as a hex encoded string
print(f"XOR'd message: {xor_encrypt(byte_msg, key_array).hex()}")

3 个答案:

答案 0 :(得分:0)

您不能xor字符串,不管是不是二进制。因此,您可以将字符串中的每个字符转换为其ASCII值,然后转换为^。然后将结果转换为字符并最终对其进行编码。

def xor_encrypt(byte_msg, byte_key):
    encrypt_byte = b''
    for b in byte_msg:
        encrypt_byte += chr(ord(b) ^ ord(byte_key)).encode()
    return encrypt_byte

# Ascii encoded
my_msg = 'Execute order 66'
my_key = 'b'
print(f"XOR'd message: {xor_encrypt(my_msg, my_key).hex()}") # XOR'd message: 271a0701171607420d10060710425454

答案 1 :(得分:0)

否,您将操作的结果转换为字节。该操作本身失败了,因为您没有转换操作数。相反:

bytes(b) ^ bytes(byte_key)

您还莫名其妙地列出了结果列表,然后想要将该单元素列表转换为bytes。我删除了。

答案 2 :(得分:0)

您不能对bytes字符串进行XOR,但是bytes可以作为整数进行迭代。您可以对它们进行XOR,将其构建为bytearray,然后从那里转换为最终形式。

# My encryption code
# Take in out byte_msg and XOR it against the byte_key
def xor_encrypt(byte_msg, byte_key):
    key = byte_key[0]
    return bytearray(val^key for val in byte_msg).hex()

# Ascii encoded
my_msg = 'Execute order 66'
my_key = 'b'
print(xor_encrypt(my_msg.encode("utf-8"), my_key.encode("ascii")))
相关问题