这是我目前正在学习的现代密码学课程。
挑战是 cryptopals 挑战 3:单字节 XOR 密码,我正在尝试使用 python 3 来帮助完成此任务。
我知道我应该对字符串进行异或并转换为英语。十六进制字符串为“1b37373331363f78151b7f2b783431333d78397828372d363c78373e783a393b3736”,转换为“806748453371902409051174291875458592743800” 337585421566549206796642836053682239286”十进制形式。
我已将其与多个十六进制字节组合(2 个十六进制数字)进行异或,但我不知道如何将其转换为英语。此时是否只是暴力和有根据的猜测?
我知道 ETAOIN SHRDLU,但这并没有真正有帮助。
感谢您的时间和帮助。
添加:
另外,我尝试了挑战#4,但这段代码似乎不起作用。但它确实适用于挑战#3,所以我很困惑。
挑战#3 http://cryptopals.com/sets/1/challenges/3
挑战 #4 http://cryptopals.com/sets/1/challenges/4
您可以使用binascii.hexlify https://docs.python.org/3/library/binascii.html#binascii.hexlify, binascii.unhexlify https://docs.python.org/3/library/binascii.html#binascii.unhexlify将字节字符串转换为十六进制,反之亦然:
>>> import binascii
>>> binascii.hexlify(b'HELLO') # to Hex
b'48454c4c4f'
>>> binascii.unhexlify('48454c4c4f') # from Hex
b'HELLO'
Using str.isprintable https://docs.python.org/3/library/stdtypes.html#str.isprintable,您可以过滤掉不可打印的候选者:
>>> 'abcd'.isprintable()
True
>>> '\x00'.isprintable()
False
>>> '\x7f'.isprintable()
False
import binascii
encoded = binascii.unhexlify('1b37373331363f78151b7f2b783431333d78397828372d363c78373e783a393b3736')
for xor_key in range(256):
decoded = ''.join(chr(b ^ xor_key) for b in encoded)
if decoded.isprintable():
print(xor_key, decoded)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)