gpg(加密簽名工具)使用

原文鏈接:http://blog.chinaunix.net/uid-9525959-id-2001824.html

[功能] 

GPG是加密和數字簽名的免費工具,大多用於加密信息的傳遞。除了僅用密碼加密外,GPG最大的不同是提供了“公鑰/私鑰”對。利用你的“公鑰”別人加密信息不再需要告訴你密碼,隨時隨地都能發送加密信息。而這種加密是單向的,只有你的“私鑰”能解開加密。數字簽名又是另一大使用方向。通過簽名認證,別人能確保發佈的消息來自你,而且沒有經過修改。 

[原理] 

對稱密鑰加密常用的算法DES、Triple DES或IDEA加密,MD5。對稱密鑰加密通信雙方持有同樣的密鑰對密文進行解密。 

公共密鑰加密在報文和網絡方面的應用已成爲流行。RSA實際上用於公共密鑰加密,它是當前所能得到的最強的公共密鑰算法。公共密鑰包含兩個同屬於一方的密鑰:一個是公共密鑰,它被所有人所共享;另一個是私有密鑰,歸個人祕密中存。與對稱密鑰加密不同,公共密鑰加密對加密與解密使用兩把密鑰。一把是祕密的,這是私有密鑰,用來對密文解密。密文本身由公共密鑰產生,公共密鑰分發給要發送加密信息給你的人。其他人如何得到你的公共密鑰?很容易,發佈它即可。你—私有密鑰的所有者,是惟一能對信息進行解密的人。 

數字簽名常用公共密鑰加密來產生簽名,如 RSA和DSA。用公共密鑰產生數字簽名與信息加密的工作相反。信息通過hash函數發送。hash處理後的信息用私有密鑰加密。一旦數據用私有密鑰加密,任何持有公共密鑰的人都能檢驗,它是用私有密鑰產生的,這樣,數據就被驗證了。因此,任何持有公共密鑰的人都可以進行檢驗。這裏的hash函數用於產生數字簽名。Hash函數(散列函數)是一個提取信息和產生一個固定長度的信息個性特徵的數學函數。無論要進行hash方法的信息有多大,輸出的長度都一樣。簡言之,就是將hash處理後的信息用私鑰加密,其它人用公鑰解密恢復成功(恢復成的應該是hash處理的結果?)表示加密的人就是你也就是數字簽名的驗證就成功了。 


[舉例] 

**對稱加密和解密 

這裏,先簡單介紹使用gpg進行對稱加密和解密,後面重點介紹公鑰加密和數字驗證。 

*對稱加密myfile: 

#gpg -c myfile 

這樣,會提示你輸入兩次密碼,然後生成myfile的加密文件myfile.gpg,注意不能對目錄加密,可以用-o選項指定輸出文件名稱。 


*解密對稱加密的文件: 

#gpg -o mydecrypt -d myfile.gpg 

這樣,會提示你輸入解密密碼,輸入之後,將會解密相應的文件,通過-o指定生成的解密文件,-d指定被解密的文件。 



**公鑰加密相關 

*生成鑰匙對: 

[root@lv-k ~]# gpg --gen-key 

輸入之後,輸出和交互提示如下所示: 

#####################以下爲輸出以及交互############################## 

gpg (GnuPG) 1.4.5; Copyright (C) 2006 Free Software Foundation, Inc. 

This program comes with ABSOLUTELY NO WARRANTY. 

This is free software, and you are welcome to redistribute it 

under certain conditions. See the file COPYING for details. 


gpg: 已創建目錄‘/root/.gnupg’ 

gpg: 新的配置文件‘/root/.gnupg/gpg.conf’已建立 

gpg: 警告:在‘/root/.gnupg/gpg.conf’裏的選項於此次運行期間未被使用 

gpg: 鑰匙環‘/root/.gnupg/secring.gpg’已建立 

gpg: 鑰匙環‘/root/.gnupg/pubring.gpg’已建立 

請擇您要使用的密鑰種類: 

   (1) DSA 和 ElGamal (默認) 

   (2) DSA (僅用於簽名) 

   (5) RSA (僅用於簽名) 

您的擇?[Enter] <====輸入 

DSA 密鑰對會有 1024 位。 

ELG-E 密鑰長度應在 1024 位與 4096 位之間。 

您想要用多大的密鑰尺寸?(2048)[Enter] <====輸入 

