上文介绍了命令行方式来对文件进行加解密操作。本文将继续在此基础上,实现一个快速简易的GUI界面方便操作,先上代码看效果。

import argparseimport configparserimport jsonimport osimport structimport sysfrom configparser import ConfigParserfrom pathlib import Pathfrom Crypto.Cipher import AESfrom Crypto.Util.Padding import pad, unpadfrom gooey import Gooey, GooeyParserfrom matplotlib import widgetsdefaultsize = 64*1024# 密钥随便写,使用时只使用前16字节key = 'stayhungrystayfoolish'realkey = key[:16].encode('utf-8')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)@Gooey(language='chinese')def parse():    parser = GooeyParser(description=u'aes handler')    parser.add_argument("-d", "--decry", action="store_true",                        help="解密模式")    parser.add_argument("-e", "--encry", action="store_true",                        help="加密模式")    parser.add_argument("-i", "--input", type=str,                        help="要处理的文件", widget='FileChooser')    parser.add_argument("-o", "--output", type=str,                        help="要输出的文件", widget='FileSaver')    args = parser.parse_args()    print(args)    # 判断参数输入情况,如果没有参数,则显示帮助。    if len(sys.argv) == 1:        parser.print_help()        return    # 解密模式,获得输入与输出文件后,调用算法解密    if args.decry:        inputfilename = Path(args.input)        if inputfilename.exists():            decrypt_file(realkey, in_filename=args.input,                         out_filename=args.output)        else:            print(f'{args.input}不存在')    # 加密模式,获得输入与输出文件后,调用算法加密    if args.encry:        inputfilename = Path(args.input)        if inputfilename.exists():            encrypt_file(realkey, in_filename=args.input,                         out_filename=args.output)        else:            print(f'{args.input}不存在')parse()

可以看出,基本上代码不用太改,直接就可以升级为GUI应用,确实非常方便,运行效果如下图所示。

要知道,python的GUI实在是令人感到一言难尽,不仅需要配置的东西很多,而且还经常出现各类错误,根本无法与微软的.Net相比,也无法与B/S架构的前端相比。通常情况下,本系列不再介绍GUI编程方面的知识。但是这个工具包非常简洁明快,推荐使用。windows下使用以下命令完成相关环境准备。

pip install Gooey 

ubuntu 18.04环境有些复杂,建议以下安装步骤。

sudo apt-get install python-wxtools# method1apt-get install pkg-config# method2wget http://launchpadlibrarian.net/477064124/pkg-config_0.29.2-1ubuntu1_amd64.debdpkg -i pkg-config_0.29.2-1ubuntu1_amd64.debpkg-config --versionapt-get install -y libgtk-3-dev # 检验与设置pkg-config --cflags --libs gtk+-3.0# 前面全是准备pip install wxpythonpip install matplotlibpip install gooey

安装成功后,也可以获得与windows下类似的界面。