0


python实现对称加密、数字签名、数字证书颁发

一.开发目的:

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

二.开发环境:

  • 硬件环境:处理器: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)]

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

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8pyYLIsd-1677143057159)(D:\桌面文件\assets\1677140623252.png)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eQoq9KA7-1677143057160)(D:\桌面文件\assets\1677140652904.png)]

  • 示例:在这里,我对一个桌面上的txt文件进行了加密:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LzO8YWV5-1677143057161)(D:\桌面文件\assets\1677140705996.png)]在对应的文件夹生成了一下文件:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5B2hTunO-1677143057162)(D:\桌面文件\assets\1677140726858.png)]这里保存了本次加密的初始向量,系统和用户口令拼接生成的256位的密钥以及系统产生的256位的随机密钥。这样当用户解密文件的时候,当用户输入口令时,系统会将用户口令和系统产生的随机密钥进行拼接并做sha256的哈希,用生成的密钥进行解密。下面是加密之后的文件内容:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jl1Gm9Ff-1677143057163)(D:\桌面文件\assets\1677140756110.png)]如果是图片加密的话,则显示无法查看:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eknZJPat-1677143057163)(D:\桌面文件\assets\1677140784283.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vrb5GSnA-1677143057164)(D:\桌面文件\assets\1677140795331.png)]

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VwEQ3met-1677143057165)(D:\桌面文件\assets\1677140889962.png)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EWV9QrPh-1677143057166)(D:\桌面文件\assets\1677140908050.png)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aGZuC5KW-1677143057166)(D:\桌面文件\assets\1677140927704.png)]

(5)数字证书的颁发:

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

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wdwygi7v-1677143057167)(D:\桌面文件\assets\1677141039366.png)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h544iTcD-1677143057168)(D:\桌面文件\assets\1677141058840.png)]

  • 示例:下面是我用自己的私钥给LZW颁发的数字证书,页面显示数字证书颁发成功:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5YMdCYnu-1677143057168)(D:\桌面文件\assets\1677141099281.png)]在相应的文件夹下,我们看到如下文件:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qb0hm4MV-1677143057169)(D:\桌面文件\assets\1677141118090.png)]其中uni_public_key_pem并不是生成的文件,而是证书申请者的公钥。里面的private_key和public_key是我的临时公私钥,而certificate是生成的数字证书,内容如下:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wlFVKzM0-1677143057170)(D:\桌面文件\assets\1677141150923.png)]

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

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hfCiiSLl-1677143057171)(D:\桌面文件\assets\1677141603520.png)]

  • 示例:这里我还是选择对上面的txt文件进行数字签名,页面显示签名成功:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EsA9cNAP-1677143057172)(D:\桌面文件\assets\1677141656693.png)]在相应的文件夹,我们可以看到对应的签名文件:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dUM9ulIJ-1677143057173)(D:\桌面文件\assets\1677141692914.png)]

(7)签名验证:

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RcDSm5NZ-1677143057174)(D:\桌面文件\assets\1677141744487.png)]

接下来就是验证签名:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pJdQxend-1677143057174)(D:\桌面文件\assets\1677141760351.png)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bjBURsjR-1677143057175)(D:\桌面文件\assets\1677141784050.png)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fHy9es4V-1677143057176)(D:\桌面文件\assets\1677141803634.png)]

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

四.注意事项:

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

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

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

(4)因源码文件较多,如果需求可到这里下载https://download.csdn.net/download/weixin_63137680/87486255


本文转载自: https://blog.csdn.net/weixin_63137680/article/details/129185551
版权归原作者 雨蛏 所有, 如有侵权,请联系我们删除。

“python实现对称加密、数字签名、数字证书颁发”的评论:

还没有评论