【问题标题】:ASCII wrap around with Caesar cipherASCII 环绕与凯撒密码
【发布时间】:2021-01-29 05:55:52
【问题描述】:

我正在尝试做一个凯撒密码,这是我的代码

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

【问题讨论】:

标签: python ascii caesar-cipher


【解决方案1】:

移动每个字母,使您正在旋转的字母映射到 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'

【讨论】:

  • 抱歉,我遗漏了一个重要细节,即输出必须全部为小写字母。
  • 这个重要的细节让解决方案变得相当容易,哈哈
  • 如何考虑文本中的空格
  • 看看我发布的第一个解决方案——看看有一个decrypt_letter 函数以不同的方式处理不同的字母?您可以让该函数检查某些内容是否根本不是字母,然后原封不动地返回。
猜你喜欢
  • 1970-01-01
  • 2020-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多