XoR 两个十六进制
XoR two Hexadecimal
所以我试图找到一个时间垫的密钥,我有 10 个密文。(明文字母被编码为 8 位 ASCII
并且给定的密文是用十六进制写的;我正在使用 python 2.7)
这个想法是,当你用 space 对一个字符进行异或时,该字符会变成大写或小写,而当你将 x 与 x 进行异或时,它 return 为零,所以当我对的两个字符进行异或时对于密文,我将密钥与密钥和消息字符与消息字符异或。
所以我写了这段代码来异或两个十六进制。
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 函数工作正常,但当键为奇数时,它不会 return 相同的字符大写或小写。
我做错了什么?
关于如何解决这个问题的总体思路,忽略 python:
让我们先说一个字符是 8 位 ascii
如果您查看第一个密文的第一个字符,您可能会注意到它在纯文本的 ascii 值之外,可以说是 a-z 0x61-0x7a A-Z 0x41-0x5a
很可能您只需要考虑值,与此字符异或,使其在指定值范围内
其他 9 个文本及其各自的第一个字符也是如此
而且,有趣的是,对于具有相同密钥的每个密文,此字符的可能密钥值列表必须保持不变,因此我们查看的每个密文都进一步缩小了范围
现在,您可以用这种方法做什么?
写一个函数,接受2个参数(字节),测试异或的结果是否落在指定范围内,如果是,return1,如果没有return0
现在创建 3 个嵌套循环来调用此函数
外层循环(X)遍历密文中的字符位置
中间循环 (Y) 从 0 到 255
内循环 (Z) 遍历密文
在内部循环中调用您的函数,参数 1 是 Z 密文的 X 字符,参数 2 是 Y
现在如何处理结果:
你想要一个 dictionary/lookup table 每个位置 X 包含一个包含 255 个元素的数组
这些元素的索引将为 Y
这些元素的值将是所有 Z
的函数结果之和
最后你将得到的是密文中的每个位置,一个数组告诉你每个密钥字节它是密钥的可能性有多大...值越高,成为密钥字节的可能性就越高
然后对于密文中的每个位置,按概率排序可能的密钥字节,并按概率划分它们
然后取所有密文的一部分,比如说前 8 到 16 个字符,并计算最高概率组中所有密钥的明文
将密钥块和明文块一起存储在列表中
现在根据普通词典测试您的可能明文列表,如果它们包含可以在词典中找到的单词,则再次将它们评为 1,否则为 0...总结所有不同的密文...(或使用另一个指标来评估密钥的好坏)
按最高值对密钥块进行排序(阅读:可能解决所有密文中最多块的密钥排在第一位,产生垃圾的密钥排在最后)并继续下一个块...
用更大的块重复此操作,不选择密钥字节,而是选择下一个较小大小的密钥块,直到您的块大小达到密文大小...
当然,这是一种自动查找可能密钥的方法,在您拥有完全自动化的解决方案之前,还有一些实施工作。如果你只想解决这 10 个密文,你可以在可能的 keybytes 或第一个块之后中止该方法,并手动完成其余部分 ...
所以我试图找到一个时间垫的密钥,我有 10 个密文。(明文字母被编码为 8 位 ASCII 并且给定的密文是用十六进制写的;我正在使用 python 2.7)
这个想法是,当你用 space 对一个字符进行异或时,该字符会变成大写或小写,而当你将 x 与 x 进行异或时,它 return 为零,所以当我对的两个字符进行异或时对于密文,我将密钥与密钥和消息字符与消息字符异或。 所以我写了这段代码来异或两个十六进制。
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 函数工作正常,但当键为奇数时,它不会 return 相同的字符大写或小写。
我做错了什么?
关于如何解决这个问题的总体思路,忽略 python:
让我们先说一个字符是 8 位 ascii
如果您查看第一个密文的第一个字符,您可能会注意到它在纯文本的 ascii 值之外,可以说是 a-z 0x61-0x7a A-Z 0x41-0x5a
很可能您只需要考虑值,与此字符异或,使其在指定值范围内
其他 9 个文本及其各自的第一个字符也是如此
而且,有趣的是,对于具有相同密钥的每个密文,此字符的可能密钥值列表必须保持不变,因此我们查看的每个密文都进一步缩小了范围
现在,您可以用这种方法做什么?
写一个函数,接受2个参数(字节),测试异或的结果是否落在指定范围内,如果是,return1,如果没有return0
现在创建 3 个嵌套循环来调用此函数
外层循环(X)遍历密文中的字符位置 中间循环 (Y) 从 0 到 255 内循环 (Z) 遍历密文
在内部循环中调用您的函数,参数 1 是 Z 密文的 X 字符,参数 2 是 Y
现在如何处理结果:
你想要一个 dictionary/lookup table 每个位置 X 包含一个包含 255 个元素的数组
这些元素的索引将为 Y 这些元素的值将是所有 Z
的函数结果之和最后你将得到的是密文中的每个位置,一个数组告诉你每个密钥字节它是密钥的可能性有多大...值越高,成为密钥字节的可能性就越高
然后对于密文中的每个位置,按概率排序可能的密钥字节,并按概率划分它们
然后取所有密文的一部分,比如说前 8 到 16 个字符,并计算最高概率组中所有密钥的明文
将密钥块和明文块一起存储在列表中
现在根据普通词典测试您的可能明文列表,如果它们包含可以在词典中找到的单词,则再次将它们评为 1,否则为 0...总结所有不同的密文...(或使用另一个指标来评估密钥的好坏)
按最高值对密钥块进行排序(阅读:可能解决所有密文中最多块的密钥排在第一位,产生垃圾的密钥排在最后)并继续下一个块...
用更大的块重复此操作,不选择密钥字节,而是选择下一个较小大小的密钥块,直到您的块大小达到密文大小...
当然,这是一种自动查找可能密钥的方法,在您拥有完全自动化的解决方案之前,还有一些实施工作。如果你只想解决这 10 个密文,你可以在可能的 keybytes 或第一个块之后中止该方法,并手动完成其余部分 ...