我该如何处理这种加密?

时间:2013-11-14 17:38:57

标签: python

我正在尝试使用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

2 个答案:

答案 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)