凯撒密码 - 无法工作
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,这意味着任何东西都不能低于该值。
我们的密码程序看起来像这样:
- 接受用户的转变
- 从给定值中减去 32
- 根据移位值调整
- 通过将移位值对 94 取模得到真正的移位
- 加回 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()
等进行运算。但原理是相同的。
我已经为我的 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,这意味着任何东西都不能低于该值。
我们的密码程序看起来像这样:
- 接受用户的转变
- 从给定值中减去 32
- 根据移位值调整
- 通过将移位值对 94 取模得到真正的移位
- 加回 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()
等进行运算。但原理是相同的。