所以我试图找到一个时间键的键,我有10个密文。(明文字母编码为8位ASCII 并且给定的密文是用十六进制写的;我正在使用python 2.7)
这个想法是当你用一个空格的字符xor得到大写或小写时,当xx x用x时它返回零所以当我xor两个字符到ciphertexts我xor键与键和带有消息字符的消息字符。 所以我写了这个代码用于xoring两个十六进制。
def hex_to_text(s):
string=binascii.unhexlify(s)
return string
def XoR (a,b):
a="0x"+a
b="0x"+b
xor=chr(int(a,16) ^ int(b,16))
return hex_to_text(xor[2:])
当键是偶数时,xor函数的工作正常,但当键为奇数时,它不会返回相同的大写或小写字符。
我做错了什么?
答案 0 :(得分:0)
关于如何解决这个问题的一般想法,无视python:
让我们先说一下char是8位ascii
如果你看第一个字形第一个密文,你可能会注意到它超出了纯文本的ascii值,可以说是a-z 0x61-0x7a A-Z 0x41-0x5a
很有可能你只需要考虑这个值,使用这个char,使其成为指定值范围内的值
同样适用于其他9个文本及其各自的第一个字符
并且,有趣的是,此char的可能键值列表必须保持每个具有相同键的密文,因此我们看到的每个密文都会进一步缩小范围
现在,你可以用这种方法做什么?
编写一个带有2个参数(字节)的函数,并测试xor的结果是否落入指定范围,如果是,则返回1,如果没有返回0
现在制作3个嵌套循环来调用此函数
外部循环(X)遍历密文中的char位置 中间循环(Y)从0到255 内环(Z)通过密文
在内部循环中调用函数,参数1是Z密文的X字符,参数2是Y
现在该如何处理结果:
你想拥有一个字典/查找表,每个位置X包含255个元素的数组
这些元素的索引将为Y. 这些元素的值将是所有Z
的函数结果的总和最后你所拥有的是密文中的每个位置,一个数组告诉你每个keybyte键的可能性......值越高,成为关键字节的概率越高
然后对于密文中的每个位置按可能的密钥字节顺序排列它们的概率
然后取一大块所有密文,让我们说出前8到16个字符,然后计算最高概率组中所有密钥的明文
将密钥块和明文块一起存储在列表中
现在测试你对普通词典的可能明文的列表,如果它们包含可以在字典中找到的单词,则再次评级为1,否则为0 ...总结所有不同的密文...(或使用另一个衡量一个密钥有多好的度量标准
按最高值排序关键块(读取:可能解决所有密文中最多块的密钥首先出现,生成垃圾的密钥最后出现)并继续下一个块......
用更大的块重复此操作,选择不是keybytes而是选择下一个较小的key块,直到你的chunksize达到密文大小......
当然这是一种查找可能密钥的自动方式,在您拥有完全自动化的解决方案之前,还有一些实施工作。如果您只是想解决这10个密文,您可以在可能的密钥字节或第一个块之后中止该方法,并手动完成剩下的工作......