在Python中应用Caesar密码程序中的转换

时间:2016-07-26 06:43:50

标签: python encryption caesar-cipher

我需要帮助弄清楚我做错了什么。我是学习Python的新手,这是我正在学习的课程中的一个问题。我试图在互联网上获得其他用户的帮助,我认为我非常接近完成这个问题。

This question与我的要求类似,但我没有看到我追求的答案。

课程的问题如下:

Message类包含可用于将密码应用于字符串的方法,用于加密或解密消息(因为对于Caesar代码,这是相同的操作)。

在接下来的两个问题中,您将根据文档字符串中的规范填写Messageps6.py类的方法。已经填写的Message类中的方法是:

  • __ init__(self, text)

  • getter方法get_message_text(self)

  • getter方法get_valid_words(self),请注意此方法返回self.valid_words的副本,以防止有人改变原始列表。

在这个问题中,您将填写两种方法:

填写Message类的build_shift_dict(self, shift)方法。确保您的字典包括小写和大写字母,但小写字母及其大写字母的移位字符是相同字母的较低和大写实例。这意味着,如果原始字母是" a"它的移位值是" c",字母" A"应该转到字母" C"。

如果您不熟悉英文字母的排序或字符,我们将遵循string.ascii_lowercasestring.ascii_uppercase显示的字母顺序:

>>> import string
>>> print string.ascii_lowercase
abcdefghijklmnopqrstuvwxyz
>>> print string.ascii_uppercase
ABCDEFGHIJKLMNOPQRSTUVWXYZ

来自简介页面的提醒 - 空格字符,逗号,句号,感叹号等字符不会被此密码加密 - 基本上,string.punctuation中的所有字符加上空格(& #39;')以及string.digits中找到的所有数字字符(0 - 9)。

填写Message类的apply_shift(self, shift)方法。您可能会发现使用build_shift_dict(self, shift)更容易。请记住,密码不应更改空格和标点符号。

到目前为止我尝试过:

class Message (object): 
    def __init__(self, text):
        '''
        Initializes a Message object
        text (string): the message's text

        a Message object has two attributes:
            self.message_text (string, determined by input text)
            self.valid_words (list, determined using helper function load_words
        '''

        self.message_text = text
        self.valid_words = load_words(WORDLIST_FILENAME)

    def build_shift_dict(self, shift):
        dict = {}
        stringLower = 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz'
        stringUpper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ'
        pos1 = 0

        for letter in stringLower[0:26]:
            offset1 = pos1 + shift
            dict[letter] = stringLower[offset1]
            pos1 += 1

        pos2 = 0

        for letter in stringUpper[0:26]:
            offset2 = pos2 + shift
            dict[letter] = stringUpper[offset2]
            pos2 += 1
        return dict

    def punct_handler(text, dict):

        stringLower = 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz'
        stringUpper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ'
        temp = []
        s = 0
        t = 1

        while t <= len(text):
            if text[s:t] in '12!@#$%;:, <>^&*.?/\0123456789':
                temp.append(text[s:t])
            else:
                val = text[s:t]
                temp.append(coder[val])
            s += 1
            t += 1

        return ''.join(temp)

    def apply_shift(text, shift):
        return punct_handler(text, build_shift_dict(shift))

问题来自最后一位,apply_shift。我得到的错误是:

Traceback (most recent call last):
  File "submission.py", line 168, in apply_shift
    return punct_handler(text, build_shift_dict(shift))
NameError: global name 'punct_handler' is not defined

代码测试是:

apply_shift on "we are taking 6.00.1x" with random shift

正确的输出应该是:

yg ctg vcmkpi 6.00.1z

0 个答案:

没有答案