Python工具箱系列(十四)

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

import argparse
import configparser
import json
import os
import struct
import sys
from configparser import ConfigParser
from pathlib import Path

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
from gooey import Gooey, GooeyParser
from matplotlib import widgets

defaultsize = 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工具箱系列(十四)

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

pip install Gooey 

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

sudo apt-get install python-wxtools
# method1
apt-get install pkg-config
# method2
wget http://launchpadlibrarian.net/477064124/pkg-config_0.29.2-1ubuntu1_amd64.deb
dpkg -i pkg-config_0.29.2-1ubuntu1_amd64.deb

pkg-config --version
apt-get install -y libgtk-3-dev
 
# 检验与设置
pkg-config --cflags --libs gtk+-3.0

# 前面全是准备
pip install wxpython
pip install matplotlib
pip install gooey

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

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python工具箱系列(十四) - Python技术站

(0)
上一篇 2023年4月2日
下一篇 2023年4月2日

相关文章

  • Python工具箱系列(九)

    在计算机世界里,信息安全始终占据着重要的地位,我们随处就可以看到信息安全的应用: ◆ 访问网站时,使用https而不是http会使访问者的安全性大大提升 ◆ 下载文件时,正规的网站都会提供MD5或类似的散列码,供下载后校验,以防止下载被篡改的文件(有可能包含病毒或恶意代码等) ◆ 网络银行或者手机银行的U盾或者电子证书等 ◆ 区域链以及数字货币等 ◆ ssh…

    2023年4月2日
    00
  • Python工具箱系列(十八)

    非对称加解密应用广泛,它的存在是致力于解决密钥通过公共信道传输这一经典难题。对称加密有一个天然的缺点,就是加密方和解密方都要持有同样的密钥,而这个密钥在传递过程中有可能会被截获,从而使加解密失效。难不成还要为密钥的传输再做一次加密?这样不就陷入了死循环?或许有人在想,密钥即使被盗取,不还有加密算法保证信息安全吗?但任何算法最终都会被破译,所以不能依赖算法的复…

    Python开发 2023年4月2日
    00
  • Python工具箱系列(三十一)

    Neo4j是一个高性能的开源的,使用Java语言实现的NoSQL图数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。现实中很多数据都是用图来表达的,比如社交…

    python 2023年5月11日
    00
  • Python工具箱系列(二十)

    数据库操作应是所有合格程序员的基本功,写的一手好SQL对于数据分析师而言更是安身立命之本。大部分软件开发人员使用的数据库都是MySql/MariaDB,毕竟LAMP(linux+apache+mysql+php)曾经风靡一时。但开发人员真正的瑞士小军刀却是SQLite,它是世界上装机量第一的嵌入式数据库。 SQLite最初的构思是在一条军舰上进行的。当时在通…

    2023年4月2日
    00
  • Python工具箱系列(十一)

    上文讲的古典加密算法虽然很简单,但是在密码史上是使用最久的加密方式。历史上由于算力有限,加上有学识的人有限,所以直到概率论出现后,古典密码才开始破防。归根结底,英文单词中字母出现的频率是不同的,e以12.702%的百分比占比最高,z只占到0.074%,感兴趣的同学可以去百科查字母频率详细统计数据。如果密文数量足够大,仅仅采用频度分析法就可以破解。如果再加上现…

    Python开发 2023年4月2日
    00
  • Python工具箱系列(二十二)

    互联网世界里最流行的开源关系型数据库之一就是MySQL/MariaDB了,由于高度的相似,故而直接使用mysql统一指称。 windows下的安装 windows最吸引人的地方就在于易于安装。mysql在WINDOWS下也是最容易安装的。直接在官网上下载可安装程序,一路NEXT即可。 ubuntu18.04的安装 如果是生产环境部署,建议以普通用户角色,使用…

    Python开发 2023年3月31日
    00
  • Python工具箱系列(二十五)

    Redis是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。Redis是一个nosql数据库。nosql是not-only sql的意思,泛指非关系型数据库。…

    Python开发 2023年3月31日
    00
  • Python工具箱系列(二十六)

    ClickHouse(Click Stream,Data WareHouse)是俄罗斯的 Yandex于2016年开源的用于在线分析处理查询(OLAP:Online Analytical Processing)MPP架构的列式存储数据库(DBMS:Database Management System),能够使用 SQL 查询实时生成分析数据报告。特别值得称道…

    Python开发 2023年3月31日
    00
合作推广
合作推广
分享本页
返回顶部