基于明文密钥的Vigenere变种解密实现技术求助
变种维吉尼亚密码解密实现求助
我是一名数学家,编程能力有限,手里有一套常规的维吉尼亚加解密Python代码,现在想实现一种变种解密逻辑:密钥即为明文本身,已知密钥的首字母a₀,需要先用a₀解密出密钥的下一个字母a₁,再用a₁解密得到a₂,以此类推完成整个解密过程。举个实际例子:密文为JLPWZ,已知密钥首字母是Q,经过迭代解密后得到明文HELLO。
现寻求相关技术提示或帮助,我目前的代码如下(注:代码存在语法错误,暂无法正常运行):
from random import sample from itertools import product as col def generator(key, char, length): char_len = key.count(char) key_piece = key[:length - char_len:] # 原代码此处缩进错误,且字符串拼接语法有误 list_keys = [key_piece+''.join(i) for i in list(col([chr(i) for i in range(65, 65+26)], repeat=char_len))] return list_keys def vigenere(x, key): lst_final = [] code = list(x) j = 0 for i, char in enumerate(code): if char.isalpha(): code[i] = key[(i+j)%len(key)] # 原代码未将cifrar作为参数传入函数 if cifrar: lst_final.append((ord(x[i]) + ord(code[i]) - 65 * 2) % 26) else: lst_final.append((ord(x[i]) - ord(code[i])) % 26) else: lst_final.append(ord(char)) j -=1 for i, char in enumerate(code): if char.isalpha(): lst_final[i] = chr(lst_final[i] + 65) else: lst_final[i] = chr(lst_final[i]) return ''.join(lst_final) print("Bienvenido al cifrado Vigenere") if input('Cifrar o Descifrar : ').lower() == 'cifrar': x = input('Ingrese el texto : ').upper() key = input('Ingrese la clave : ').upper() cifrar = True print(vigenere(x, key)) else: x = input('text : ').upper() cifrar = False if input('Tiene la clave? (y/n) : ') == "y": key = input('Ingrese la clave : ').upper() print(vigenere(x, key))
实现思路提示
- 先修正现有代码的语法错误:比如
generator函数未闭合、list_keys缩进错误、vigenere函数未接收cifrar参数、字符串拼接的引号问题等,这些基础错误会导致代码无法运行。 - 变种解密的核心是逐字符迭代解密:
- 第一步:用已知的密钥首字母解密密文的第一个字符,得到明文的第一个字符(也就是下一个密钥字符)。
- 后续每一步:用上一步解密得到的明文字符作为当前密钥,解密对应位置的密文字符,依次循环直到所有密文处理完毕。
- 可以单独封装一个单字符的维吉尼亚解密函数,方便在迭代过程中调用,简化逻辑。
- 保留原代码中对非字母字符的处理逻辑,遇到非字母时直接保留,不参与解密流程。
内容的提问来源于stack exchange,提问作者Luis Alexandher
相关产品推荐
相关产品推荐

