我正在尝试使用interactivepython.org网站自学编程。我遇到了一个似乎超出我头脑的问题。我已经连续工作了3个小时,我正在绞尽脑汁。不知道如何打破这一点。
问题:
解密秘密消息:
描述似乎令人生畏,但解决方案并不那么难。您可以使用内置字符串数据类型以及相关的内置函数和while循环(使用'len'函数)或for循环(使用'in'运算符)来遍历字符串。另外,使用课程材料中讨论的'chr'和'ord'函数(基于ASCII代码)。请务必查看课程材料中的示例,并在练习2中执行#18和#19。提供#19的答案,它可以为解决此问题提供有价值的提示。
你的国家处于战争状态,你的敌人正在使用密码进行相互沟通。您已设法拦截如下所示的消息:
:mmZ\dxZmx]Zpgy
该消息显然是使用敌人的密码加密的。您刚刚了解到他们的加密方法基于ASCII代码(您可以通过在线搜索轻松找到此设置)。使用此系统对字符串中的各个字符进行编码。例如,字母“A”使用数字65编码,“B”使用数字66编码。
你敌人的密码会收到邮件的每个字母并按如下方式对其进行加密(使用密钥):
If (OriginalChar + Key > 126) then EncryptedChar = ((OriginalChar + Key) - 127) + 32 Else EncryptedChar = (OriginalChar + Key)
例如,如果敌人使用Key = 10,那么消息“Hey”将被加密为:
Character ASCII H 72 e 101 y 121 Encrypted H = (72 + 10) = 82 = R in ASCII Encrypted e = (101 + 10) = 111 = o in ASCII Encrypted y = 32 + ((121 + 10) - 127) = 36 = $ in ASCII
因此,“嘿”将作为“Ro $”发送。
编写一个解密截获消息的程序。您只知道使用的密钥是1到100之间的数字。您的程序应尝试使用1到100之间的所有可能密钥对消息进行解码。当您尝试有效密钥时,该消息将有意义。对于所有其他键,该消息将显示为乱码。
提示:您需要实现一个解密函数,该函数将加密消息作为字符串并将键作为整数接收,并将解密后的消息作为字符串返回。您可以按如下方式解密邮件的每个字母:
If (EncryptedChar - Key < 32) then DecryptedChar = ((EncryptedChar - Key) + 127) - 32 Else DecryptedChar = (EncryptedChar - Key)
注意:您还应该实现一个加密函数,它将常规消息作为字符串并将密钥作为整数接收,并将相应的加密消息作为字符串返回(加密消息的算法在上面的问题描述中提到)。此函数可以帮助您加密任何常规消息,然后可以将其传递给您的解密函数进行解密。
对于加密:您应该询问用户是否有任何常规消息和密钥,并输出相应的加密消息。
示例运行:
Enter a regular message to encode: Attack at dawn! Enter a key value (between 0 and 100) for encoding: 88 The encoded message is: :mmZ\dxZmx]Zpgy
对于解密:您应该询问用户加密的消息,并输出100个格式良好,解密的消息(使用1到100之间的键)以及相应的键值。
示例运行(下面的乱码消息不准确):
Enter an encrypted message to decode: :mmZ\dxZmx]Zpgy The following are the decoded messages for keys 1 to 100: Key: 1 –> Decoded Message: whfuihwuiidh89 Key: 2 –> Decoded Message: 9ehkaOY3ewine ... Key: 87 –> Decoded Message: Buubdl!bu!ebxo” Key: 88 –> Decoded Message: Attack at dawn! ... Key: 100 –> Decoded Message: on3dwp389/wi8
这是我目前的代码:
def encrypt(message, key):
result = ""
for char in message:
result += encryptedChar
return result
答案 0 :(得分:2)
这是一个有趣的解决方案
import string,codecs
class RotEncoder:
def __init__(self,rot):
self._rot = rot
def _encChar(self,ch):
return chr((ord(ch) + self._rot) if ord(ch) + self.rot =< 126 else (((ord(ch) + self._rot) - 127) + 32))
def _decChar(self,ch):
return chr((ord(ch) - self._rot) if ord(ch) - self._rot >= 32 else (((ord(ch) - self._rot) + 127) - 32))
def encode(self,txt,errors=[]):
return "".join(map(self._encChar,txt)),1
def decode(self,txt,errors=[]):
return "".join(map(self._decChar,txt)),1
import re
def find_rot(search):
t = re.match("rot\s?([0-9]+)",search.lower())
if t.groups():
val = int(t.groups()[0])
return codecs.CodecInfo(
name='rotcipher',
encode=RotEncoder(val).encode,
decode=RotEncoder(val).decode
)
codecs.register(find_rot)
print ":mmZ\dxZmx]Zpgy".decode('rot88')
答案 1 :(得分:2)
这是一个比Joran Beasley更简单(但更长)的答案。
在您了解之后,您可以使用ord()
获取字符的“数字”并使用chr()
“恢复”该字符,这样可以很容易地“转换”您输入的代码python代码。
从以下部分开始:
If (OriginalChar + Key > 126) then
EncryptedChar = ((OriginalChar + Key) - 127) + 32
Else
EncryptedChar = (OriginalChar + Key)
如果您从已编写的代码开始,您可以将上述内容翻译成:
def encrypt(message, key):
result = ""
for char in message:
if (ord(char) + key > 126):
result += chr(ord(char) + key - 127 + 32)
else:
result += chr(ord(char) + key)
return result
你可以对解密部分做同样的事情,然后写一个简单的菜单
这是剩下的代码(您必须在顶部添加encrypt
函数:
def decrypt(message):
for key in range(1, 101):
result = ""
for char in message:
if (ord(char) - key < 32):
result += chr(ord(char) - key + 127 - 32)
else:
result += chr(ord(char) - key)
print('key: {} -'.format(key), result)
if __name__ == '__main__':
print('1 - Encrypt')
print('2 - Decrypt')
inp = input('select 1 or 2: ')
if inp == '1':
msg = input('Enter message: ')
key = int(input('Enter key (1-100): '))
print('Encrypted message:')
print(encrypt(msg, key))
else:
msg = input('Enter message: ')
decrypt(msg)