2013-11-14 121 views
1

我想教自己使用interactivepython.org网站进行编程。我遇到了一个似乎超出我头脑的问题。我一直在为它工作3个小时,并且正在支持我的头脑。不知道如何打破这一点。我该如何解决这个密码学问题?

问题:

解码秘密信息:

的描述可以令人望而生畏,但该解决方案并不难。您可以将内置字符串数据类型与相关的内置函数和while循环(使用'len'函数)或for循环(使用'in'运算符)来遍历字符串。此外,使用课程材料中讨论的'chr'和'ord'函数(基于ASCII代码)。请务必查看课程材料中的示例,并练习练习2中的#18和#19。提供了#19的答案,它可以为解决此问题提供有价值的提示。


您的国家处于战争状态,您的敌人正在使用密码进行通信。您已设法截取如下消息:

:mmZ\dxZmx]Zpgy 

该消息明显使用敌方的密码进行加密。您刚刚了解到他们的加密方法基于ASCII码(您可以通过在线搜索轻松找到该设置)。使用此系统对字符串中的单个字符进行编码。例如,字母'A'使用数字65进行编码,'B'使用数字66编码。

您的敌人的密码采用消息的每个字母并按如下方式进行加密(使用密钥) :

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 

因此,“嘿”将被称为“滚装$”传送:

If (OriginalChar + Key > 126) then 
    EncryptedChar = ((OriginalChar + Key) - 127) + 32 
Else 
    EncryptedChar = (OriginalChar + Key) 

例如,如果敌人使用密钥= 10则消息“嘿”将被作为加密。

编写一个解密截获的消息的程序。您只知道使用的密钥是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

你的问题的描述似乎令人生畏,但解决的办法并不难,你可以使用内置的'字符串。 ''带有相关的内建函数和'while'循环(带有''len''函数)或'for'循环(带有''in''运算符)的数据类型来遍历字符串,并且使用''chr ''和''ord''函数(基于ASCII码) –

+0

你应该尝试在字符串库中使用'string.make_trans('plaintext','ciphertex')' –

+0

Yah i've阅读大约500次。谢谢! – TYPKRFT

回答

2

这是一个更简单(但更长)的答案,就像乔兰比斯利的答案一样。

当你明白了,你可以通过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) 
+0

我想让他在这里:P(+1都一样) –

+0

我要尝试和评论此行的每一行..我可以私人或者汤姆的评论,或许你可以评估我是否已经掌握了我需要的东西。我不想继续前进,直到我明白这一点像我手背。 – TYPKRFT

+1

我创造了一个如此的聊天室。你可以发布你的问题/评论/ ... [那里](http://chat.stackoverflow.com/rooms/41214/how-can-i-tackle-this-cryptography-question)。现在,你和约兰·比斯利,我有写权限,但每个人都可以看到它。 – TobiMarg

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') 
+0

对不起,这是我的头上方。虽然我很欣赏你的意见。 – TYPKRFT

+0

确定您不了解原始作业的哪一部分?也许这会是一个更好的问题......因为从我坐的地方看,你看起来像是发布了你的任务,只是想要一个答案......所以你为什么认为你现有的解决方案不起作用? –

+0

嗯,我是新的,我不明白如何分解它。我觉得我已经完成了课程......然后巴姆不知道。我知道我需要两个函数一个用于加密,另一个用于解密。我知道加密需要接收一条消息和我认为的关键字1-100。 我认为我需要抓住每个角色的ascii值,但是Im之后卡住了。 – TYPKRFT