嘿伙计们,所以我正在尝试按照这些说明制作密码:
- 打印页眉。
- 提示用户输入带有加密消息的文件名、解码密钥(移位号)和存储解密消息的文件名。
- 从文件中读取加密消息。
- 使用解码密钥将加密消息中的每个字符移动适当的数字,以生成与解密消息对应的新字符串。
- 将解密的消息保存在第二个文件中。
- 在屏幕上打印加密和解密的消息。我不允许使用 ord() 或 chr() 函数。
真正让我困惑的是加密和解密文件部分。我真的不知道如何为此编码。
我对此很陌生,因此将不胜感激任何帮助。提前致谢。
嘿伙计们,所以我正在尝试按照这些说明制作密码:
真正让我困惑的是加密和解密文件部分。我真的不知道如何为此编码。
我对此很陌生,因此将不胜感激任何帮助。提前致谢。
注意:听起来你可能是在做这个学校作业。我强烈建议您仅将以下代码用作示例,而不是作为完整的解决方案。我讨厌围绕你的作业存在剽窃问题,我相信你的教授/老师在谷歌搜索之前的工作知识渊博。祝你的任务好运!
我写了一个简单的例子来说明我如何尝试解决你的问题。该示例有几个已知问题:
可能需要解决的最大问题是不使用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.
既然你说文件位是你最大的问题,我假设功能如下:
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
函数,那么你可以在适当的地方将此代码放入上面的伪代码中,你将有一个大部分工作的解决方案。