我构建了一个Vigenere密码功能,该功能工作得相当好,除了它没有通过运行它所需要的编码测试之外。

我认为这是由于我使用的是序数值,而测试希望我使用的函数只是旋转字符串字母。

我已经解决了处理非字母字符的问题,并使它可以同时使用大写和小写字符。但是,如果键具有大写或小写字符的任何变体,即键是小写而纯文本是大写,则似乎分崩离析。

def encrypt(text, key):
    cipher_text = []
    key = list(key)
    if len(text) == len(key):
        return(key)
    else:
        for i in range(len(text) -
                       len(key)):
            key.append(key[i % len(key)])
    for i in range(len(text)):
        a = text[i]
        if a.isalpha() and a.islower():
            x = ((ord(text[i]) + ord(key[i])-97) % 26 + 97)
            cipher_text.append(chr(x))
        elif a.isalpha() and a.isupper():
            x = ((ord(text[i]) + ord(key[i])-65) % 26 + 65)
            cipher_text.append(chr(x))
        else:
            cipher_text.append(a)

    return("" . join(cipher_text))


def main():
    mess = input(str("What is message?"))
    key = input("What is key?")
    print(encrypt(mess, key))

if __name__ == '__main__':
    main()


对于vigenere.encrypt('BaRFoo','BaZ')

    You should have returned this:
        'CaQGon'

    But you actually returned this:
        'PtDTha'

最佳答案

从您的单个示例看来,密钥似乎不区分大小写:

def encrypt_letter(c, k):
  if c.isupper():
    base = ord('A')
  else:
    base = ord('a')

  return chr((ord(c) - base + ord(k) - ord('a')) % 26 + base)

def encrypt(text, key):
    key = key.lower()

    return "".join([encrypt_letter(text[i], key[i % len(key)]) for i in range(len(text))])

def main():
    print(encrypt('BaRFoo', 'BaZ'))

if __name__ == '__main__':
    main()

关于python - Vigenere密码 key 无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57632253/

10-09 14:52