Vigenere 没有在 python 中加密我的消息

Posted

技术标签:

【中文标题】Vigenere 没有在 python 中加密我的消息【英文标题】:Vigenere not encrypting my message in python 【发布时间】:2017-05-30 20:32:49 【问题描述】:

所以我一直在完成一项使用创建凯撒和维吉尼密码的任务。我已经创建了凯撒密码,并且几乎完成了 vigenere。我遇到的问题在于实际的加密本身。在我的代码中,我已经把标点符号和大小写都搞定了,但是当我只使用 print 来测试我的函数时,它只会向我吐出同样的短语。我不确定问题是否在于我的函数在执行其余函数之前读取关键字,或者我只是错过了一些东西。任何帮助将不胜感激!

def alphabet_position(letter):
    alphabet_pos = 'A':0, 'a':0, 'B':1, 'b':1, 'C':2, 'c':2, 'D':3,
'd':3, 'E':4, 'e':4, 'F':5, 'f':5, 'G':6, 'g':6, 'H':7, 'h':7, 'I':8,
'i':8, 'J':9, 'j':9, 'K':10, 'k':10, 'L':11, 'l':11, 'M':12, 'm':12,
'N': 13, 'n':13, 'O':14, 'o':14, 'P':15, 'p':15, 'Q':16, 'q':16,
'R':17, 'r':17, 'S':18, 's':18, 'T':19, 't':19, 'U':20, 'u':20, 'V':21,
'v':21, 'W':22, 'w':22, 'X':23, 'x':23, 'Y':24, 'y':24, 'Z':25, 'z':25

    pos = alphabet_pos[letter]
    return pos

def rotate_character(char, rot):
    if (ord(char) >= 97) and (ord(char) <= 122): # lowercase
        return chr(97+(alphabet_position(char)+rot)%26)
    elif (ord(char) >= 65) and (ord(char) <=90): # uppercase
        return chr(65+(alphabet_position(char)+rot)%26)
    else:
        return char

def encrypt(text, key):
    encrypted = []    
    starting_index = 0
    for letter in text:
    # if it's alphanumerical, keep it that way
    # find alphabet position
        rotation = alphabet_position(key[starting_index])
            # if it's a space or non-alphabetical character, append and move on
        if letter != alphabet_position:
            encrypted.append(letter)
        elif letter.isalpha():            
            encrypted.append(rotation(letter, rotation))             

    #if we've reached last index, reset to zero, otherwise + by 1
        if starting_index == (len(key) - 1): 
            starting_index = 0
        else: 
            starting_index += 1

    return ''.join(encrypted)  

【问题讨论】:

你永远不会打电话给rotate_character()rotation(letter, rotation) 无效,因为 rotation 是一个数字。 if letter != alphabet_position: 不检查 letter 是否为字母。 如果字母不是字母,alphabet_position() 会出错。您对此没有任何检查。 为什么不直接使用ord(letter.lower)-97而不是字典? 我们刚刚在课堂上学习了字典,所以我的老师希望我们使用字典。 alphabet_position() 不只是引用第一个只有字母的函数吗?还是那里没有调用该函数? 【参考方案1】:

你的问题出在这一行:

  if letter != alphabet_position:

由于alphabet_position是一个函数,它总是与字母不同。因此,您执行下一条指令,将letter 按原样附加到结果中。

【讨论】:

那么这是否意味着它就像更改条件一样简单?或者我是否需要修改该声明以及上面的一些声明?我觉得条件上面的那行也是错误的,因为它里面有这个功能。 正如 Barmar 上面指出的,您的代码中还有一些其他问题,但这直接导致您的输出与输入相同。【参考方案2】:

这一行:

if letter != alphabet_position:

不知道letter 是否是字母。它只是将letter(一个字符串)的值与alphabet_position(一个函数)的值进行比较,它们永远不会相等。所以它总是运行那个代码块,它只是将字母添加到encrypted

您可以为此使用string.isalpha() 函数。

if not letter.isalpha():

您还可以将 alphabet_pos 字典设为全局变量,然后使用:

if letter not in alphabet_pos:

【讨论】:

以上是关于Vigenere 没有在 python 中加密我的消息的主要内容,如果未能解决你的问题,请参考以下文章

Vigenere 密码破坏了一些

Python Vigenere 代码重复错误

vigenere密码中的itertools循环导致空间问题python

python 简单的加密/解密算法(Vigenere密码)

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

我的 Vigenere 加密程序中的分段错误