您所要求的密鑰尺寸是 2048 位 

請設定這把密鑰的效期限。 

         0 = 密鑰永不過期 

      <n>  = 密鑰在 n 天后過期 

      <n>w = 密鑰在 n 周後過期 

      <n>m = 密鑰在 n 月後過期 

      <n>y = 密鑰在 n 年後過期 

密鑰的效期限是?(0)[Enter] 

密鑰永遠不會過期 

以上正確嗎?(y/n)y <====輸入 


您需要一個用戶標識來辨識您的密鑰;本軟件會用真實姓名、註釋和電子郵件地址組合 

成用戶標識,如下所示: 

    “Heinrich Heine (Der Dichter) <[email protected]>” 


真實姓名:quietheart <====輸入 

電子郵件地址:[email protected] <====輸入 

註釋:test <====輸入 

您定了這個用戶標識: 

    “quietheart (test) <[email protected]>” 

更改姓名(N)、註釋(C)、電子郵件地址(E)或確定(O)/退出(Q)?o <====輸入 

您需要一個密碼來保護您的私鑰。 


請輸入密碼:<====輸入 

請再輸入一次密碼:<====輸入 


我們需要生成大量的隨機字節。這個時候您可以多做些瑣事(像是敲打鍵盤、移動 

鼠標、讀寫硬盤之類的),這會讓隨機數字發生器有更好的機會獲得足夠的熵數。 

++++++++++.+++++++++++++++.++++++++++.++++++++++++++++++++++++++++++.++++++++++++++++++++.+++++++++++++++

我們需要生成大量的隨機字節。這個時候您可以多做些瑣事(像是敲打鍵盤、移動 

鼠標、讀寫硬盤之類的),這會讓隨機數字發生器有更好的機會獲得足夠的熵數。 

+++++++++++++++.+++++++++++++++.++++++++++++++++++++.+++++++++++++++++++++++++..++++++++++.+++++.+++++..++++

gpg: /root/.gnupg/trustdb.gpg:建立了信任度數據庫 

gpg: 密鑰 DDBA2DEA 被標記爲絕對信任 

公鑰和私鑰已經生成並經簽名。 


gpg: 正在檢查信任度數據庫 

gpg: 需要 3 份勉強信任和 1 份完全信任,PGP 信任模型 

gpg: 深度:0 有效性:  1 已簽名:  0 信任度:0-,0q,0n,0m,0f,1u 

pub   1024D/DDBA2DEA 2011-06-14 

密鑰指紋 = 790A 0F2D 6826 61F3 A749  0724 DBB2 C0A5 DDBA 2DEA 

uid                  quietheart (test) <[email protected]

sub   2048g/2BBE2C91 2011-06-14 


#####################以上爲輸出以及交互############################## 

這裏,首先要一個鑰匙對才能公鑰加密,這裏根據系統情況不同,可能內容爲英文。需要用戶交互輸入的地方,都通過"<====輸入"這個標記指出來了。若對輸入信息有所改動 ,可把 ~/.gnupg 目錄下除 options 以外的文件刪除 ,再運行 gpg --gen-key 命令 ,或者使用 gpg 的 edit 選項 .  鑰匙對放在 ~/.gnupg 目錄下 . 


*查看已有的鑰匙: 

[root@lv-k .gnupg]# gpg --list-keys 

輸入之後,輸出如下: 

#####################以下爲輸出以及交互############################## 

/root/.gnupg/pubring.gpg 

------------------------ 

pub   1024D/DDBA2DEA 2011-06-14 

uid                  quietheart (test) <[email protected]

sub   2048g/2BBE2C91 2011-06-14 

#####################以上爲輸出以及交互############################## 

這裏, 

pub(公匙)--- public key , ID : DDBA2DEA 

sub(私匙)--- secret key or private key , ID : 2BBE2C91 

假如沒使用root進行操作,可能會輸出如下信息:"gpg: Warning: using insecure memory!" 警告沒有鎖定內存頁 ,一般是連接網上操作有關安全方面的問題 ,沒有事情的 ,可以作這樣的改動 "# chmod 4755 /usr/bin/gpg"。 



*使用gpg密鑰進行加密和解密文件: 

下面我們通過一個具體的例子,演示公鑰加密,私鑰解密的過程。這裏加/解密方式採用RSA算法,公匙與私匙是互補,理論上是不可破解,也沒有人嘗試成功過。假設我們已經使用前面的方法生成了密鑰對。 

