ASCII包围凯撒密码



我想做一个凯撒密码,这是我的代码

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'

最新更新