Caesar Cipher - 无法工作

时间:2015-11-08 01:22:54

标签: python caesar-cipher

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

  • 允许用户使用用户选择的偏移进行加密或解密
  • 然后它应该获取该信息并将该主题词的字母移动该偏移值,为您提供加密或解密的产品

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

这是我的代码:

 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() s的输出?

2 个答案:

答案 0 :(得分:1)

首先,显而易见:这些不是您正在寻找的路径

您的“if Choice”选项错误,因此您可能永远不会执行您期望的路径。您从未强制输入,因此您的if语句需要if Choice.upper() == 'E':或更明确地if (Choice == 'E') or (Choice == 'e'):。我在下面使用这两个。

接下来,您的实际程序:Caesar ciphers 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. 调整
  5. 通过移位值模数94来获得真正的移位
  6. 加回32
  7. 然后解密过程就是逆操作。

    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?")
    

    显然,这可以调整以扩展/减少输入或输出的有效范围。大多数示例Caesar密码仅使用[AZ]作为有效字符,因此范围为26,底值为65,您必须在Message.upper()等上执行操作。但原理是相同的。

答案 1 :(得分:0)

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

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

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