凯撒密码 - 无法工作

Caesar Cipher - Can't get working

我已经为我的 Python class 完成了我应该完成的任务,但是我似乎无法打印最终结果。该任务的目的是创建一个程序:

问题是我的代码不会打印结果,我看不出有什么问题。

这是我的代码:

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

if Choice == "e".upper():
    for character in Message:
        x = ord(character)
        Encrypt += chr(Offset + x)
    print (Encrypt)
if Choice == "d".upper():
    for character in Message:
        x = ord(character)
        Decrypt += chr(Offset - x)
    print (Decrypt)

为什么我没有得到 print() 的输出?

我复制了你的代码并运行它python3;当出现提示时,我选择了 encrypt,并输入了 hello world 的密码消息,对于偏移量,我使用了 3,结果为 khoor#zruog.

你的问题可能在第一行,因为我得到了这个错误:SyntaxError: EOL while scanning string literal。问题是您没有正确拆分使用 2 行的字符串;您必须在第一个字符串的末尾使用 \ 来转义换行符。

如果这不是您的问题,请提及错误消息和 python 版本。

首先,很明显:这些不是您要查找的路径

您的 "if Choice" 选择是错误的,因此您可能永远不会执行您期望的路径。您从不强制输入,因此您的 if 语句要么需要 if Choice.upper() == 'E':,或者更明确地说,if (Choice == 'E') or (Choice == 'e'):。我在下面的例子中使用了两者。

接下来,您的实际程序:凯撒密码 ROTATE

您没有遵守凯撒密码的旋转性质。 Ceaser 密码就像 12 小时制。 “11 点​​后 4 小时”不是“15 点钟”,而是“3 点钟”,在 Python 中是:(11 + 4) % 12

考虑到这一点,ASCII 字符的范围是多少?那里有多少?您是否包括非字符但可打印的内容?您是否包含了 整个范围的有效 Unicode? (顺便说一句,包括 unicode 可能非常接近于不可能,因为值是如何从页面构造的性质,以及其他问题。)

所以简单的情况是ASCII值,32到126之间的可打印字符。(这里有一个图表供参考:ASCII Table

这给了我们有效集中的 126 - 32 = 94 个字符,类似于 12 小时制中的 12 个有效小时。这也意味着我们的底值为 32,这意味着任何东西都不能低于该值。

我们的密码程序看起来像这样:

  1. 接受用户的转变
  2. 从给定值中减去 32
  3. 根据移位值调整
  4. 通过将移位值对 94 取模得到真正的移位
  5. 加回 32

解密过程就是逆运算

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.upper() == 'D':
    print("You didn't think I was going to do all your homework for you, right?")

显然这可以调整为 expand/reduce 输入或输出的有效范围。大多数示例凯撒密码仅使用 [A-Z] 作为有效字符,因此范围为 26,底值为 65,您必须对 Message.upper() 等进行运算。但原理是相同的。