GPG
這裡參考了"阮一峰的網絡日志"來進行實驗的,該部落格位址如下:
http://www.ruanyifeng.com/blog/2013/07/gpg.html
一、安裝
sudo apt-get install gnupg
我執行安裝指令時,發現系統已經自帶了GPG,是以打算直接使用自帶的GPG來做實驗。
我這裡的版本是1.4.20。
它有的用法以及其它很多參數,可以通過–help來檢視
二、生成密鑰
gpg --gen-key
回車之後,會跳出一大段的文字,讓我們選擇要使用的加密算法,預設是加密和簽名都使用REA,這裡我也選擇了預設項。
接下來是密鑰長度,越長越安全,預設是2048位,這裡也是選擇預設,回車即可。
然後是期限,說明如下:
這裡由于密鑰隻是我個人使用,并且能夠保證有效的保管私鑰,是以選擇了永不過期,也是預設選項。
回答完這些問題之後,系統會讓我們确認資訊,選y之後可以進入個人資訊的提供環節:
這裡填寫真實資訊之後,會讓我們來最後确認一次:
輸入O表示确定之後,系統會讓我們設定私鑰的密碼,這樣一方面可以防止誤操作,也可以防止系統被侵入時有人擅自動用私鑰。
這裡一切就緒之後,密鑰生成就開始了,這個時候,它會提示我們做一些瑣事,并且如果做的不夠多,它還會有提示:
三、遇見錯誤及解決方式
第一次走完整個步驟的時候,它報出了如下的錯誤:
我以為是沒有聯網的緣故開了熱點又進行了一次,依然報了這個錯,于是通過百度找到了一種錯誤原因以及解決方式:
今天在fedora的中文翻譯組上訂閱的時候,用到gpg,生成密鑰的時候,提示有gpg:找不到可寫的公鑰鑰匙環:eof (gpg: no writable public keyring found: eof)的錯誤,百度上搜了一下,竟然就一個網頁,而且還不對題;随後google一下,把對應的英文提示搜出來了,再用這英文提示搜一下,嘿,找到答案了:
cd /root
mkdir .gunpg
chmod 555 .gnupg/
原來是因為沒有.gunpg這個目錄造成的。
這裡我看了我的root目錄,發現有.gunpg這個隐藏目錄,不過權限卻不是555,是以我想可能這裡需要root權限才能解決問題,是以我用如下指令運作了gpg
sudo gpg --gen-key
并且再跑了一遍整個流程
此時成功生成了公鑰和私鑰
這裡的D9358A6C是我"使用者ID"的Hash字元串,可以用來代替"使用者ID"
四、生成"撤銷證書"
生成"撤銷證書"的目的是為了在以後密鑰廢棄時,可以請求外部的公鑰伺服器來撤銷公鑰。
這裡使用者ID,我使用了剛才生成的Hash字元串,并且填寫相關資訊之後,就能夠生成一個吊銷證書。
五、密鑰管理
1.列出密鑰
這裡仍然需要特權執行,否則會提示權限不夠
sudo gpg --list-keys
第一行是公鑰檔案名,第二行是私鑰特征(2048位,Hash字元串和生成時間),第三行是使用者ID,第四行是私鑰的特征。
如果想要删除某個密鑰,可以使用如下指令:
2.輸出密鑰
公鑰檔案是以二進制形式存儲的,使用armor參數可以将其轉換為ASCII碼顯示
私鑰檔案也可以用類似的方式轉換
gpg --armor --output [輸出檔案名] --export-secret-keys
這裡如果有多個私鑰的話,可以用以下指令來輸出特定的私鑰
不過感覺似乎并不是所有版本都可行的,至少我一個同學的版本這條指令執行結果是失敗的
3.上傳公鑰
gpg --send-keys [使用者ID] --keyserver hkp://subkeys.pgp.net
使用該指令,可以将公鑰上傳到伺服器hkp://subkeys.pgp.net上,通過交換機制,所有公鑰伺服器最終都會包含自己的公鑰。
可以生成一個公鑰指紋來讓他人進行核對下載下傳到的公鑰是否為真:
4.輸入密鑰
導入他人公鑰或者自己的其他密鑰
gpg --import [密鑰檔案]
從公鑰伺服器上擷取他人公鑰
下載下傳之後還需要用其他機制驗證。
六、加密和解密
1.加密
這裡我現在實驗目錄下建立了一個test.txt
然後利用指令進行加密
sudo gpg --recipient [使用者ID] --output test.en.txt --encrypt test.txt
這裡recipient後面指定接受者的公鑰,output後面是加密後的檔案名,encrypt後面是源檔案。
執行之後可以檢視生成的檔案。
可以看到已經無法看出原來的内容了。
2.解密
使用如下指令解密,這裡我來解密剛才生成的test.en.txt
sudo gpg --decrypt test.en.txt
部落格中的指令後面有output參數,但是我這裡使用之後它會提示我用法錯誤,省略之後就正常了,不過檔案内容也是直接在指令行中列印了出來
運作結果如下:
這裡省略decrypt也是可以的,gpg預設是執行解密。
後來我又試驗了一下這裡的輸出檔案方式,發現隻要将–output參數放在–encrypt參數之前運作,就不會有問題,指令如下:
sudo gpg --output ./asc.txt --decrypt test.en.txt
可見,此時成功将解密内容輸出到了asc.txt中。
七、簽名
1. 對檔案簽名
簽名的目的是為了表示某個檔案确實是由本人發出的,使用sign參數來進行簽名。
這裡依然對之前建立的test.txt進行簽名。
sudo gpg --sign test.txt
運作之後,目前目錄下生成了一個demo.txt.gpg檔案,也就是簽名之後的檔案,這裡是二進制形式存儲:
也可以生成ASCII碼的簽名檔案,可以使用clearsign參數
sudo gpg --clearsign test.txt
這裡可以生成一個ASCII碼類型的簽名檔案
如果想生成單獨的簽名檔案,與檔案内容分開存放的話,可以用detach-sign參數
sudo gpg --detach-sign test.txt
這樣可以在目錄下生成一個單獨的二進制形式簽名檔案test.txt.sig,如果想采用ASCII碼形式,需要加上armor參數。
sudo gpg --armor --detach-sign test.txt
可以在簽名的時候同時加密,示例如下:
sudo gpg --local-user [發信者ID] --recipient [接收者ID] --armor --sign --encrypt demo.txt
2.驗證簽名
使用verify參數就可以用對方的公鑰來對檔案簽名進行驗證,verify參數用來驗證。
sudo gpg --verify test.txt.asc test.txt
這裡運作結果如下:
可見驗證成功。
八、DIY環節
這裡我利用gpg指令配合其他shell指令以及簡單的shell語句實作了一個簡單的密碼本程式,用來儲存自己其他的密碼,這樣隻需要儲存好這個密碼檔案以及自己的密鑰,以及其對應的密碼即可。這個程式實作了建立密碼本、檢視所有密碼、添加密碼、查找密碼的功能。
1.建立密碼本
touch password.txt #建立一個新檔案
gpg --recipient LiHaoMing --output password.en.txt --encrypt password.txt #加密這個檔案生成加密檔案
rm password.txt #删除原檔案
運作如下:
可見,這裡建立了一個新的加密檔案。
2.添加密碼
這個邏輯略長,不過也很好了解
while [ -z $des ]; #當描述為空時循環執行
do
echo 輸入密碼描述,不可空 #提示語句
read des #讀取輸入
done
while [ -z $username ]; #當使用者賬号為空時循環執行
do
echo 輸入賬号,不可空 #提示語句
read username #讀取輸入
done
while [ -z $password ];
do
echo 輸入密碼,不可空
read password
done
gpg --output password.txt --decrypt password.en.txt #解密檔案
echo $des>>password.txt #添加描述
echo $username $password>>password.txt
rm password.en.txt #移除加密檔案
gpg --recipient LiHaoMing --output password.en.txt --encrypt password.txt #加密
rm password.txt #移除密碼本
運作如下:
3.檢視所有密碼
gpg --decrypt password.en.txt
運作如下:
4.查找密碼
這裡用grep指令配合,通過密碼描述來查找對應的賬号和密碼
read keyword
gpg --decrypt password.en.txt | grep $keyword -A 1
運作如下:
最後利用switch語句,通過參數的選擇來執行對應部分的功能即可,完整程式如下:
case $1 in
-m )
#echo 建立新的空密碼本
touch password.txt #建立一個新檔案
gpg --recipient LiHaoMing --output password.en.txt --encrypt password.txt #加密這個檔案生成加密檔案
rm password.txt #删除原檔案
exit 0;;
-r )
#echo 檢視密碼
gpg --decrypt password.en.txt
exit 0;;
-a )
echo 添加密碼
while [ -z $des ];
do
echo 輸入密碼描述,不可空
read des
done
while [ -z $username ];
do
echo 輸入賬号,不可空
read username
done
while [ -z $password ];
do
echo 輸入密碼,不可空
read password
done
gpg --output password.txt --decrypt password.en.txt #解密檔案
echo $des>>password.txt #添加描述
echo $username $password>>password.txt
rm password.en.txt #移除加密檔案
gpg --recipient LiHaoMing --output password.en.txt --encrypt password.txt #加密
rm password.txt #移除密碼本
#echo $des $username $password
exit 0;;
-f )
echo 請輸入要查找的關鍵字
read keyword
gpg --decrypt password.en.txt | grep $keyword -A 1
exit 0;;
esac
這個程式還有很多需要完善的地方,比如說如果輸入過程中密碼輸錯了需要修改之類的情況沒有進行處理,是以以後有時間的話可以進一步的完成這個程式,此外就是一定要儲存好自己的密鑰、并記住對應的密碼,否則可能會讓輸進去的一堆密碼再也找不回來。