信息安全技術實用教程-第4版---張同光---ISBN-9787121423031---3.4.3實例——用非對稱加密算法加密文件
https://my.oschina.net/ztguang/blog/5329391
主 編: 張同光
ISBN號: 978-7-121-42303-1 9787121423031
出版日期: 2021-11-20
出版社: 電子工業出版社
頁碼: 定價:¥69.80元
3.4.3 實例——用非對稱加密算法加密文件
根據虛擬機KaliLinux的vdi文件KaliLinux.vdi創建虛擬機KaliLinux-2,具體的創建過程可以參考第一章的1.7.4節和網絡資料,虛擬機KaliLinux-2的主要參數設置如圖3.55所示,網絡連接方式選擇“網絡地址轉換(NAT)”。
注意:VirtualBox導入vdi時報錯“Cannot register the hard disk because a hard disk with UUID already exists.”,解決方法是打開帶管理員權限的PowerShell,切換到VirtualBox安裝目錄(比如C:\Program Files\Oracle\VirtualBox),執行如下命令:
.\VBoxManage.exe internalcommands sethduuid C:\ztg\VirtualBox-OS-vdi\KaliLinux.vdi
圖3.55 創建虛擬機KaliLinux-2
3.4.3.1 用GnuPG加密文件
GnuPG軟件包(Gnu Privacy Guard,Gnu隱私保鏢),軟件包的名稱是gpg。
1.在虛擬機KaliLinux中,創建密鑰對
在虛擬機KaliLinux中,創建一個用來發送加密數據和進行解密數據的密鑰。
執行gpg --gen-key命令,生成密鑰,如圖3.56所示,根據提示輸入相關信息。
圖3.56 創建密鑰
現在已經在.gnupg目錄中生成了一對密鑰且存在於文件中,進入.gnupg目錄進行查看,如圖3.57所示。
圖3.57 .gnupg目錄內容
2.在虛擬機KaliLinux中,提取公共密鑰
爲了使對方(虛擬機KaliLinux-2)使用剛纔生成的公共密鑰(1FCB3E8FEA808287),需要用命令將公共密鑰提取出來,發送給對方。執行命令gpg --export 1FCB3E8FEA808287 > pub.key,將公共密鑰提取到文件pub.key中。
3.KaliLinux-2收到KaliLinux的公共密鑰
在虛擬機KaliLinux-2中,收到對方(虛擬機KaliLinux)的公共密鑰後(在虛擬機和宿主機之間通過拖放的方法),執行命令gpg --import pub.key把這個公共密鑰放到自己的pubring.kbx文件(鑰匙環文件)裏,執行命令gpg --delete-secret-and-public-key 1FCB3E8FEA808287可以將公共密鑰從鑰匙環文件中刪除。命令的執行如圖3.58所示。
圖3.58 保存別人的公共密鑰
執行gpg –kv命令查看目前存放的別人的公共密鑰,如圖3.59所示。
圖3.59 查看公共密鑰
圖3.60 用公共密鑰加密文件
4.KaliLinux-2使用KaliLinux的公共密鑰加密文件
在虛擬機KaliLinux-2中,執行gpg -ea -r 1FCB3E8FEA808287 gpg_temp.txt對gpg_temp.txt文件進行加密。
-e:代表加密。
-a:代表ASCII格式。
-r:後面是公共密鑰標識。
1FCB3E8FEA808287:爲密鑰標識。
該命令執行後,在當前目錄下生成了一個同名的gpg_temp.txt.asc的文件,即加密後的文件。具體執行過程如圖3.60所示。
5.KaliLinux對KaliLinux-2發來的加密文件進行解密
KaliLinux收到KaliLinux-2發來的加密文件gpg_temp.txt.asc後,執行gpg -o gpg_temp2.txt -d gpg_temp.txt.asc命令,用私有密鑰對加密文件進行解密。
-o:輸出文件。
-d:表示解密。
在當前目錄下生成了解密後的文件gpg_temp2.txt。具體執行過程如圖3.61所示。
圖3.61 對加密文件進行解密
3.4.3.2 用OpenSSL加密解密文件
在安全性要求比較高的環境下,可以藉助OpenSSL工具對數據進行加密,這樣能進一步的保障數據的安全性,幾乎所有的Linux發行版裏都會預裝OpenSSL。OpenSSL可以實現消息摘要、文件的加密和解密、數字證書、數字簽名和隨機數字。SSL是Secure Sockets Layer的縮寫,是支持在Internet上進行安全通信的標準,並且將數據密碼技術集成到協議中。數據在離開計算機之前被加密,然後只有到達它預定的目標後才被解密。
下面介紹2種使用OpenSSL加密解密方法:(1)使用密碼加密解密;(2)使用密鑰加密解密。
1.使用密碼加密解密
1)對文件加密或解密
第1步:在虛擬機KaliLinux中,執行如下命令加密一個文件,test1.txt爲原始文件,test1.txt.aes爲加密之後的文件。
echo openssl enc test > test1.txt
openssl enc -e -aes256 -in test1.txt -out test1.txt.aes
其中,
enc:表示對文件進行對稱加密或解密;
-e:表示對一個文件進行加密操作;
-aes256:表示使用aes256算法進行加密或解密;
-in:表示需要被加密的文件;
-out:表示加密之後生成的新文件。
加密過程中會要求輸入一個加密密碼,重複輸入兩次即可完成對文件的加密。
第2步:在虛擬機KaliLinux-2中,執行如下命令解密一個文件,test1.txt.aes爲加密的文件,test1.txt爲解密之後的文件。
openssl enc -d -aes256 -in test1.txt.aes -out test1.txt
其中,
enc:表示對文件進行對稱加密或解密;
-d:表示對文件進行解密操作;
-aes256:表示使用aes256算法進行加密或解密;
-in:表示需要被解密的文件;
-out:表示解密之後生成的新文件。
解密一個文件的時候會要求輸入加密文件時設置的密碼才能進行解密。
2)配合tar對文件夾加密或解密
第1步:在虛擬機KaliLinux中,執行如下命令打包並加密文件夾。
mkdir -p testdir/{a,b,c}
echo openssl des3 testdir > testdir/a/testdir.txt
tar czvf - testdir | openssl des3 -salt -k password -out testdir.tar.gz
該例中以des3加密方式,設置密碼爲password的方式加密testdir文件夾並將加密後的文件輸出爲testdir.tar.gz。使用-k參數,這樣就免出了讓提示輸密碼的麻煩。這樣可以方便以腳本的方式對敏感文件進打包並加密。
上面的操作也可以分兩步來完成,第一步先通過tar czvf testdirtmp.tar.gz testdir進行打包備份。第二步再通過openssl des3 -salt -k password -in testdirtmp.tar.gz -out testdir.tar.gz的方式加密。
第2步:在虛擬機KaliLinux-2中,執行如下命令解密並解包文件夾。
openssl des3 -d -k password -salt -in testdir.tar.gz | tar xzvf -
上述操作的具體過程如圖3.62所示。
圖3.62 使用密碼加密解密
2.使用密鑰加密解密
有時會出現忘記密碼的情況,另外如果密碼設置的太簡單,很容易被破解,這時可以能過密鑰的方式進行加密和解密。
第1步:在虛擬機KaliLinux中,執行如下命令生成一個2048位的密鑰文件test.key。
openssl genrsa -out test.key 2048
test.key密鑰文件包含了公鑰和密鑰兩部分,該文件即可以用於加密和解密。可以將公鑰從test.key密鑰文件中提取出來,供自己或他人用於加密(僅能用來加密,無法用來解密)。
第2步:在虛擬機KaliLinux中,執行如下命令從test.key密鑰文件中提取出公鑰。
openssl rsa -in test.key -pubout -out test_pub.key
其中test_pub.key爲公鑰文件,密鑰文件test.key包含公鑰和私鑰。
第3步:在虛擬機KaliLinux-2中,執行如下命令利用公鑰test_pub.key加密文件。
echo openssl rsautl test > test2.txt
openssl rsautl -encrypt -in test2.txt -inkey test_pub.key -pubin -out test2.txt.en
此處利用公鑰加密test2.txt文件,並輸出爲test2.txt.en,-in指定要加密的文件,-inkey指定密鑰,-pubin表明是用純公鑰文件加密,-out爲加密後的文件。
第4步:在虛擬機KaliLinux中,執行如下命令利用密鑰文件test.key中的私鑰解密一個文件。
openssl rsautl -decrypt -in test2.txt.en -inkey test.key -out test2.txt
此處利用私鑰解密test2.txt.en文件,並輸出爲test2.txt,-in指定要解密的文件,-inkey指定密鑰,-out爲解密後的文件。
上述操作的具體過程如圖3.63所示。
圖3.63 使用密鑰加密解密