如何在避免标点符号的Vigenère密码中生成密钥

How to generate key in Vigenère cipher which avoid punctuation marks

我必须编写 Vigenère 密码,但我遇到了问题。如何修改代码以获取忽略 space、回车、逗号等的密钥?

def generateKey(string, key):
    key = list(key)
    x = []
    if len(string) == len(key):
        return (key)
    else:
        for i in range(len(string)):
            x.append(key[i % len(key)])
    return ("".join(x))


    m = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor 
    incididunt ut labore et dolore magna aliqua."
    k = 'test'
    key = generateKey(m,k)
    print(key)

输入:

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

输出:

testtesttesttesttesttesttesttesttesttesttesttesttesttest

我想要这个:

testt estte sttes tes ttes, ttesttestte sttesttest test, tes tt esttest testte sttesttest testte st testte sttes ttestt.

可能 str.isalpha 就是您所需要的。

def generate_key(string, key):
    key_len = len(key)
    if len(string) == key_len:
        return key
    x = []
    i = 0
    for char in string:
        if char.isalpha():
            x.append(key[i % key_len])
            i += 1
        else:
            x.append(char)
    return "".join(x)

m = ("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor" 
     "incididunt ut labore et dolore magna aliqua.")
k = 'test'
key = generate_key(m,k)
print(key)
# 'testt estte sttes tte stte, sttesttestt esttesttes ttes, tte st testtes ttestt esttesttes tt esttes tt esttes ttest testte.'

为了更加 pythonic 并避免索引操作,您可以使用 itertools.cycle:

from itertools import cycle

def generate_key(string, key):
    if len(string) == len(key):
        return key
    key_iter = cycle(key)
    return ''.join(next(key_iter) if char.isalpha() else char for char in string)

请注意,您的预期输出有误(第 4 个单词中缺少“t”)。