pythongui工具(Python工具箱系列(十二))
导读:◆ open...
◆ open
◆ close
◆ read
◆ write
◆ delete
在Unix世界中 ,更是将文件这一概念发挥到极致 ,认为万物都是文件 ,都可以用基本类似的方式来打开 ,也就是所谓的原语 。python也不例外 ,提供了内置的文件操作函数 。下面的代码就演示了如何将word文档进行加密。假设我们用WORD文档写了一段文字 ,内容如下图所示 。
这当然是一首曹操的名诗 ,我们使用AES算法来加解密 。AES是一种十分成熟 、安全 、国际通用的对称密码的加密解密算法 ,供AES加密解密的重要参数就是密钥 。这个密钥只是一个随机字符串 ,通常是128位或256位字长 。AES加密解密所用的密钥与其它密码算法没有任何区别 。废话不说,直接上代码 。
import os
import struct
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
defaultsize = 64*1024
def encrypt_file(key, in_filename, out_filename=None, chunksize=defaultsize):
"""
对文件进行加密
Args:
key (str): 16字节密钥
in_filename (str): 待加密文件
out_filename (str, optional): 加密后输出的文件
chunksize (int, optional): 块大小 ,缺省64k
"""
if not out_filename:
out_filename = in_filename + .enc
iv = os.urandom(16)
encryptor = AES.new(key, AES.MODE_CBC, iv)
filesize = os.path.getsize(in_filename)
with open(in_filename, rb) as infile:
with open(out_filename, wb) as outfile:
outfile.write(struct.pack(<Q, filesize))
outfile.write(iv)
pos = 0
while pos < filesize:
chunk = infile.read(chunksize)
pos += len(chunk)
if pos == filesize:
chunk = pad(chunk, AES.block_size)
outfile.write(encryptor.encrypt(chunk))
def decrypt_file(key, in_filename, out_filename=None, chunksize=defaultsize):
"""
解密文件
Args:
key (str): 16字节密钥
in_filename (str): 待解密文件
out_filename (str, optional): 解密后输出的文件
chunksize (int, optional): 块大小 ,缺省64K
"""
if not out_filename:
out_filename = in_filename + .dec
with open(in_filename, rb) as infile:
filesize = struct.unpack(<Q, infile.read(8))[0]
iv = infile.read(16)
encryptor = AES.new(key, AES.MODE_CBC, iv)
with open(out_filename, wb) as outfile:
encrypted_filesize = os.path.getsize(in_filename)
pos = 8 + 16 # the filesize and IV.
while pos < encrypted_filesize:
chunk = infile.read(chunksize)
pos += len(chunk)
chunk = encryptor.decrypt(chunk)
if pos == encrypted_filesize:
chunk = unpad(chunk, AES.block_size)
outfile.write(chunk)
# 密钥,随便写 ,使用时只使用前16字节
key = stayhungrystayfoolish
def test_enc():
sourcefilename=r../resources/神龟虽寿.docx
encrypt_file(key[:16].encode(utf-8), sourcefilename)
def test_dec():
sourcefilename=r../resources/神龟虽寿.docx.enc
targetfilename=r../resources/decrypt.docx
decrypt_file(key[:16].encode(utf-8), sourcefilename,out_filename=targetfilename)
if __name__ == __main__:
test_enc()
test_dec()
我们这里使用128位密钥进行加解密 ,加密后的文件微软的WORD也打不开,内部结构已经完全改变 ,而解密后文件与原文档没有区别 。从代码可以看出 ,本文提供的对文件的加解密与文件类型没有关系 ,完全可以用此算法对音乐 、视频等进行加解密 ,如果再配合使用QT等开发工具 ,可以进一步升级为易于使用的GUI界面的文件加解密器 。补充一点 ,上述的加解密算法库需要安装对应的包 ,使用以下命令即可 。
pip install PyCryptodome
声明:本站所有文章 ,如无特殊说明或标注 ,均为本站原创发布。任何个人或组织,在未征得本站同意时 ,禁止复制 、盗用 、采集 、发布本站内容到任何网站 、书籍等各类媒体平台 。如若本站内容侵犯了原著者的合法权益 ,可联系我们进行处理 。
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!