我的 vigenere 密码加密功能有什么问题?

shiquann

我得到的错误字符串索引超出了加密函数的范围我不知道如何让 rot 重复文本。该代码仅在两个输入的长度相同时才有效。如果可以的话,我想保持字母表位置和旋转字符功能相同。

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()
奥利弗·鲍曼

通过rot[i]在程序的第 36 行中使用迭代器,您i越界-将达到明文的长度,该长度可能大于密钥。

尝试按键的长度做一个模块 div,这样你应该很好地环绕键:

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

编辑您仍然对脚本返回的结果不满意,所以我挖得更深一些。根本的问题是,你想实现什么样的一些在线工具的V @ genere呼叫“增强模式”:既不用简易也不密文被保证的广告是从[a-zA-Z],但可能会“特殊字符”,例如从元素[0-9]或字符,如<space><等.

如果您的脚本遇到特殊字符,它不会旋转它,而是按原样复制它,就像在;else-branch 中所做的那样rotate_character这是对的。encrypt()但是,中,您为遇到的明文的每个符号消耗了我们称之为“密钥符号”的东西。这意味着实际上您正在“浪费”一个根本不会加密(vulgo 旋转)的明文符号上的密钥符号

一旦你意识到这一点,修复就很明显了:当我们遇到一个特殊字符时,将它复制到输出列表中,但不要推进 keystream仅当我们确实需要使用密钥符号时,才应推进密钥流。

翻译成代码:

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))

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我的CS50 Vigenere密码程序有什么问题?

来自分类Dev

我的功能有什么问题?

来自分类Dev

我的主要功能有什么问题

来自分类Dev

我的比较功能有什么问题?

来自分类Dev

为什么我的Vigenere小字母加密功能无法正常工作?

来自分类Dev

我的(密码)功能出了什么问题?

来自分类Dev

此功能有什么问题?它使我的程序崩溃而没有错误

来自分类Dev

我的boost phoenix惰性功能有什么问题?

来自分类Dev

我的增强凤凰惰性功能有什么问题?

来自分类Dev

我的哈希键类型和功能有什么问题?

来自分类Dev

Vigenere的C密码

来自分类Dev

Vigenere密码无法正确编码

来自分类Dev

我的“Vigenere CS 50”项目效果不佳

来自分类Dev

我没有收到 Firebase 通知。我的代码可能有什么问题?

来自分类Dev

我的寻找圆线碰撞解决方案的函数可能有什么问题?

来自分类Dev

我的依赖项或权限可能有什么问题?

来自分类Dev

Vigenere密码在C中不起作用

来自分类Dev

修改过的Vigenere密码在python中-字母

来自分类Dev

Vigenere密码不能正常工作吗?

来自分类Dev

Vigenere密码破坏了一些

来自分类Dev

如何在C中调试Vigenere密码?

来自分类Dev

Vigenere密码在C中不起作用

来自分类Dev

如何忽略 Vigenere 密码中的空格?

来自分类Dev

我的替换功能有问题

来自分类Dev

UndefinedBehaviorSanitiser问题-CS50 Vigenere

来自分类Dev

我的清理功能出了什么问题?

来自分类Dev

我的清洁功能出了什么问题?

来自分类Dev

我的邮件功能出了什么问题?

来自分类Dev

我的功能出了什么问题