Python 用所有可能的小写字母组合组成的密钥解密异或字符串的函数
我收到了一个挑战,现在我有点卡住了。基本上,我得到了一个被XORD的ASCII码列表。我们知道钥匙的大小是5,小写英文字母。我读过不同的解密方法,从频率分析和python工具的使用(比如xortool),但我没有设法让它们工作。Xortool与参数-L5-o一起使用,我收到了上百个乱七八糟的结果 在本例中,我将仅使用上述ASCII码的前5个代码。完整消息的长度为1125Python 用所有可能的小写字母组合组成的密钥解密异或字符串的函数,python,encryption,xor,Python,Encryption,Xor,我收到了一个挑战,现在我有点卡住了。基本上,我得到了一个被XORD的ASCII码列表。我们知道钥匙的大小是5,小写英文字母。我读过不同的解密方法,从频率分析和python工具的使用(比如xortool),但我没有设法让它们工作。Xortool与参数-L5-o一起使用,我收到了上百个乱七八糟的结果 在本例中,我将仅使用上述ASCII码的前5个代码。完整消息的长度为1125 xor_min = ["49","29","1","67","42"] 转换为二进制的该值为: converted_min
xor_min = ["49","29","1","67","42"]
转换为二进制的该值为:
converted_min = ['00110001', '00011101', '00000001', '01000011', '00101010']
然后我做了一个单独的列表,包含字母表中的所有字母,小写,二进制形式
alph = list(string.ascii_lowercase)
bin_key = convert_to_bin((convert_to_ascii(alph)))
到目前为止,一切都很顺利。现在我要做的是用bin_键创建一个大小为5的键,其中包含26个键中所有可能的组合
key = list(itertools.combinations(bin_key, 5))
嗯。现在,key包含65780个元素,位于元组列表中。下一步是,对于xor_min中的每个元素,应使用键列表中的元组执行xor操作。这是我遇到问题的地方。这是我的全部代码:
def xor_list(xor_encrypted, max_key):
key = list(itertools.combinations(max_key, 5))
possible_xor = ['' for x in range(0, len(key))]
i = 0
for element in range(0, len(max_key)):
if i == 5:
i = 0
possible_xor[element] = operator.xor(int(xor_encrypted[i]), int(key[element][i]))
i+=1
return possible_xor
alph = list(string.ascii_lowercase)
bin_key = convert_to_bin((convert_to_ascii(alph)))
xor_min = ["49","29","1","67","42"]
converted_min = convert_to_bin(xor_min)
打印(异或列表(已转换的最小值、二进制键))
我得到的输出是:[1140048、1106871、1100010、2067215、1132123、1140048、1106871、1100010、2067215、1132452、1140048、1106871、1100010、2067215、1140073、1140048、1106871、1100010、1140048、1106871、1100010、2067214、1132122、1140048、“、”、“、”、“、”、……]
我知道我应该将整数转换为二进制,但是如果我在operator.xor中使用bin函数,我会收到一条错误消息:
possible_xor[element] = operator.xor(bin(int(xor_encrypted[i])), bin(int(key[element][i])))
TypeError: unsupported operand type(s) for ^: 'str' and 'str'
如果您有任何问题/澄清需要,请让我知道。此外,如果您有其他/更好的解决方案,请不要害怕分享。根据解密的5封信的结果,我会浏览一下,看看有什么意义。它应该是链接或英语单词的开头。首先,为什么您认为
itertools.compositions(max_key,5)
就足够了?
如果密钥包含重复的字母,例如“aaaaa”,该怎么办?您的方法不检查此类变体
但如果条件表明密钥不包含重复的字母,则它是确定的,您可以尝试此代码以查看所有可能的解密变体:
import itertools
import string
encrypted = [100, 101, 102, 103, 104]
alph = list(string.ascii_lowercase)
bin_key = [b for b in map(ord, alph)]
for i in itertools.combinations(bin_key, 5):
print([chr(i[k] ^ encrypted[k]) for k in range(5)])
我不明白为什么要将
xor\u min
中的项目转换为二进制字符串,然后将这些字符串视为带有int(xor\u加密[I])
的十进制数。此外,itertools.combinations
创建排序的组合而不重复。如果您确实希望从名为a
的列表或字符串中获得长度为5的所有可能组合,则需要笛卡尔乘积:product(a,repeat=5)
。对于26个字母,这将为您提供不同的组合。因此,最好直接迭代product
iterable,而不是将其输出存储在列表中。我似乎忽略了我需要product而不是组合的事实。非常感谢。我尝试了上面的方法,但是itertools.product的结果是元组列表,每个元素都是字符串。当我尝试这样做时,我得到一个错误,str^str不起作用。另外,我认为我需要在制作产品后将密钥转换回二进制。所以我有一个二进制文件的元组列表。然后我可以用它做一个异或运算。正确吗?尝试了如下操作:def xor\u list2(xor\u加密,key):可能的xor=[]对于i-in-key:可能的xor.append([chr(i[k]^xor\u-encrypted[k])对于范围内的k(1125)]返回可能的xor
1125-是消息的真实长度。尝试了类似的转换,不断地出现内存错误def convert_to_bin2(key_list):转换的_list=[]用于范围(0,len(key_list)):用于范围(0,5)中的元素:转换的_list.append(bin(int(key_list[tup][element],base=2)))返回已转换的\u列表
@Vanayad如果您需要将字符串值转换为int,并且加密列表中的值存储为类似于['100'、'101'、'102']的字符串,您可以简单地添加int转换,如下所示:打印([chr(i[k]^int(加密[k]),用于范围(5)]中的k)
。但是如果有像['1100100','1100101','1100110']这样的二进制字节格式,那么可以使用int()函数的第二个参数:print([chr(i[k]^int(encrypted[k],2))表示范围(5)中的k)