在之前的章节中,编写的程序只能操作较少的信息,这些信息往往是以字符串的形式直接写在代码中的 。但本章中的程序可以对整个文件进行加密和解密,文件的大小可以包括成千上万个字符 。
本章要点
- open()方法 。
- 读、写文件 。
- write()、close()及read()文件对象操作方法 。
- os.path.exists()方法 。
- upper()、lower()及title()字符串操作方法 。
- startswith()及endswith()字符串操作方法 。
- time模块及time.time()方法 。
如果需要纯文本文件的样例,则可以从网络上下载一些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--
每次加密一个文件,都可以将加密的结果发送给另一个人去解密它,对方同样需要文件置换操作程序的源代码 。
推荐阅读
- GUI 什么是Python 的图形界面编程?你了解了吗
- Python之PyCharm永久性激活教程
- 编程小白们,别再去啃谭浩强的C语言了,有人这样学一个月入门
- Python3.8的新增特性
- 带你认识Python中黑客喜欢攻击的10个安全漏洞以及应对方法
- 十一 网络编程懒人入门:一文读懂什么是IPv6
- 教你用Python实现截图和文字识别,就是这么简单
- Python中多线程和多处理的初学者指南
- method 学编程傻傻分不清什么是方法和函数(function)?
- 谁偷偷删了你的微信?用Python分分钟揪出来