凯撒密码查询

Caesar Cipher Query

好的,我的代码就是这样,问题是当我选择解密选项时,我似乎无法将它 return 恢复到它的原始形式,而我不是确定它有什么问题。我想知道你们是否可以给我一些关于哪里出了问题以及我应该做什么的指示? 这是我的代码:

Choice = input("Would you like to decrypt or encrypt a message?\nPlease enter 'E' or 'D': ")
Message = input("Enter text to Cipher: ")
Offset = int(input("Please enter your offset: "))
Encrypt = ''
Decrypt = ''

if (Choice == 'e') or (Choice == 'E'):
    for character in Message:
        x = ord(character) - 32
        Encrypt += chr(((Offset + x) % 94) + 32)
    print(Encrypt)
if (Choice == 'd') or (Choice == 'D'):
    for character in Message:
        x = ord(character) - 32
        Decrypt += chr(((Offset - x) % 94) + 32)
    print(Decrypt)

你应该从

切换减法
Decrypt += chr(((Offset - x) % 94) + 32)

Decrypt += chr(((x - Offset) % 94) + 32)

此外,不要使用第二个 if,而应使用 elif(代表 "else if")语句。

elif (Choice == 'd') or (Choice == 'D'):

很好的练习。

问题出在这一行:

Decrypt += chr(((Offset - x) % 94) + 32)

我不确定你从哪里得到 (Offset – x);你想反转加密过程应用的偏移量,所以这一行应该是:

Decrypt += chr(((x - Offset) % 94) + 32)

您可能需要将加密线调整为对称。


其他一些快速评论:

  • 你可以这样整理 if 分支:

    if choice.lower() == 'e':
    elif choice.lower() == 'd':
    

    您可能需要考虑用户键入除 E 或 D 以外的内容的情况。

  • Python 风格指南是 PEP 8——一般来说,变量名应该是 snake_case。例外情况是 类 (CamelCase) 和常量 (UPPERCASE).

  • 不清楚你为什么要工作 mod 94,或调整 32 个位置。如果您的代码包含解释这一行的注释,将会很有用。

  • 为了减少代码重复,您可能希望将偏移代码包装在一个函数中。然后你可以这样称呼它:

    encrypted_message = offset(message, places= 3)
    decrypted_message = offset(message, places=-3)
    

    它还可以免费为您提供 encryption/decryption 的对称性,只需翻转偏移量的符号即可。

你必须写:

    Decrypt += chr((( x -Offset) % 94) + 32)

不是

    Decrypt += chr(((Offset - x) % 94) + 32)