我构建了一个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/