Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有所需函数的Python Vigenere密码_Python_Caesar Cipher_Vigenere - Fatal编程技术网

具有所需函数的Python Vigenere密码

具有所需函数的Python Vigenere密码,python,caesar-cipher,vigenere,Python,Caesar Cipher,Vigenere,我正在学习一门在线课程,让我们创建凯撒密码和维格纳密码,但我们首先创建了两个函数;一个是找到字母在字母表变量中的位置,另一个是将一个给定的字符旋转给定的次数(我已经看到ord()和chr()工作得更好,但我想这个赋值让我们现在把重点放在更简单的概念上) 我能够让凯撒函数工作,但不确定如何继续使用维格纳密码。我看了很多视频,环顾了这个网站,但没有发现任何允许保留空格和非字母字符的内容。有人能告诉我如何启动vigenere函数的正确方向吗 #Create function alphabet_posi

我正在学习一门在线课程,让我们创建凯撒密码和维格纳密码,但我们首先创建了两个函数;一个是找到字母在字母表变量中的位置,另一个是将一个给定的字符旋转给定的次数(我已经看到ord()和chr()工作得更好,但我想这个赋值让我们现在把重点放在更简单的概念上)

我能够让凯撒函数工作,但不确定如何继续使用维格纳密码。我看了很多视频,环顾了这个网站,但没有发现任何允许保留空格和非字母字符的内容。有人能告诉我如何启动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()

根据我的意见;将所有可打印内容作为字母表使用:

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!

让你的字母表覆盖你想要的任何字符;添加
%len(字母表)
。使用
rot
进行加密;用
len(字母表)-rot进行解密。你是说我应该把模len(字母表)放在哪里?在我当前的加密功能中?在
中旋转\u字符
而不是
%26
…非常感谢,我将尽快进行测试。我是这个网站的新手,我可以上传评论吗?我想确保它有效-因此必须测试它并粘贴作为答案…作业让我们使用字母表作为字符串,所以我猜我可以用你给我的字符串代替我的字符串吗?此外,我以前也没有遇到过“”。join。这只是把所有的部分加回到一个字符串中吗?是的&是的。只要试着插入你想要的任何字母表。我试过你的答案,大多数情况下都有效,但不幸的是,作业要求我们保留非字母字符。所以!将仍然是一个好朋友!即使加密了,空格也是一样。好的,更新了。
静态字母表中的字符不会改变。(顺便说一下,
字母表
静态字母表
都是字符串)。非常感谢!