J'essaie de créer une chaîne hexadécimale chiffrée à l'aide de l'opération XOR. Je veux encoder mon_message. Je veux XOR chaque caractère de my_message contre my_key. Je les ai convertis tous les deux en octets, puis les ai passés dans ma méthode xor_encrypt pour effectuer l'opération et renvoyer encrypt_byte qui sera imprimé sous forme de chaîne codée hexadécimal. J'obtiens une erreur sur l'opération XOR: TypeError: type (s) d'opérande non pris en charge pour ^: 'int' et 'bytes' . Je ne sais pas comment corriger cela, car d'après ma compréhension actuelle, bytes([b ^ byte_key]) devrait les convertir tous les deux en octets correctement? Je suis un peu nouveau dans la cryptographie et je fais de mon mieux pour comprendre. Toute aide est appréciée, n'hésitez pas à poser des questions, je serai là pour y répondre pendant un moment. Merci d'avance!

# 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()}")
0
Braydon 27 oct. 2020 à 05:30

3 réponses

Meilleure réponse

Vous ne pouvez pas xor chaînes, binaires ou non. Vous convertissez donc chaque caractère de la chaîne en sa valeur ASCII, puis en ^. Puis convertissez le résultat en caractère et enfin encodez-le.

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
0
python_learner 27 oct. 2020 à 02:40

Non, vous avez converti le résultat de l'opération en octets. L'opération elle-même a échoué, car vous n'avez pas converti les opérandes. Au lieu:

bytes(b) ^ bytes(byte_key)

Vous avez également fait une liste inexplicable du résultat, puis avez voulu convertir cette liste à un élément en bytes. J'ai enlevé ça.

0
Prune 27 oct. 2020 à 02:41

Vous ne pouvez pas XOR bytes chaînes mais bytes peut être itéré sous forme d'entiers. Vous pouvez les XOR, les construire dans un bytearray et les convertir en forme finale à partir de là.

# 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")))
0
tdelaney 27 oct. 2020 à 02:52