一.开发目的:
理解开源密码库实现的基本架构,熟悉对称算法的加解密函数封装与调用,并能能够利用开源设计接口进行二次封装,并实现一个界面友好,功能正确的采用对称算法的文件加解密工具。
二.开发环境:
- 硬件环境:处理器: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界面直接进行读取的,最终程序界面如下:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RFO3Xm8k-1677143057157)(D:\桌面文件\assets\1677140404510.png)]](https://img-blog.csdnimg.cn/56236306b3ae4da6ae616132f21eb7f3.png)
(3)使用AES-CBC模式实现对于任意文件的加密:
AES为分组加密算法,把明文每128位分成一组,每次加密一组数据,直到加密完整个明文。如果说明文的分组不够128位,需要填充。这里我的密钥选择256位的,初始向量IV是128位的。
经分析,我们的密钥不能从系统直接随机产生后,便开始对文件进行加密,因为我们还要考虑到用户口令。所以在这里,我通过将系统产生的256位的随机密钥和用户输入的口令拼接,然后对它们进行sha256的哈希得到256位的随机加密密钥:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8pyYLIsd-1677143057159)(D:\桌面文件\assets\1677140623252.png)]](https://img-blog.csdnimg.cn/70c9f2c2e56b400a90248cca9d8caca7.png)
因为要实现对于任意文件的加密,所以程序对文件是以二进制形式读取的,然后对读取到的二进制文件进行AES-CBC加密,完成加密后对加密文件,加密密钥等进行保存:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eQoq9KA7-1677143057160)(D:\桌面文件\assets\1677140652904.png)]](https://img-blog.csdnimg.cn/f6d225bcc4034f6c8eb6e58aed052db2.png)
- 示例:在这里,我对一个桌面上的txt文件进行了加密:
在对应的文件夹生成了一下文件:
这里保存了本次加密的初始向量,系统和用户口令拼接生成的256位的密钥以及系统产生的256位的随机密钥。这样当用户解密文件的时候,当用户输入口令时,系统会将用户口令和系统产生的随机密钥进行拼接并做sha256的哈希,用生成的密钥进行解密。下面是加密之后的文件内容:
如果是图片加密的话,则显示无法查看:![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eknZJPat-1677143057163)(D:\桌面文件\assets\1677140784283.png)]](https://img-blog.csdnimg.cn/54883289b5a340e380ea59e523ab9fa8.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vrb5GSnA-1677143057164)(D:\桌面文件\assets\1677140795331.png)]](https://img-blog.csdnimg.cn/6bd4ae11b58f4e06a47849ce38e869ba.png)
(4)对加密的文件进解密:
文件解密,我们要选择要解密的文件,然后输入用户口令,选择要保存的文件夹,如果解密成功,页面会显示解密成功,如果是用户口令错误,则会显示口令错误。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VwEQ3met-1677143057165)(D:\桌面文件\assets\1677140889962.png)]](https://img-blog.csdnimg.cn/66295ff5dc4a4e398b403813132e6d1b.png)
这里选择之前加密的图片文件,显示解密成功:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EWV9QrPh-1677143057166)(D:\桌面文件\assets\1677140908050.png)]](https://img-blog.csdnimg.cn/34f3e6c3af924b7e806ba30050c9bf8e.png)
在对应的文件夹下生成了如下文件,并可以查看:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aGZuC5KW-1677143057166)(D:\桌面文件\assets\1677140927704.png)]](https://img-blog.csdnimg.cn/2719eca502df4bf5988b7c6894db5687.png)
(5)数字证书的颁发:
数字证书通过可信任的证书颁发机构,保证了通信双方的身份认证,也解决了公钥分发问题。数字证书里面包括颁发者的信息,被颁发者的公钥信息、身份信息、证书的序列号、证书的签名算法以及该数字证书的有效期等等。在本次实验中,我才用了自己给自己颁发数字证书的模式,来研究数字证书。
在python的cryptography库中的x509实现了数字证书的颁发。在UI界面,我们需要申请人的身份信息以及公钥信息,而我们自己的私钥信息已经被写入到程序中,无须UI输入。
首先读取到用户的公钥信息并生成我们自己的公私钥:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wdwygi7v-1677143057167)(D:\桌面文件\assets\1677141039366.png)]](https://img-blog.csdnimg.cn/7e22def7a5b64eaa9aa24fb482279418.png)
然后利用x509模块,实现数字证书的颁发并保存:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h544iTcD-1677143057168)(D:\桌面文件\assets\1677141058840.png)]](https://img-blog.csdnimg.cn/d44791167c044ea39c8625174cb9c8e7.png)
- 示例:下面是我用自己的私钥给LZW颁发的数字证书,页面显示数字证书颁发成功:
在相应的文件夹下,我们看到如下文件:
其中uni_public_key_pem并不是生成的文件,而是证书申请者的公钥。里面的private_key和public_key是我的临时公私钥,而certificate是生成的数字证书,内容如下:![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wlFVKzM0-1677143057170)(D:\桌面文件\assets\1677141150923.png)]](https://img-blog.csdnimg.cn/c02b8790f4f945b1836c75acc1db0471.png)
(6)用私钥实现数字签名:
数字签名采用非对称密码体制,发送者使用自己的私钥对文件进行签名,接收者使用发送者的公钥进行签名验证。数字签名解决了在消息认证码中无法实现的抗抵赖性。如果对一份完整的文件进行数字签名,相当于用私钥进行了加密,如果文件很大,加密时间很长甚至对于某些实时性要求很高的场景不适用,所以我选择对文件的哈希值进行数字签名,在验签阶段,只需要比较哈希值是否一致就可以。文件哈希采用sha256进行哈希。
在数字签名的UI界面,我们需要选择要签名的文件,我的私钥,以及对于签名后的文件要保存的位置。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hfCiiSLl-1677143057171)(D:\桌面文件\assets\1677141603520.png)]](https://img-blog.csdnimg.cn/bbce8093a1a243e0ad75638353ec4342.png)
- 示例:这里我还是选择对上面的txt文件进行数字签名,页面显示签名成功:
在相应的文件夹,我们可以看到对应的签名文件:![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dUM9ulIJ-1677143057173)(D:\桌面文件\assets\1677141692914.png)]](https://img-blog.csdnimg.cn/aa5f739bdd714e5698cc748d67c5257f.png)
(7)签名验证:
因为我们在签名的时候是对文件的哈希值进行签名,所以在验签阶段,我们只需要选择原文件(这里的原文件是指签名者连同签名文件一起发过来的文件)和已签名的文件,对原文件进行哈希,对已签名的文件进行解密得到哈希,比较两者的哈希值是否相等即可。
首先需要读取三个文件:签名者的公钥,已签名文件和原文件。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RcDSm5NZ-1677143057174)(D:\桌面文件\assets\1677141744487.png)]](https://img-blog.csdnimg.cn/79fde2cb0c914c2098772f09b6d9b193.png)
接下来就是验证签名:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pJdQxend-1677143057174)(D:\桌面文件\assets\1677141760351.png)]](https://img-blog.csdnimg.cn/4b0955dceeae4f648405594a0d3acb64.png)
这里我们对之前的签名文件进行签名验证,页面显示验证成功:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bjBURsjR-1677143057175)(D:\桌面文件\assets\1677141784050.png)]](https://img-blog.csdnimg.cn/8154aab2c8cb4c92a42316326905fa63.png)
如果我们选择的文件是不正确的文件,则页面显示签名验证失败:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fHy9es4V-1677143057176)(D:\桌面文件\assets\1677141803634.png)]](https://img-blog.csdnimg.cn/0faa5d69aba44013b37068ee35d939f0.png)
至此,本次的所有内容已经展示完毕。
四.注意事项:
(1)我觉得可以加入网络通信功能,可利用socket实现。收发双方如果都是利用该软件,那么他们的传输协议等都是一致的,发送者可以将自己的秘密文件发送给对应的接收者。如果以后有时间,我会加入该模块并不断完善系统。
(2)本实验的对于文件加解密,签名等的实现,都是采取固定的模式,如果把这部分设置为用户可选,效果会更好。
(3)目前程序对于用户公私钥都是存放在用户自定义的文件夹,如果能够实现对于存放这些秘密文件的文件夹实现加密,系统便更加完善了。
(4)因源码文件较多,如果需求可到这里下载https://download.csdn.net/download/weixin_63137680/87486255
版权归原作者 雨蛏 所有, 如有侵权,请联系我们删除。