1,首先查看待加密的文件如下: 

[root@lv-k gpg_test]# ls 

mygpgtest 

[root@lv-k gpg_test]# cat mygpgtest 

#####################以下爲輸出############################## 

hello! 

welcome come to here 

today is 2011-06-14 

#####################以上爲輸出############################## 


2,公鑰加密過程 

1)使用如下命令加密文件: 

[root@lv-k gpg_test]# gpg -ea -r quietheart mygpgtest 

這裏,使用的密鑰就是前面創建的quietheart,我們可以使用"gpg --list-keys"來查看我們可以選擇用來加密的公鑰。這裏選項"-e"實際就是"--encrypt"表示加密數據;"-a"表示創建ASCII的輸出(可以不用這個選項,這樣生成的文件就不是ASCII的內容了,並且文件後綴是*.gpg);"-r"指定加密的用戶id名稱。 


2)查看加密之後的文件: 

[root@lv-k gpg_test]# ls 

mygpgtest  mygpgtest.asc 

[root@lv-k gpg_test]# cat mygpgtest.asc 

#####################以下爲輸出############################## 

-----BEGIN PGP MESSAGE----- 

Version: GnuPG v1.4.5 (GNU/Linux) 


hQIOA6PEEmMrviyREAf9HCZ5xIlSppneZ6i7Hquxb7xUjn1q0W5ccVek6x0DxSbH 

q55ugy6CmCc/excLC/zblf9qHsNDcZvMV3jjD95gu78NR1lsyDtpG9r5bX/MuPii 

KxYc3oOvGNmDUO9F/g3ul9VCu/rsIkQvwxZHaEGXR3G6XH/tmhKZcjNNIxb1qQiq 

xE7O0NCXEhp8FpOPozY1MzZ7wv4rXLujTrGl13sNqjSVLgp1mcUzuMRCtenttXpg 

q1sXDJ7FXkxQy7UvO8eMmMzPqkFm7KfLYZjkXrYo5ZhG+nfXqs3/HSuJ1fVe8m4/ 

+PVW1Uw2QtkfJiZVxOj60cV0lcK/P1bJHah5xEtbnQf/fI1jitFIuoJjTkoCNbeO 

Sq6Kr0+LjJMaXmlCeA6kZ7RXLHak/O5aR0BpXJCPUBIEFVnu6dftolO6JPcqMbW+ 

5oI4NHaJunHz0eTgOuFBsV3EVjYmH7rabV832ikY0MARWRh/b/osUv+Ht9BlUHaY 

pLoGPXkLeSsCDo714Z/dufLGUEFcNxx/QAmhWGiKH4MacMvKBVE+2uzcMAWqnyEW 

Oaz0bI893YUtbQbti2rdQgVdHHXjWCmQ2YnMWv4pSBAwK7rPOrtehmdsmiOuit6x 

FHvHPldc1o38u0Jg4d0LjCv/rRBdQwasJzr46dwJBOCv5rQ9Rkuul+6rhFQGns1G 

jtJxAZIWwu8ZqD572a3jYVbIl/qBAW+dM3Fnt9NRqFUJVtdrd/AIAFm/OIwlVACF 

Cbmjyxqliv/WYxNdJFL+IsHMX2Ury9TT2LMaDXxez6LRPMxJxRZSFhuyoYAqDYKT 

NI1LSODDRZ1WYlCOkPXlrSfzyig= 

=IN1g 

-----END PGP MESSAGE----- 

#####################以上爲輸出############################## 

這裏,我們可以看出,加密之後生成mygpgtest.asc文件,其中的內容已經經過加密了。 


3,公鑰解密過程 

1)使用如下命令進行解密: 

[root@lv-k gpg_test]# gpg -o mydecrypt --decrypt mygpgtest.asc 

#####################以下爲輸出############################## 

您需要輸入密碼,才能解開這個用戶的私鑰:“quietheart (test) <[email protected]>” 

2048 位的 ELG-E 密鑰,鑰匙號 2BBE2C91,建立於 2011-06-14 (主鑰匙號 DDBA2DEA) 


請輸入密碼:<=====輸入密碼 

您需要輸入密碼,才能解開這個用戶的私鑰:“quietheart (test) <[email protected]>” 

