Python 用所有可能的小写字母组合组成的密钥解密异或字符串的函数

Python 用所有可能的小写字母组合组成的密钥解密异或字符串的函数,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

我收到了一个挑战,现在我有点卡住了。基本上,我得到了一个被XORD的ASCII码列表。我们知道钥匙的大小是5,小写英文字母。我读过不同的解密方法,从频率分析和python工具的使用(比如xortool),但我没有设法让它们工作。Xortool与参数-L5-o一起使用,我收到了上百个乱七八糟的结果

在本例中,我将仅使用上述ASCII码的前5个代码。完整消息的长度为1125

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)