Python工具箱系列(十二)

在计算机世界里只有二进制。唯有人类才会对数据进行类型与价值判断。例如,认为某些文件是文本文件、是WORD/EXCEL文件或者是图片。对于加密算法来说也是一样的,加解密算法处理的只是字节流,根本不关心所谓的文件类型。对于文件来说,存在以下基本操作:
◆ open
◆ close
◆ read
◆ write
◆ delete
在Unix世界中,更是将文件这一概念发挥到极致,认为万物都是文件,都可以用基本类似的方式来打开,也就是所谓的原语。python也不例外,提供了内置的文件操作函数。下面的代码就演示了如何将word文档进行加密。假设我们用WORD文档写了一段文字,内容如下图所示。
Python工具箱系列(十二)

这当然是一首曹操的名诗,我们使用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

 

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

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

相关文章

  • Python工具箱系列(九)

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

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

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

    2023年4月2日
    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工具箱系列(六)

    相比较于windows下安装python,在Linux下安装python实际上是一个非常困难的选择。首先要解决的就是选择哪个发行版本的问题。Linux的内核掌握在技术团队中,但是Linux发行版本则掌握在不同的公司手中。不同的公司出于不同的考虑,在Linux内核的基础上,打包了不同的应用程序,安装了不同的包管理器,实现了不同的发布策略,这就导致了数以百计的发…

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

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

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

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

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

    前面介绍了对称加密算法,本文将介绍密码学中另一类重要应用:消息摘要(Digest),什么是消息摘要?简单的定义是:对一份数据,进行一个单向的Hash函数,生成一个固定长度的Hash值,这个值就是这份数据的摘要,也称为指纹。 常见的摘要算法有: MD5 SHA1 SHA256 其它 特点如下:   无论输入的消息有多长,计算出来的消息摘要的长度总是固定的。例如…

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

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

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