2016-11-09 144 views
0

所以我试图找到一个时间键的密钥,我有10个密文(明文字母编码为8位ASCII 和给定的密文写在十六进制;我是使用python 2.7)XoR两个十六进制

这个想法是,当你使用空格字符时,字符会变成大写或小写字母,而当你使用x变换x时,它会返回零,所以当我将两个字符变为密文时,与密钥和消息字符一起使用消息字符。 所以我写了这个代码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

如果你有10个使用相同的One Time Pad的密文,那么它不是一个时间片,而是一个十时间片。如果它是一个真正的One Time Pad,那么你找不到密钥,你所能做的就是找到所有可能产生可理解输​​出的密钥。 – rossum

+0

它们都用同一个密钥加密,练习的黄金是找钥匙 –

+0

十个时间垫是可以解决的。只要为每个位置尝试不同的关键字母,直到所有十个文本都有意义。 – rossum

回答

0

如何解决这个问题,无论Python中的总体思路:

让我们开始说一个char是8位ASCII

,如果你看一下第一个字符形式的第一密文,你可能会注意到它在纯文本的ascii值之外,可以说是az 0x61-0x5a AZ 0x41-0x5a

很有可能你只需要考虑使用此char字符进行存储的值,它在指定的范围内的东西

对于其他9个文本和它们各自的第一个字符也是一样的,所以我们看起来每一个密文都必须适用于每个具有相同密钥的密文的这个字符的可能密钥值的列表,所以有趣的是,这个字符的可能密钥值的列表必须保持不变在进一步降低范围

现在,你可以用这种方法做什么?

写一个函数,采用2个参数(字节)和测试一个异或的结果落入规定的范围,如果是,则返回1,如果没有返回0

现在使3个嵌套循环来调用这个功能

外环(X)经过在所述密文 中间环路(Y)的炭位置从0到255 内环(Z)穿过密文

在内部循环调用函数

参数1是Z密文和参数的X字符2为Y

现在做什么用的结果:

你想拥有一本字典/查找表,每个位置X拥有255个元素

这些元素的指数为Y数组

这些元素的值将成为所有函数结果的总和,最终你所拥有的是密文中的每个位置,这是一个数组,它告诉你每个keybyte它是多么可能是密钥的数组。 ...该值越高的在你的密文顺序是关键字节

然后为每个位置由它们的概率可能keybytes和概率划分他们

然后采取所有的密文的块的可能性就越高,可以说第8到16个字符,并计算出明文的概率最高组

存储键块和纯文本块中的所有键一起在列表

现在测试您对常见的字典可能明文的列表,如果它们包含单词t,再次评价它们1帽子可以在字典中找到,否则为0 ...总结所有不同的密文......(或者使用另一个度量来评价密钥的好坏)

以最高值排序密钥块(阅读:潜在地解决了所有密文中大部分块的关键是先出现并且产生垃圾的关键字最后)并继续下一个块...

用更大的块重复此操作,选择不是关键字,而是选择下一个更小的大小关键块,直到你的块大小达到密文大小...

当然这是一个自动化的方式来找到一个可能的关键,有一些实施工作,直到你有一个完全自动化解决方案。如果你只是想解决这10个密文,你可以在可能的关键字或第一个块之后放弃该方法,然后用手完成其余的部分...