XOR сообщение с ключом: TypeError: объект 'int' не вызывается - PullRequest
0 голосов
/ 05 января 2020

Попытка XOR сообщения побайтно с заданным ключом b «ICE». Чтобы сделать это, я должен перечислить через индексы ключа и сообщение, в то же время убедившись, что по модулю ключа используется l oop.

Однако я получаю объект TypeError: 'int' не вызывается.

Я не уверен, как это исправить. Любой совет высоко ценится. Весь код ниже.

def repeating_key_xor(message_bytes, key):
    output_bytes = b''
    for i, bytes in enumerate(message_bytes):
        output_bytes += bytes([key[i % len(key)] ^ bytes])
    return output_bytes


def main():
    key = b"ICE"
    message = b"Burning 'em, if you ain't quick and nimble\nI go crazy when I hear a cymbal"
    ciphertext = repeating_key_xor(message, key)
    print(ciphertext)


if __name__ == '__main__':
    main()

Ответы [ 2 ]

1 голос
/ 05 января 2020

bytes - это встроенная функция, которую вы переопределяете.

Возможно, вы имели в виду:

def repeating_key_xor(message_bytes, key):
    output_bytes = b''
    for i, byte in enumerate(message_bytes):
        output_bytes += bytes([key[i % len(key)] ^ byte])
    return output_bytes
0 голосов
/ 05 января 2020

Как было сказано в предыдущем ответе, вы переопределяете bytes, создавая переменную с тем же именем.

Я бы предложил использовать элегантные функции и библиотеки python, избегать индексации и оптимизировать код

import itertools as it

def repeating_key_xor(message_bytes, key):
    for byte, k in zip(message_bytes, it.cycle(key)):
        yield k ^ byte

def main():
    key = b"ICE"
    message = b"Burning 'em, if you ain't quick and nimble\nI go crazy when I hear a cymbal"
    ciphertext = bytes(repeating_key_xor(message, key))
    print(ciphertext)

if __name__ == '__main__':
    main()

, который производит

b'\x0b67\'*+.cb,.ii*#i:*<c$ -b=c4<*&"c$\'\'e\'*(+/ C\ne.,e*1$3:e>+ \'c\x0ci+ (1e(c&0.\'(/'
...