具有所需功能的 Python Vigenere Cipher

Posted

技术标签:

【中文标题】具有所需功能的 Python Vigenere Cipher【英文标题】:Python Vigenere Cipher with required functions 【发布时间】:2017-06-19 15:17:19 【问题描述】:

我正在做一个在线课程,让我们创建凯撒密码和维吉尼密码,但我们首先创建了两个函数;一种是在字母表变量中找到一个字母的位置,另一种是把一个给定的字符旋转给定的次数(我已经看到 ord() 和 chr() 工作得更好,但是这个任务希望我们专注于更简单的概念现在,我猜)。

我能够让凯撒函数正常工作,但不确定如何继续使用 vigenere 密码。我看了很多视频并环顾了这个网站,但没有找到任何允许保留空格和非字母字符的视频。谁能指出我如何启动 vigenere 功能的正确方向?

#Create function alphabet_position(letter) to turn letter into number
#such as a=0 or e=4, using lowercase to make sure case doesnt matter.
def alphabet_position(letter):
    alphabet ="abcdefghijklmnopqrstuvwxyz" #Lists alphabet for a key
    lower_letter = letter.lower()   #Makes any input lowercase.
    return alphabet.index(lower_letter) #Returns the position of input as a number.

def rotate_character(char, rot):
    alphabet = "abcdefghijklmnopqrstuvwxyz"
    if char.isalpha():
        a = alphabet_position(char)
        a = (a + rot) % 26            #needs modulo
        a = (alphabet[a])
        if char.isupper():
            a = a.title()
        return a
    else:
       return char

def encrypt(text, rot):
    list1 = ""
    for char in text:
        list1 += rotate_character(char, rot)
    return list1



def main():
    x = input("Type a message: ")
    y = input("Rotate by: ")
    #result = rotate_character(x, y)  #Not needed once encrypt function works.
    result = encrypt(x, y)
    print (result)

if __name__ == '__main__':
    main()

【问题讨论】:

让你的字母覆盖你想要的任何字符;添加% len(alphabet)。用rot加密;用len(alphabet)-rot解密。 你说我应该把模Len(字母)放在哪里?在我当前的加密功能中? rotate_character 而不是% 26... 非常感谢,我会尽快测试。我是这个网站的新手,我可以投票给 cmets 吗? 想要确保它有效 - 因此必须对其进行测试并粘贴为答案... 【参考方案1】:

关注我的cmets;使用所有可打印文件作为字母:

from string import ascii_letters, digits, punctuation, whitespace

ALPHABET = ascii_letters + digits
STATIC_ALPHABET = punctuation + whitespace

# minor speedup
ALPHA_INDEX = a: i for i, a in enumerate(ALPHABET)
STATIC_ALPHABET_SET = set(STATIC_ALPHABET)
MOD = len(ALPHABET)

def encrypt(char, key):
    if char in STATIC_ALPHABET_SET:
        return char
    else:
        return ALPHABET[(ALPHA_INDEX[char] + key) % MOD]

def decrypt(char, key):
    if char in STATIC_ALPHABET_SET:
        return char
    else:
        return ALPHABET[(ALPHA_INDEX[char] + MOD - key) % MOD]

key = 17
plain = 'Hello World!'
enc = ''.join(encrypt(char, key) for char in plain)
print(enc)  # YvCCF dFICu!
dec = ''.join(decrypt(char, key) for char in enc)
print(dec)  # Hello World!

【讨论】:

这个作业让我们使用字母表作为字符串,所以我猜我可以用你的字符串代替我的字符串?另外,我之前没有遇到过''.join。这只是将所有部分添加回一个字符串吗? 是的,是的。试着插入你想要的任何字母。 我尝试了您的答案,并且在大多数情况下它有效,但不幸的是,任务希望我们保留非字母字符。所以 !将保持一个!即使加密,空格也是如此。 好的,已更新。 STATIC_ALPHABET 中的字符不会保持不变。 (顺便说一句,ALPHABETSTATIC_ALPHABET 都是字符串)。 非常感谢!

以上是关于具有所需功能的 Python Vigenere Cipher的主要内容,如果未能解决你的问题,请参考以下文章

java中的ASCII Vigenere密码实现

Python:解码使用仿射密码编码的 Vigenere 密码

python中的Vigenere密码[关闭]

vigenere密码c语言

python 用Python实现的Vigenere密码。

Python 中的 Vigenere 密码