英文:
XOR a message with a key: TypeError: 'int' object is not callable
问题
尝试逐字节使用给定的密钥 b"ICE" 对消息进行异或操作。为了实现这个目标,我必须枚举密钥索引和消息,同时确保使用密钥的模运算来循环遍历它。
但是,我遇到了 TypeError: 'int' object is not callable 的问题。
我不确定如何修复这个问题。非常感谢任何建议。以下是所有的代码。
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
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()
注意:我已经将代码中的错误进行了修复,将变量名 "bytes" 改为 "byte" 并将双引号替换为单引号。
英文:
Trying to XOR a message byte by byte with a given key b"ICE". To do this I have to enumerate through the key indices and message whilst making sure to use the modulo of the key to loop through it.
However, I'm getting the TypeError: 'int' object is not callable.
I'm not sure how to fix this. Any advice is much appreciated. All code is below.
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()
答案1
得分: 1
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
英文:
bytes
is a built-in which you are overriding.
You probably meant:
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
答案2
得分: 0
如前一答案所述,您正在覆盖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.\'(/''
英文:
As said in the previous answer, you are overriding bytes
creating a variable with the same name.
I would suggest to exploit python's elegant features and libraries, avoid indexing and optimise the code
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()
Which produces
b'\x0b67\'*+.cb,.ii*#i:*<c$ -b=c4<*&"c$\'\'e\'*(+/ C\ne.,e*1$3:e>+ \'c\x0ci+ (1e(c&0.\'(/'
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论