一.開發(fā)目的:
理解開源密碼庫實現(xiàn)的基本架構(gòu),熟悉對稱算法的加解密函數(shù)封裝與調(diào)用,并能能夠利用開源設(shè)計接口進行二次封裝,并實現(xiàn)一個界面友好,功能正確的采用對稱算法的文件加解密工具。
二.開發(fā)環(huán)境:
-
硬件環(huán)境:
處理器:Intel?Core?i5-1035G1 CPU @1.00GHz 1.19GHz2?
-
軟件環(huán)境:
操作系統(tǒng):windows 10操作系統(tǒng)
開發(fā)工具:python3.9 + pycharm2021.2.1
三.開發(fā)步驟和重點代碼介紹:
(1)確定開發(fā)工具:
我通過仔細閱讀openssl的源碼之后,發(fā)現(xiàn)python中關(guān)于文件加解密的庫crypto和cryptography在底層都是用openssl實現(xiàn)的文件加解密,我恰好對python比較熟悉,就決定用python實現(xiàn)。
(2)UI設(shè)計:
在python中,thinter庫是一個比較簡單好用的UI庫,在本次實驗中,我的UI都是用這個庫完成的。比如程序中涉及的所有文件路徑的讀取,我都是從UI界面直接進行讀取的,最終程序界面如下:
(3)使用AES-CBC模式實現(xiàn)對于任意文件的加密:
AES為分組加密算法,把明文每128位分成一組,每次加密一組數(shù)據(jù),直到加密完整個明文。如果說明文的分組不夠128位,需要填充。這里我的密鑰選擇256位的,初始向量IV是128位的。
經(jīng)分析,我們的密鑰不能從系統(tǒng)直接隨機產(chǎn)生后,便開始對文件進行加密,因為我們還要考慮到用戶口令。所以在這里,我通過將系統(tǒng)產(chǎn)生的256位的隨機密鑰和用戶輸入的口令拼接,然后對它們進行sha256的哈希得到256位的隨機加密密鑰:
因為要實現(xiàn)對于任意文件的加密,所以程序?qū)ξ募且远M制形式讀取的,然后對讀取到的二進制文件進行AES-CBC加密,完成加密后對加密文件,加密密鑰等進行保存:
-
示例:
在這里,我對一個桌面上的txt文件進行了加密:
在對應(yīng)的文件夾生成了一下文件:
這里保存了本次加密的初始向量,系統(tǒng)和用戶口令拼接生成的256位的密鑰以及系統(tǒng)產(chǎn)生的256位的隨機密鑰。這樣當用戶解密文件的時候,當用戶輸入口令時,系統(tǒng)會將用戶口令和系統(tǒng)產(chǎn)生的隨機密鑰進行拼接并做sha256的哈希,用生成的密鑰進行解密。
下面是加密之后的文件內(nèi)容:
如果是圖片加密的話,則顯示無法查看:
(4)對加密的文件進解密:
文件解密,我們要選擇要解密的文件,然后輸入用戶口令,選擇要保存的文件夾,如果解密成功,頁面會顯示解密成功,如果是用戶口令錯誤,則會顯示口令錯誤。
這里選擇之前加密的圖片文件,顯示解密成功:
在對應(yīng)的文件夾下生成了如下文件,并可以查看:
(5)數(shù)字證書的頒發(fā):
數(shù)字證書通過可信任的證書頒發(fā)機構(gòu),保證了通信雙方的身份認證,也解決了公鑰分發(fā)問題。數(shù)字證書里面包括頒發(fā)者的信息,被頒發(fā)者的公鑰信息、身份信息、證書的序列號、證書的簽名算法以及該數(shù)字證書的有效期等等。在本次實驗中,我才用了自己給自己頒發(fā)數(shù)字證書的模式,來研究數(shù)字證書。
在python的cryptography庫中的x509實現(xiàn)了數(shù)字證書的頒發(fā)。在UI界面,我們需要申請人的身份信息以及公鑰信息,而我們自己的私鑰信息已經(jīng)被寫入到程序中,無須UI輸入。
首先讀取到用戶的公鑰信息并生成我們自己的公私鑰:
然后利用x509模塊,實現(xiàn)數(shù)字證書的頒發(fā)并保存:
-
示例:
下面是我用自己的私鑰給LZW頒發(fā)的數(shù)字證書,頁面顯示數(shù)字證書頒發(fā)成功:
在相應(yīng)的文件夾下,我們看到如下文件:
其中uni_public_key_pem并不是生成的文件,而是證書申請者的公鑰。里面的private_key和public_key是我的臨時公私鑰,而certificate是生成的數(shù)字證書,內(nèi)容如下:
(6)用私鑰實現(xiàn)數(shù)字簽名:
數(shù)字簽名采用非對稱密碼體制,發(fā)送者使用自己的私鑰對文件進行簽名,接收者使用發(fā)送者的公鑰進行簽名驗證。數(shù)字簽名解決了在消息認證碼中無法實現(xiàn)的抗抵賴性。如果對一份完整的文件進行數(shù)字簽名,相當于用私鑰進行了加密,如果文件很大,加密時間很長甚至對于某些實時性要求很高的場景不適用,所以我選擇對文件的哈希值進行數(shù)字簽名,在驗簽階段,只需要比較哈希值是否一致就可以。文件哈希采用sha256進行哈希。
在數(shù)字簽名的UI界面,我們需要選擇要簽名的文件,我的私鑰,以及對于簽名后的文件要保存的位置。
-
示例:
這里我還是選擇對上面的txt文件進行數(shù)字簽名,頁面顯示簽名成功:
在相應(yīng)的文件夾,我們可以看到對應(yīng)的簽名文件:
(7)簽名驗證:
因為我們在簽名的時候是對文件的哈希值進行簽名,所以在驗簽階段,我們只需要選擇原文件(這里的原文件是指簽名者連同簽名文件一起發(fā)過來的文件)和已簽名的文件,對原文件進行哈希,對已簽名的文件進行解密得到哈希,比較兩者的哈希值是否相等即可。
首先需要讀取三個文件:簽名者的公鑰,已簽名文件和原文件。
接下來就是驗證簽名:
這里我們對之前的簽名文件進行簽名驗證,頁面顯示驗證成功:
如果我們選擇的文件是不正確的文件,則頁面顯示簽名驗證失敗:
至此,本次的所有內(nèi)容已經(jīng)展示完畢。
四.注意事項:
(1)我覺得可以加入網(wǎng)絡(luò)通信功能,可利用socket實現(xiàn)。收發(fā)雙方如果都是利用該軟件,那么他們的傳輸協(xié)議等都是一致的,發(fā)送者可以將自己的秘密文件發(fā)送給對應(yīng)的接收者。如果以后有時間,我會加入該模塊并不斷完善系統(tǒng)。
(2)本實驗的對于文件加解密,簽名等的實現(xiàn),都是采取固定的模式,如果把這部分設(shè)置為用戶可選,效果會更好。
(3)目前程序?qū)τ谟脩艄借€都是存放在用戶自定義的文件夾,如果能夠?qū)崿F(xiàn)對于存放這些秘密文件的文件夾實現(xiàn)加密,系統(tǒng)便更加完善了。文章來源:http://www.zghlxwxcb.cn/news/detail-641989.html
(4)因源碼文件較多,如果需求可到這里下載https://download.csdn.net/download/weixin_63137680/87486255文章來源地址http://www.zghlxwxcb.cn/news/detail-641989.html
到了這里,關(guān)于python實現(xiàn)對稱加密、數(shù)字簽名、數(shù)字證書頒發(fā)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!