-2

嘿伙计们,所以我正在尝试按照这些说明制作密码:

  1. 打印页眉。
  2. 提示用户输入带有加密消息的文件名、解码密钥(移位号)和存储解密消息的文件名。
  3. 从文件中读取加密消息。
  4. 使用解码密钥将加密消息中的每个字符移动适当的数字,以生成与解密消息对应的新字符串。
  5. 将解密的消息保存在第二个文件中。
  6. 在屏幕上打印加密和解密的消息。我不允许使用 ord() 或 chr() 函数。

真正让我困惑的是加密和解密文件部分。我真的不知道如何为此编码。

我对此很陌生,因此将不胜感激任何帮助。提前致谢。

4

2 回答 2

4

注意:听起来你可能是在做这个学校作业。我强烈建议您仅将以下代码用作示例,而不是作为完整的解决方案。我讨厌围绕你的作业存在剽窃问题,我相信你的教授/老师在谷歌搜索之前的工作知识渊博。祝你的任务好运!

我写了一个简单的例子来说明我如何尝试解决你的问题。该示例有几个已知问题:

  1. 它不处理大写字母。(除了将它们转换为对应的小写字母。)
  2. 它不处理标点符号或非字母数字字符。(数字、空格或行尾。)
  3. 没有错误检查。
  4. 如果您尝试转换一个 < -25 的数字,它会扔给您。

可能需要解决的最大问题是不使用ord()and的限制chr()。我通过创建自己的字母到数字的转换列表绕过了这个限制,反之亦然。确保您处理的一个棘手的极端情况是,如果移位将一个字母移动到转换范围 [0,25] 之外会发生什么。

作为旁注,如果你想解密一个文件,你可以简单地将它作为明文打开并使用一个负偏移量,其绝对值等于加密偏移量。或者用简单的英语,如果你使用参数:

infile = clear.txt, offset = 1, outfile = encrypted.txt

要解密,您可以使用:

infile = encrypted.txt, offset = -1, outfile = decrypted.txt   

凯撒密码.py

import itertools

letters = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q',
           'r','s','t','u','v','w','x','y','z']
numbers = range(26) # Numbers 0 - 25
lettersToNumbers = dict(zip(letters, numbers))
numbersToLetters = dict(zip(numbers, letters))

def printHeader():
    """ Print the program informational header """
    print """=======================================
Welcome to CaesarCipher - The unbreakable
Roman cipher.
======================================="""

def convertToNumber(letter):
    """ Convert a letter to a number using our predefined conversion table
        @param letter: The letter to convert to an integer value
        @type letter: str
        @rtype: int
    """
    return lettersToNumbers[letter]

def convertToLetter(number):
    """ Convert a number to a letter using our predefined conversion table
        @param number: The number to convert to a letter
        @type number: int
        @rtype: str
    """
    # If we shift outside of our range make sure to wrap
    if number > 25:
        return numbersToLetters[number%25]
    elif number < 0:
        return numbersToLetters[number+25]
    else:
        return numbersToLetters[number]

def shiftUp(letter, shift):
    """ Shift letter up a given number of positions
        @param letter: The letter we're shifting
        @param shift: The number of positions to shift up
        @type letter: str
        @type shift: int

        @note: For simplicity we encode both capital and lowercase letters
               to the same values
    """
    number = convertToNumber(letter.lower())
    number += shift
    return convertToLetter(number)

def prompt():
    """ Prompt for user input
        @rtype: tuple of str, int, str
    """
    infile = raw_input("File to encrypt: ")
    offset = int(raw_input("Encoding number: "))
    outfile = raw_input("Encrypted file destination: ")
    return (infile, offset, outfile)

def encrypt(infile, offset, outfile):
    """ Encrypt the file using the given offset """
    print "=== Plaintext input ==="
    printFile(infile)
    with open(infile) as red_file:
        with open(outfile, 'w') as black_file:
            for line in red_file:
                for letter in line:
                    # Only convert alphabetic characters
                    if letter.isalpha():
                        black_file.write(shiftUp(letter, offset))
                    else:
                        black_file.write(letter)
    print "=== Ciphertext output ==="
    printFile(outfile)

def printFile(path):
    """ Print the data in the given file """
    with open(path) as print_file:
        for line in print_file:
            print line

printHeader()
encrypt(*prompt()) # `*` unpacks the tuple returned by `prompt()` into 
                   # three separate arguments.

测试.txt

abcdef
ABCDEF
This is some text I want to try and encrypt.

示例运行:

mike@test:~$ python caesarcipher.py 
=======================================
Welcome to CaesarCipher - The unbreakable
Roman cipher.
=======================================
File to encrypt: test.txt
Encoding number: 1
Encrypted file destination: test.out 
=== Plaintext input ===
abcdef

ABCDEF

This is some text I want to try and encrypt.

=== Ciphertext output ===
bcdefg

bcdefg

uijt jt tpnf ufyu j xbou up usz boe fodszqu.
于 2013-02-24T04:10:35.467 回答
0

既然你说文件位是你最大的问题,我假设功能如下:

def decaesar(message, shift):
   pass

它在字符串的基础上为您解密 - 也就是说,它将加密的消息作为字符串并将解密的消息作为字符串返回给您。如果你还没有写过,先写,然后用硬编码的字符串测试它。在这个阶段忽略“加密和解密文件”位 - 编程就是一次解决一个问题。

一旦你有了这个函数并且你很高兴它可以工作,扩展你的程序来处理文件而不是字符串就像问一样简单:

  • 给定文件名,我可以得到一个包含文件内容的字符串吗?,反之,
  • 我可以将字符串写入具有给定名称的文件吗?

如果您可以用“是”回答这两个问题,那么您可以在不更改decaesar功能的情况下以这种方式扩展您的程序 - 您的逻辑如下所示:

# Print header
encrypted_filename, decrypted_filename, shift = # get from user input
encrypted_message = # get the contents of encrypted_filename as a string
decrypted_message = decaesar(encrypted_message, shift)
# write decrypted_message to decrypted_filename
# print encrypted_message and decrypted_message

有用的是,Python 的文件 IO 正是基于这种在字符串和文件之间转换的原理。如果您有一个文件打开以供阅读:

in_file = open(filename)

,则返回值:

in_file.read()

正是回答第一点的字符串。同样,如果您打开了一个文件进行写入:

out_file = 打开(文件名,'w')。然后:

out_file.write(my_string)

将放入my_string该文件。

所以这意味着如果你已经有了你的decaeser函数,那么你可以在适当的地方将此代码放入上面的伪代码中,你将有一个大部分工作的解决方案。

于 2013-02-24T05:04:18.753 回答