我的vigenere密码加密函数有什么问题?

问题描述:

我得到的错误字符串索引超出范围内的加密函数我不知道如何得到腐烂重复文本。该代码仅在两个输入具有相同长度时才起作用。如果可以,我想让alphabet_position和rotate_character功能保持一致。我的vigenere密码加密函数有什么问题?

alpha_lower_list = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", 
"l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"] 
alpha_upper_list = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", 
"L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"] 

def alphabet_position(letter):  
    if letter in alpha_upper_list: 
     return alpha_upper_list.index(letter) 
    else: 
     return alpha_lower_list.index(letter) 

def rotate_character(char, rot): 
    rotated_letter = '' 
    if char.isalpha(): 
     rotate = alphabet_position(char) + rot 
     if rotate < 26: 
      if char in alpha_upper_list: 
       rotated_letter = alpha_upper_list[rotate] 
       return(rotated_letter) 
      else: 
       rotated_letter = alpha_lower_list[rotate] 
       return(rotated_letter) 
     else: 
      if char in alpha_upper_list: 
       rotated_letter = alpha_upper_list[rotate % 26] 
       return(rotated_letter) 
      else: 
       rotated_letter = alpha_lower_list[rotate % 26] 
       return(rotated_letter) 
    else: 
     return(char) 

def encrypt(text, rot): 
    lis = [] 
    for i in range(len(text)): 
     lis.append(rotate_character(text[i], alphabet_position(rot[i]))) 

    return (''.join(lis)) 

def main(): 
    user_text = input("Type a message: ") 
    rotate_by = input("Rotate by: ") 

    print(encrypt(user_text, rotate_by)) 

if __name__ == '__main__': 
    main() 

你在你的程序的第36行使用迭代中rot[i]走出界外 - i将上升到您的明文的长度,可以比的关键更大。

尝试通过密钥的长度做一个模块DIV,这样你应该环绕很好的关键:你仍然不满意你的脚本返回的结果

lis.append(rotate_character(text[i], alphabet_position(rot[i % len(rot)])))

编辑,所以我挖得更深一点。潜在的问题是,你试图实现Vigenere的一些在线工具叫做“增强模式”:既不是纯文本文件,也不是密文文件,它们可能来自[a-zA-Z],但可能是“特殊字符”。从[0-9]元素或字符,如<space><

如果您的脚本遇到一个特殊字符,它不会旋转,而是复制过来,不被作为else分枝的rotate_character完成的;这是对的。然而,在encrypt()中,您将消耗我们称之为“keysymbol”的,每符号表示您遇到的明文。这意味着,实际上,您正在“浪费”明文符号上的密钥符号,该符号在所有都不会被加密(vulgo旋转)。

一旦你意识到这一点,修复就变得很明显:当我们遇到一个特殊字符时,将它复制到输出列表中,但是不要推进密钥流。如果我们实际需要使用密钥符号,则密钥流只应该先进。

翻译成代码:

def encrypt(text, rot): 
    lis = [] 
    keystream = 0 
    for i in range(len(text)): 
     keychar = keystream % len(rot) 
     if text[i].isalpha(): 
      lis.append(rotate_character(text[i], alphabet_position(rot[keychar]))) 
      keystream += 1 
     else: 
      lis.append(text[i]) 

    return (''.join(lis)) 
+0

谢谢你,我只需要弄清楚如何返回此: 'Feqwgba shiquann

+0

能您请提供明文和密钥,在该密码下加密是有效的输出?这将缓解跟踪bug ... –

+0

这是输入vigenere.encrypt('航行 shiquann