一.开发目的:

理解开源密码库实现的基本架构,熟悉对称算法的加解密函数封装与调用,并能能够利用开源设计接口进行二次封装,并实现一个界面友好,功能正确的采用对称算法的文件加解密工具。

二.开发环境:


  • 处理器:Intel®Core™i5-1035G1 CPU @1.00GHz 1.19GHz2?

  • 操作系统:windows 10操作系统
    开发工具:python3.9 + pycharm2021.2.1

三.开发步骤和重点代码介绍:

(1)确定开发工具:

我通过仔细阅读openssl的源码之后,发现python中关于文件加解密的库crypto和cryptography在底层都是用openssl实现的文件加解密,我恰好对python比较熟悉,就决定用python实现。

(2)UI设计:

在python中,thinter库是一个比较简单好用的UI库,在本次实验中,我的UI都是用这个库完成的。比如程序中涉及的所有文件路径的读取,我都是从UI界面直接进行读取的,最终程序界面如下:

python 求反对称矩阵 python对称数_python 求反对称矩阵

(3)使用AES-CBC模式实现对于任意文件的加密:

AES为分组加密算法,把明文每128位分成一组,每次加密一组数据,直到加密完整个明文。如果说明文的分组不够128位,需要填充。这里我的密钥选择256位的,初始向量IV是128位的。

经分析,我们的密钥不能从系统直接随机产生后,便开始对文件进行加密,因为我们还要考虑到用户口令。所以在这里,我通过将系统产生的256位的随机密钥和用户输入的口令拼接,然后对它们进行sha256的哈希得到256位的随机加密密钥:

python 求反对称矩阵 python对称数_UI_02

因为要实现对于任意文件的加密,所以程序对文件是以二进制形式读取的,然后对读取到的二进制文件进行AES-CBC加密,完成加密后对加密文件,加密密钥等进行保存:

python 求反对称矩阵 python对称数_网络安全_03


  • 在这里,我对一个桌面上的txt文件进行了加密:

在对应的文件夹生成了一下文件:

python 求反对称矩阵 python对称数_密码学_04

这里保存了本次加密的初始向量,系统和用户口令拼接生成的256位的密钥以及系统产生的256位的随机密钥。这样当用户解密文件的时候,当用户输入口令时,系统会将用户口令和系统产生的随机密钥进行拼接并做sha256的哈希,用生成的密钥进行解密。

下面是加密之后的文件内容:

python 求反对称矩阵 python对称数_python 求反对称矩阵_05

如果是图片加密的话,则显示无法查看:

python 求反对称矩阵 python对称数_密码学_06

python 求反对称矩阵 python对称数_密码学_07

(4)对加密的文件进解密:

文件解密,我们要选择要解密的文件,然后输入用户口令,选择要保存的文件夹,如果解密成功,页面会显示解密成功,如果是用户口令错误,则会显示口令错误。

python 求反对称矩阵 python对称数_密码学_08

这里选择之前加密的图片文件,显示解密成功:

python 求反对称矩阵 python对称数_UI_09

在对应的文件夹下生成了如下文件,并可以查看:

python 求反对称矩阵 python对称数_python 求反对称矩阵_10

(5)数字证书的颁发:

数字证书通过可信任的证书颁发机构,保证了通信双方的身份认证,也解决了公钥分发问题。数字证书里面包括颁发者的信息,被颁发者的公钥信息、身份信息、证书的序列号、证书的签名算法以及该数字证书的有效期等等。在本次实验中,我才用了自己给自己颁发数字证书的模式,来研究数字证书。

在python的cryptography库中的x509实现了数字证书的颁发。在UI界面,我们需要申请人的身份信息以及公钥信息,而我们自己的私钥信息已经被写入到程序中,无须UI输入。

首先读取到用户的公钥信息并生成我们自己的公私钥:

python 求反对称矩阵 python对称数_网络安全_11

然后利用x509模块,实现数字证书的颁发并保存:

python 求反对称矩阵 python对称数_UI_12

  • 下面是我用自己的私钥给LZW颁发的数字证书,页面显示数字证书颁发成功:

在相应的文件夹下,我们看到如下文件:

python 求反对称矩阵 python对称数_UI_13

其中uni_public_key_pem并不是生成的文件,而是证书申请者的公钥。里面的private_key和public_key是我的临时公私钥,而certificate是生成的数字证书,内容如下:

python 求反对称矩阵 python对称数_网络安全_14

(6)用私钥实现数字签名:

数字签名采用非对称密码体制,发送者使用自己的私钥对文件进行签名,接收者使用发送者的公钥进行签名验证。数字签名解决了在消息认证码中无法实现的抗抵赖性。如果对一份完整的文件进行数字签名,相当于用私钥进行了加密,如果文件很大,加密时间很长甚至对于某些实时性要求很高的场景不适用,所以我选择对文件的哈希值进行数字签名,在验签阶段,只需要比较哈希值是否一致就可以。文件哈希采用sha256进行哈希。

在数字签名的UI界面,我们需要选择要签名的文件,我的私钥,以及对于签名后的文件要保存的位置。

python 求反对称矩阵 python对称数_python 求反对称矩阵_15

  • 这里我还是选择对上面的txt文件进行数字签名,页面显示签名成功:

在相应的文件夹,我们可以看到对应的签名文件:

python 求反对称矩阵 python对称数_python 求反对称矩阵_16

(7)签名验证:

因为我们在签名的时候是对文件的哈希值进行签名,所以在验签阶段,我们只需要选择原文件(这里的原文件是指签名者连同签名文件一起发过来的文件)和已签名的文件,对原文件进行哈希,对已签名的文件进行解密得到哈希,比较两者的哈希值是否相等即可。

首先需要读取三个文件:签名者的公钥,已签名文件和原文件。

python 求反对称矩阵 python对称数_数字证书_17

接下来就是验证签名:

python 求反对称矩阵 python对称数_密码学_18

这里我们对之前的签名文件进行签名验证,页面显示验证成功:

python 求反对称矩阵 python对称数_数字证书_19

如果我们选择的文件是不正确的文件,则页面显示签名验证失败:

python 求反对称矩阵 python对称数_python 求反对称矩阵_20

至此,本次的所有内容已经展示完毕。

四.注意事项:

(1)我觉得可以加入网络通信功能,可利用socket实现。收发双方如果都是利用该软件,那么他们的传输协议等都是一致的,发送者可以将自己的秘密文件发送给对应的接收者。如果以后有时间,我会加入该模块并不断完善系统。

(2)本实验的对于文件加解密,签名等的实现,都是采取固定的模式,如果把这部分设置为用户可选,效果会更好。

(3)目前程序对于用户公私钥都是存放在用户自定义的文件夹,如果能够实现对于存放这些秘密文件的文件夹实现加密,系统便更加完善了。

(4)因源码文件较多,如果需求可到这里下载