我想做一个凯撒密码,这是我的代码
def getinputfile(message):
list_ = []
with open(message, 'r') as lines:
content = lines.readlines()
for i in content:
list_.append(i.strip())
return list_
def decrpyt(list_):
decrypt_num = []
decrypt_list = []
sec_message = list_[1]
sec_key = int(list_[0])
for letter in sec_message :
uni_num = (ord(letter) - sec_key)
decrypt_num.append(uni_num)
for unicode in decrypt_num:
uni_letter = chr(unicode)
decrypt_list.append(uni_letter)
return decrypt_list
def main():
message = getinputfile('secretMessage1.txt')
decrpyted_message = decrpyt(message)
print(''.join(decrpyted_message))
main()
我得到的输出是CU4GXA:;2a:/54Y,我要祝贺你。现在我有点意识到问题了,那就是字母表中所有小写字母的ASCII码只有97 - 122,每当我从字母的单词中减去键时,它就超过了97和122。
我尝试使用%来解决这个问题(我不是100%确定如何使用模运算符),但我没有成功。
文本文件的内容为:
18
UgFYjSLMDsLAGFk
移动每个字母,使你旋转的字母表映射到0-25,应用转换,执行% 26
,然后将其移回来。
>>> def decrypt(message: str, key: int) -> str:
... def decrypt_letter(letter: str) -> str:
... alpha = ord('a' if letter.islower() else 'A')
... return chr((ord(letter) - alpha - key) % 26 + alpha)
... return ''.join(decrypt_letter(c) for c in message)
...
>>> with open('secretMessage1.txt') as file:
... key, message = file.readlines()
... print(decrypt(message.strip(), int(key.strip())))
...
CoNGrATULaTIONs
(编辑)如果您的输出实际上不需要保留大小写,则decrypt
函数变得更简单—只需小写消息,然后您可以忽略islower()
检查。
>>> def decrypt(message: str, key: int) -> str:
... return ''.join(
... chr((ord(c) - ord('a') - key) % 26 + ord('a'))
... for c in message.lower()
... )
...
>>> decrypt("UgFYjSLMDsLAGFk", 18)
'congratulations'