Python密码学编程:文件的加密与解密

在之前的章节中,编写的程序只能操作较少的信息,这些信息往往是以字符串的形式直接写在代码中的 。但本章中的程序可以对整个文件进行加密和解密,文件的大小可以包括成千上万个字符 。
本章要点

  • open()方法 。
  • 读、写文件 。
  • write()、close()及read()文件对象操作方法 。
  • os.path.exists()方法 。
  • upper()、lower()及title()字符串操作方法 。
  • startswith()及endswith()字符串操作方法 。
  • time模块及time.time()方法 。
10.1 纯文本文件对文件进行置换操作的程序只对纯文本(无格式文本)文件进行加/解密,这类文件指的是那些后缀名为 .txt 且文件中不包含除文本数据以外的内容的文件 。要编写这类文件,可以选择在windows系统下使用Notepad、在macOS系统下使用TextEdit,或者在linux系统下使用gedit 。(word这样的文本处理程序同样也可以生成纯文本文件,但记住这些文件不能保存字体样式、字体大小、颜色或其他任何格式 。)除上述文本编辑软件外,读者甚至可以使用IDLE文本编辑器,只要将文件后缀保存为 .txt 而不是通常使用的 .py 即可 。
如果需要纯文本文件的样例,则可以从网络上下载一些txt小说,要将纯文本手动输入程序中,可能要花费很多时间,但如果使用现成的txt文件,则程序在数秒内就可以完成加密操作 。
10.2 使用置换密码加密文件的源代码在前两章置换密码测试程序的基础上,针对文件的置换密码程序引入了transposition Encrypt.py和transpositionDecrypt.py这两个文件,这样就可以调用encryptMessage()和decryptMessage() 这两个函数 。因此,编写这个新程序将不用重新输入两个函数的代码 。
选中 File?New File,打开一个新的编辑窗口,将下列代码输入编辑窗口并将其存储为transpositionFileCipher.py 。接下来,访问本书配套资源下载一个名为frankenstein.txt的文件,并将其放置在与py文件相同的路径之下,按下F5键运行这个程序 。
transpositionFileCipher.py
1. # 置换密码加/解密文件 2. # https://www.nostarch.com/crackingcodes/ (BSD Licensed) 3. 4. import time, os, sys, transpositionEncrypt, transpositionDecrypt 5. 6. def main(): 7.inputFilename = 'frankenstein.txt' 8.# 注意,如果具有outputFilename 名称的文件已存在,则此程序 9.# 覆盖该文件10.outputFilename = 'frankenstein.encrypted.txt'11.myKey = 1012.myMode = 'encrypt' # 设置为'encrypt'或'decrypt'13.14.# 如果输入文件不存在,则程序提前终止15.if not os.path.exists(inputFilename):16.print('The file %s does not exist. Quitting...' % (inputFilename))17.sys.exit()18.19.# 如果输出文件已存在,则给用户退出的机会20.if os.path.exists(outputFilename):21.print('This will overwrite the file %s. (C)ontinue or (Q)uit?' %(outputFilename))22.response = input('> ')23.if not response.lower().startswith('c'):24.sys.exit()25.26.# 从输入文件中读取消息27.fileObj = open(inputFilename)28.content = fileObj.read()29.fileObj.close()30.31.print('%sing...' % (myMode.title()))32.33.# 测量加/解密所需时间34.startTime = time.time()35.if myMode == 'encrypt':36.translated = transpositionEncrypt.encryptMessage(myKey, content)37.elif myMode == 'decrypt':38.translated = transpositionDecrypt.decryptMessage(myKey, content)39.totalTime = round(time.time() - startTime, 2)40.print('%sion time: %s seconds' % (myMode.title(), totalTime))41.42.# 将置换后的消息写入输出文件43.outputFileObj = open(outputFilename, 'w')44.outputFileObj.write(translated)45.outputFileObj.close()46.47.print('Done %sing %s (%s characters).' % (myMode, inputFilename,len(content)))48.print('%sed file is %s.' % (myMode.title(), outputFilename))49.50.51. # 如果运行 transpositionCipherFile.py (而不是作为模块引入),则52. # 调用main() 函数53. if __name__ == '__main__':54.main()10.3 运行置换密码加密文件程序的样例运行transpositionFileCipher.py得到的输出如下 。
Encrypting...Encryption time: 1.21 secondsDone encrypting frankenstein.txt (441034 characters).Encrypted file is frankenstein.encrypted.txt.这样就创建出了一个名为frankenstein.encrypted.txt 的新文件,该文件与 transposition FileCipher.py 在同一个路径下 。使用IDLE文件编辑器打开这个新文件,就可以看到frankenstein.txt 中的文本内容被加密后的结果了 。它应有的格式如下所示 。
PtFiyedleo a arnvmt eneeGLchongnes Mmuyedlsu0#uiSHTGA r sy,n t yss nuaoGeLsc7s,--snip--每次加密一个文件,都可以将加密的结果发送给另一个人去解密它,对方同样需要文件置换操作程序的源代码 。


推荐阅读