Vigenere 加密程序

Vigenere Encryption Program

我正在开发一个使用 Vingere 加密密码对用户输入的单词和密钥进行加密的程序。密钥可以是任意长度并且包含重复的字母。用户输入的单词的每个字母都使用其下关键字字母对应的 table 行进行加密。加密在此处使用以下 table:

我编写了代码的开头,但我不知道如何将加密部分添加到我的代码中。这是目前的程序:

    import string

phrase = input("Please enter the phrase to be encrypted: ")  #prompt user for phrase
key = input("Please enter the key: ")   #prompt user for encryption key


   
# This code returns the encrypted text generated with the help of the key
key = list(key)
if len(phrase) == len(key):
        print(key)
else:
        for i in range(len(phrase) -
                       len(key)):
            key.append(key[i % len(key)])
phrase = phrase.replace(" ", "")\
    .translate(str.maketrans('', '', phrase.punctuation))\
    .translate(str.maketrans('','',phrase.digits))\
    .upper()
print("" . join(key))

cipher_text = []
for i in range(len(phrase)):
        x = (ord(phrase[i]) +
             ord(key[i])) % 26
        x += ord('A')
        cipher_text.append(chr(x))
print("" . join(cipher_text))


print("Your word has been successfully encrypted!")
print("Original word: ", phrase)
print("Encryption: ", cipher_text)

我不确定从现在开始该做什么。我将尝试弄清楚如何获取加密代码,但我需要帮助才能使程序使用 Vigenere 密码加密用户输入和密钥。如果有人可以提供帮助,我将不胜感激。请显示您提供的任何输入的代码更改。提前致谢!

我觉得你很亲近。为了使密码正常工作,您还需要将密钥大写

key = key.upper()

否则,在你的计算中:

x = (ord(phrase[i]) +
             ord(key[i])) % 26

您将添加一个与小写字符 (key[i]) 而不是大写字符的 unicode 关联的数字。

换句话说,phrase[i]key[i] 的数字都应引用大写字符才能进行计算。

进行此更改后,我使用短语 "hello" 和键 "richard" 得到以下输出:

Encryption:  ['Y', 'M', 'N', 'S', 'O']

这与图表一致(见下文)。

另外,词组清洗的部分应该是:

phrase = phrase.replace(" ", "")\
    .translate(str.maketrans('', '', string.punctuation))\
    .translate(str.maketrans('','',string.digits))\
    .upper()

我的完整代码如下:

import string

phrase = input("Please enter the phrase to be encrypted: ")  #prompt user for phrase
key = input("Please enter the key: ")   #prompt user for encryption key

key = key.upper()
   
# This code returns the encrypted text generated with the help of the key
key = list(key)
if len(phrase) == len(key):
        print(key)
else:
    for i in range(len(phrase) -
                    len(key)):
        key.append(key[i % len(key)])
phrase = phrase.replace(" ", "")\
    .translate(str.maketrans('', '', string.punctuation))\
    .translate(str.maketrans('','',string.digits))\
    .upper()
print("" . join(key))

cipher_text = []
for i in range(len(phrase)):
        x = (ord(phrase[i]) +
             ord(key[i])) % 26
        x += ord('A')
        
        cipher_text.append(chr(x))
print("".join(cipher_text))




print("Your word has been successfully encrypted!")
print("Original word: ", phrase)
print("Encryption: ", cipher_text)

为了更明确地说明加密工作,这里有一张图片显示了我的示例中每个单词的排列方式:

绿色圆圈表示根据密码加密后的结果。它匹配我们 Encryption: ['Y', 'M', 'N', 'S', 'O']

的输出结果