2048 位的 ELG-E 密鑰,鑰匙號 2BBE2C91,建立於 2011-06-14 (主鑰匙號 DDBA2DEA) 


gpg: 由 2048 位的 ELG-E 密鑰加密,鑰匙號爲 2BBE2C91、生成於 2011-06-14 

      “quietheart (test) <[email protected]>” 

#####################以上爲輸出############################## 

這裏,使用-o指定輸出文件,使用--decrypt指定待解密文件。我們可以看出,解密的時候,我們需要輸入密碼,才能解密成功,而密碼就是之前我們創建鑰匙對時候輸入的那個密碼。注意,這裏因爲生成密鑰,加密,解密都在一個機器上進行,所以可以成功解密,如果把加密之後的文件拿到別的機器上面,就無法解密了,如果想要在其它機器上面解密,我們需要把本地私鑰導出,發送給待解密的機器,然後在解密的機器上把剛剛導出的私鑰導入,就行了.後面會說到如何解密。如果想要別人和你使用這個加密的方法通信,需要把你的公鑰導出,發給別人,然後他們把這個公鑰導入,在使用前面加密的方法用這個公鑰加密數據並且發送給你,你再用你自己的私鑰解密,得到解密後的原始數據,這也是公鑰加密通信使用的常用方法。後面會詳細講述如何導出本地的公鑰和私鑰,以及如何在其它機器上面導入之前導出的密鑰。 


2)查看解密生成的文件 

[root@lv-k gpg_test]# ls 

mydecrypt  mygpgtest  mygpgtest.asc 

[root@lv-k gpg_test]# cat mydecrypt 

hello! 

welcome come to here 

today is 2011-06-14 

[root@lv-k gpg_test]# 


*導出(備份)公鑰: 

[root@lv-k gpg_test]# gpg -o mypubkey --export DDBA2DEA 

這裏使用格式“ gpg -o keyfilename --export KeyID”,使用-o指定生成的導出文件名稱,使用--export指定想要導出的密鑰ID, 如果沒有KeyID則是備份所有的公鑰,如果加上-a的參數則輸出文本格式的信息,否則輸出的是二進制格式信息。導出的公鑰,可以發佈,其它人只要導入你發佈的公鑰,就能用這個公鑰加密數據並且發送給你,你再用你自己的私鑰解密,得到解密後的原始數據,這也是公鑰加密通信使用的常用方法。 


*以文本方式導出公鑰: 

[root@lv-k gpg_test]# gpg -a -o mypubkeyascii --export DDBA2DEA 

導出的文件mypubkeyascii可以查看其內容,這裏內容如下: 

mypubkeyascii 

-----BEGIN PGP PUBLIC KEY BLOCK----- 

Version: GnuPG v1.4.5 (GNU/Linux) 


mQGiBE320yYRBACUvTPS5Jxv2xamVudHL//PBhJESyUzHQcGtb/CPzyAkOaNVQ7U 

V0DEjd+m61SAv7wwWItn9D3fOjZ09EdGY/9mHeVEOGLPdB7Seo28UyRtr6vHCrrl 

1qHBS6I6jQ/iATDg+07O9hgDp5eCebI4aNyRGeRARx0t5vKguIF+FEzmIwCghWM8 

toTSnP/bC1VePRXEZ9Uw+OkD/0cYIH2AZIKdbtjQ9J6F7AtgiPqRnjiTL7mOj6Xa 

ncjThX9XGH5DUMoqR6Gaq9/eDtlefMwHCweiqdm1TNnvU/b7qDpw1TjxVLkHHVZk 

8F4f8LsSkJNuLiqOwXwOJkuevQZ+Y3quFl3nsOtURSx5nuKkekp4toOWSe3fEFWd 

BQN5A/9Cxj55KWXzzYD8v+z0xiC3HvIWgUp0GTfcjSOfdhs9xtKe33LuGy7hoEt0 

TfQpTnz8Il1cbHHYvtmAaaGrwBnBxoYrLrH5WrHx1n34ZdOszYK5p/yKW+g+0eLt 

dv/f4uXEhfPInOk21X5PRGFcyNo3fMVGIHo1S8oiEX4fuEvwWrQqcXVpZXRoZWFy 

dCAodGVzdCkgPHF1aWV0X2hlYXJ0MDAwQDEyNi5jb20+iGAEExECACAFAk320yYC 

GwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRDbssCl3bot6o2bAJ918FqgoPMs 

4eIQOWBDVs5sS9hSbgCfTbOggNKPJtCPJq4zr/jaPctE7Qi5Ag0ETfbTLBAIAKUn 

cibGAlBwN5nW2NCN52oXWAsIXTDnUP7FmKi8K6B2PO7Bex2e95f44iOyBtLo73KF 

vH64Wbl7wGQ0IOnn/AQbivoa9oaBi4+2mf9PbGMvo2Nrii8xcvBfvrh8Q7XsRoOH 

obKv3inOGvxb0fkdUn1WkyYGtWCIl5aK8b1jUACuB6Sbdxtkeg3DrQp3BZjxgkVa 

etgPnj70AtJfTFnn5WSIkBGJq2pbs7E9wNQC7NvIe62DHJj1nsPJg/d9ZdFWnQiW 

HO6ik3bjRBLR4Iy82cjVOI2JmiaKVlPktphZ9id5F/a3BlcaOF5wSovE4ssHdZGN 

cvk4QPLr0X9G43ZBTmcAAwUH/07bUjqWu61uIq5XryRK99pTNLlwd1AdsB/HTgFp 

UJxSZ7MRbtozvdBPVKFehAzZ13YSjiES0f1L3oGBsEeEhCPyHY+N80R+zuLMeZTx 

6kFNLlm/PEFNrnFpqGPEJZ/1HRyt+hTsfFCFM4nYzhul7s10XKGiHHN1wUMc/ixt 

+tmk/dD6IA/QnhI1WUMzF2XgJ3Ql4ZmLCSNV7CXPEt044J8ZnuTT+HwO4AX7bfSt 

PTpyi7LMD/BVfOikczvf38Bz/IUnXi8x1pjBglZBE7jvkqc+nqe7BYQ/ga27c374 

zQDIAmAXcZ0TR35T+ZiyavQHKiRSuAG0q3T2oO74yvb8AgmISQQYEQIACQUCTfbT 

LAIbDAAKCRDbssCl3bot6uJ8AJ4h8ShsY6DLjmJjitl+8iHnh5tZQACeOqHsQXjr 

dei6gV8vMB87xwbWe5E= 

=ynen 

-----END PGP PUBLIC KEY BLOCK----- 

一般,許多地方網上通過這個文本方式發佈公鑰。 


*導出(備份)私鑰: 

[root@lv-k gpg_test]# gpg -o mysubkey --export-secret-keys 2BBE2C91 

如果沒KeyID則是備份所有的私鑰,-o表示輸出到文件mysubkey中,如果加上-a的參數則輸出文本格式的信息,否則輸出的是二進制格式信息。 


*導入私鑰: 

gpg --import mysubkey 

輸入之後,輸出如下: 

#####################以下爲輸出############################## 

gpg: 密鑰 DDBA2DEA:私鑰已導入 

gpg: /home/lv-k/.gnupg/trustdb.gpg:建立了信任度數據庫 

gpg: 密鑰 DDBA2DEA:公鑰“quietheart (test) <[email protected]>”已導入 

gpg: 合計被處理的數量:1 

gpg:           已導入:1 

gpg:       讀取的私鑰:1 

gpg:       導入的私鑰:1 

#####################以上爲輸出############################## 

這裏,如果導入公鑰命令是一樣的,不過指定的文件應該是"mypubkey"了。這個命令是另外一臺機器上運行的,導入私鑰之後那個機器就可以使用這個私鑰解密數據了。一般來說我們都是發佈公鑰讓人導入,而不是導入私鑰匙。 

實踐發現, 

*導入私鑰之後,另外一臺機器直接可以用對應的公鑰加密,而不用導入公鑰;這時候另外的那個機器也可以導出公鑰,不過有一行內容和原始機器公共鑰匙內容不一樣,但是用這個公鑰加密的數據也可以用原始的機器解密出來的。 

*導入公鑰之後,另外一臺主機無法導出私鑰,可以導出公鑰,導出內容和原來一樣。使用公鑰加密之後,無法解密(因爲沒有私鑰)。 

無論導入的是公鑰還是私鑰,導入之後可以通過gpg --list-keys來查看導入的結果,而且從結果可以看到沒有導入的那個配對(或者私鑰或者公鑰)的KeyID。 

**

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章