天天看點

Linux如何使用GPG(GNU Privacy Guard)對資訊/檔案進行加密和解密

PGP與GPG的比較

PGP麼,簡單的說,是一款以利用公鑰和密鑰技術的加密和身份驗證軟體。

而GPG呢,就是開源的PGP。

公鑰和密鑰

公鑰和密鑰,是現在密碼學的一個發明。以我們生活中的例子來說,公鑰相當于你的銀行帳号,私鑰相當于你的銀行存折和銀行卡。

公鑰,也就是銀行帳号,是公開的,讓大家都知道,這樣可以讓别人向你彙錢。

而私鑰這個存折呢,是要小心的藏好的,絕對不能滿世界亂丢,因為憑它就可以去銀行取你的錢呢。

在非對稱加密體系中,私鑰是由使用者保管,而公鑰是對外公開的。使用者在生成密鑰對後,需要把其中的公鑰導出到一個檔案中,然後将其分發給其它使用者。 

GPG即GNU Privacy Guard,它是加密工具PGP(Pretty Good Privacy )的非商業化版本,用于對Email、檔案及其他資料的收發進行加密與驗證,確定通信資料的可靠性和真實性。

GPG作為一個開源并且免費的加密和數字簽名軟體已經存在多年。它不但可以為企業、個人之間的重要資訊提供加密保護,還可以為出版的軟體、核心等電子産品進行數字簽名,防止産品被篡改,最大程度地保障資訊安全。

加密和數字簽名作為保護資訊機密性、完整性和不可抵賴性的重要手段在各種資訊通信場合得到廣泛的應用。目前,已有不少商業加密和數字簽名産品,比如商業軟體PGP(Pretty Good Privacy)。

另外,在開放源代碼庫中也有一些免費的加密和數字簽名軟體,其中最被認可的是GPG(GNU Privacy Guard)。GPG是一個完全免費、源代碼公開,并且與PGP完全相容的軟體産品。今天,GPG已經擁有衆多的企業和個人使用者。

在我國,由于資訊安全及隐私保護意識還比較薄弱,PGP或GPG在商業和個人使用者中的使用并不普遍。随着資訊安全及隐私帶來的問題甚至訴訟的增加,更多企業和個人開始把眼光投向安全問題的解決。

但是,由于非專業使用者對簽名和加密等概念的畏難情緒,GPG的應用還多局限于IT技術人員。本文将對Linux環境下如何應用GPG進行講解,為企業和個人使用者應用GPG提供幫助。

建立GPG環境

GPG軟體作為用于加密和數字簽名的開放源碼工具,許多Linux發行版本都自帶了該軟體。在預設安裝的情況下,gpg會作為一個基本指令事先安裝好。

如果選用的Linux發行版預設沒有安裝GPG,可以通過tar包或RPM包進行安裝,可從http://www.gnupg.org/download/下載下傳安裝包。安裝過程比較簡單,這裡省略了。

判斷是否安裝有GPG的方法也很簡單。直接在指令行下輸入"gpg -h"指令,如果系統已經安裝有GPG,就會顯示關于GPG用法的資訊。

确定Linux系統中已經安裝了GPG後,就可以開始下面加密和簽名的工作了。

生成密鑰

使用者應用GPG,首先要有一對自己的密鑰。是以,第一步就是産生一對密鑰。gpg指令通過大量參數提供所需要的幾乎所有操作。其中,參數"-gen-key"就是用來産生一對密鑰的。在安裝了GPG的Linux系統上可以運作以下指令:

#gpg --gen-key

如果想對産生密鑰的操作進行一些個性化設定,還可以加上其它參數。比如,要指定生成密鑰存放的位置,可以運作以下指令:

#gpg --gen-key --homedir /mygnupg

指令開始運作後,首先,會看到版本和路徑資訊如下:

gpg (GnuPG) 1.2.1; Copyright (C) 2002 Free Software Foundation, Inc.This program comes with ABSOLUTELY NO WARRANTY.This is free software, and you are welcome to redistribute itunder certain conditions. See the file COPYING for details.gpg: /home/terry/.gnupg: directory createdgpg: new configuration file `/home/terry/.gnupg/gpg.conf' createdgpg: keyblock resource `/home/terry/.gnupg/secring.gpg': file open errorgpg: keyring `/home/terry/.gnupg/pubring.gpg' created

随後需要回答一系列問題,以幫助産生一對密鑰。首先遇到的問題是要求選擇密鑰使用的算法:

Please select what kind of key you want:(1) DSA and ElGamal (default)(2) DSA (sign only)(5) RSA (sign only)Your selection? 1

其中,DSA是數字簽名算法,RSA和ElGamal是兩種不同原理的非對稱密鑰算法。通常可以選擇"1",這樣生成的密鑰可以同時用作簽名和加密兩種用途。

接着,會要求選擇密鑰的長度:

DSA keypair will have 1024 bits.About to generate a new ELG-E keypair.minimum keysize is  768 bitsdefault keysize is 1024 bitshighest suggested keysize is 2048 bitsWhat keysize do you want? (1024) 1024Requested keysize is 1024bits

這裡的密鑰長度有768、1024和2048位三種。顯然,密鑰越長越安全,但太長又會影響使用的速度。是以,可以根據不同的需要選擇适合的長度。一般我們選擇1024位密鑰。

另外,還需要設定密鑰過期的時間:

Please specify how long the key should be valid.

         0 = key does not expire

      <n>  = key expires in n days

      <n>w = key expires in n weeks

      <n>m = key expires in n months

      <n>y = key expires in n years

Key is valid for? (0) 1y

Key expires at Tue 16 Mar 2010 01:48:07 PM CST

Is this correct? (y/N) y

原則上,密鑰使用的頻率越高,密鑰有效的時間越長,被攻擊的可能性就越大。是以,要根據應用的實際情況綜合考慮,确定一個适當的時間長度。需要注意的是,密鑰要定期更換,建議絕對不要永遠使用同一對密鑰。

最後,需要輸入一些個人資訊,包括真實姓名、電子郵件位址等,用來識别密鑰,最好是如實填寫。比如:

Real name: Jonny Xu

Email address: 

Comment: for test                       

You selected this USER-ID:

       "Jonny Xu (for test) <>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o

然後,必須輸入一個密碼。密碼用來保護密鑰,沒有這個密碼,任何人都不能看到密鑰本身的内容。密碼是在密鑰檔案洩露後惟一的保密措施,它的最大敵人是暴力破解和字典攻擊。是以,一定要選擇一個強壯的密碼,來有效地對抗這些攻擊。

密碼确定以後,系統開始運算:

We need to generate a lot of random bytes. It is a good idea to perform some other action (type on the keyboard, move the mouse, utilize the disks)during the prime generation; this gives the random number generator a better chance to gain enough entropy...+++++.+++++.+++++.+++++..++++++++++.++++++++++++++

這時需要随便地敲擊鍵盤或是移動滑鼠,以産生一些随機數,協助密鑰的順利生成。注意,如果沒有以上動作,很可能最終不能産生密鑰。

系統運算完成後,會出現類似以下的資訊:

gpg: /home/jonny/.gnupg/trustdb.gpg: trustdb createdpublic and secret key created and signed.key marked as ultimately trusted.pub  1024D/880C18D5 2009-03-16 Jonny Xu (for test) <>

        Key fingerprint = 6DE2 21AB C695 2221 402E  1498 15E4 2B96 880C 18D5

sub  1024g/133B44E7 2009-03-16

以上資訊表示已經成功地為"Jonny Xu"生成并簽名了一對密鑰,密鑰過期時間為"2010-03-16"。在生成密鑰的同時,預設使用者目錄的.gnupg目錄中也存放了與該使用者相關的GPG配置及密鑰存儲檔案。這些檔案控制了使用者的GPG環境,使用者不能直接修改這些檔案,所有改動都将通過"gpg"指令實作。

檢視密鑰

密匙生成後,可以随時用以下指令檢視。

檢視所有密鑰:

#gpg --list-key

檢視所有公鑰:

gpg --list-public-key

檢視所有私鑰:

gpg --list-secret-key

列出所有簽名:

gpg --list-sig

導出公鑰

導出公鑰的方法很簡單,通過gpg指令的"-export"參數就可完成。為了使導出檔案是ASCⅡ編碼的,還需要加上參數"-a"。比如,導出Jonny Xu ASCⅡ編碼的公鑰檔案,可以使用以下指令:

#gpg --export -a  > jonny.asc

該指令最終生成ASCⅡ編碼的公鑰檔案:jonny.asc

導出密鑰

#gpg --export-secret-key -a  > jonny.gpg

分發公鑰

這個包含公鑰資訊的檔案需要對外分發,可以通過各種方式将jonny.acs檔案分發給所有與使用者有資訊通信需求的人。 

最簡單的分發方式是,将該檔案放到網際網路上供人下載下傳。這種方式需要注意的問題是,所釋出公鑰檔案的網站一定要是一個可以信賴的站點。實際應用中,類似的做法很普遍。

比如,Red Hat的公鑰就是在它的官方網站上釋出的,任何人都可以下載下傳獲得,并用來驗證Red Hat所釋出軟體的簽名的正确性。

導入公鑰

1.導入

比如,jonny收到朋友john的公鑰檔案john.gpg,可以使用以下指令導入檔案:

#gpg --import john.gpg  

2.核對"指紋"

公鑰是可以僞造的。James可以僞造一個john的公鑰,然後想辦法讓jonny得到。如果jonny對收到的公鑰不加驗證,那麼他發給john的加密郵件就可能被James解密。GPG的架構中并沒有一個PKI這樣的證書管理系統,GPG的公鑰信任是通過"Truth Web"實作的。

生成jonny公鑰的"指紋":

#gpg --fingerprint .orgpub  1024D/7234E374 2009-03-16 jonnyYu (for test)      Key fingerprint = A58F D71A 28BA  499D 805B  588E 82FB CD0F 7234 E374sub  1024g/4907EA0A 2009-03-16  

這個"指紋"是惟一的。可以通過與對方核對"指紋"是否一緻,來确定這個公鑰是否可信和合法。

3.簽名

在成功導入,并确定這個公鑰是可以相任之後,要立即對這個公鑰進行簽名。這樣,就可以驗證來自對方郵件的真實性了。

對公鑰進行簽名可以使用如下指令:

#gpg --sign-key 或者#gpg --edit-key name#command > sign  

檢查對方郵件,比如john的簽名:

#gpg --check-sigs  

現在,有了john簽名的公鑰,通過這個公鑰就可以和john進行非對稱加密通信了。

應用GPG

非對稱的密鑰可以用來加密和做數字簽名。當使用者關心資訊保密性時,使用加密功能;當使用者關注資訊完整性及不可抵賴性時,使用數字簽名功能;當使用者需要同時關注資訊的機密性、完整性及不可抵賴性時,可以将加密和數學簽名混合使用。

簡單了解這些密碼學概念後,就可以開始真正的應用實踐了。

五、使用GPG收發資料

下面我們開始讨論如何使用GPG收發資料,這是日複一日的工作,一定要了解并熟練。在本文開始的PGP概述部分,我們提到了資料交換的兩種方式,現在我們對其分類概念化: 

●資料簽名傳輸(Signed data):發送者使用私匙對資料加密,接收者使用公匙對資料解密。 

●資料加密傳輸(Encrypted data):發送者使用公匙對資料加密,接收者使用私匙對資料解密。 

以下分别詳細介紹。 

1、資料簽名傳輸 

發送者使用私匙對資料進行簽名,接收者擁有發送者的公匙,對之信任并使用它驗證接收資料的完整性。對資料進行簽名的最簡單的方法是使用clearsign指令,這将使GPG建立一個易讀的簽名,很适于發送Email。

具體指令及執行情況如下: 

$ gpg --clearsign mymessage.txt

You need a passphrase to unlock the secret key foruser: Ima User (I'm just ME) 1024-bit DSA key, ID D9BAC463, created 2001-01-15Enter passphrase:$ 

輸入passphrase後,就将生成一個擴充名為.asc的新檔案,這裡就是mymessage.txt.asc。這個檔案包含了mymessage.txt檔案的原始内容以及一個如下所示的簽名資訊: 

-----BEGIN PGP SIGNATURE-----

Version: GnuPG v1.0.1 (GNU/Linux)

Comment: For info see http://www.gnupg.org

iD8DBQE6YouhU87DFNm6xGMRAiwqAJ4mnviKz5wA9HFhCW9PG6zl7A2LPACgk0SB

n+yWiCt4SCTVkSSgezGKIUk=

=WnX/

-----END PGP SIGNATURE----- 

當接收者收到包含上述簽名的資訊或檔案時,他可以使用發送者的公匙來驗證資訊的完整性,具體指令及執行情況如下: 

$ gpg --verify message.txt.asc

gpg: Signature made Sat Jan 13 22:33:21 2001 MST using DSA key D9BAC463

gpg: Good signature from Ima User (I'm just ME) $ 

2、資料加密傳輸 

第2種傳輸方式的目的是為了隻讓個别人看到發送資訊,所謂“信”有獨鐘。發送者使用其公匙對檔案或資料進行加密,接收者使用發送者的私匙對接收資料進行解密。 

加密指令包含兩個部分,一部分指定接收者的Email,另一部分指定要加密的檔案。具體指令如下: 

$ gpg -r  -a --encrypt message.txt 

執行後的輸出結果為檔案message.txt.asc,其内容類似如下: 

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

hQEOA/Yj7lT9u0d9EAQAhE+KaGfMzvRfCdrfW2EYzuu+YeaKdoJksHB16CO7RsZC

DkllV/uma/rMj5PiDzFoV8PGjqdq9M+n9YXOVnuG3XITWhuvfFqm1KWxK9e0UDoS

7Tb2cm+k8UK18HBI/EaNrV+a3A5YQr6nVY0OCXheohg3+9ursFc8uOBQma64/VUD

/io0EQiIxEmERy2UsN7e+OB1/w4FUcRt7FFWCTVMGdUuQPY8UkeStH7u43NlPsf5

6uPPjaTxCOjjQoCf17XnfxqJPm9c0uyPDjljXYmp74XroT+lHvGcaKK56t0agGVo

i5nMflXoCIA2n/KDALzTjy7cIzLnUeYVU4NrBt7pV4TTyelxYB70mW94Wlr5BlLj

S+FYueR31i790QO+265iS4QPA+zxXIT5KCF8TT1gVPaZOJxmo0wRKuoOYrCd7LQD

Oz3exhCgeKKjfZRwJtqvl/QVamFJWSyhAiuTlA60IHyxIqAZlwLoYoXs9oOIs49g

HLYG6hSemJEW+fTX8xipOOfDXzHrJjUE897igeW62Mf6HLr4aNb1kwrlH7d7Xdr8

29+sckZlSRtBvL3/dSw5FcRCFYbS51AHstdywYvNu4rqSOljv5C6dXEw9Gre+wPS

5S7k0KoTLK4VOZJI2byBTZxgjQNr7ytpu1QMN2+10tpHx6MLkUFV/BJZbAtJ3C0v

auS4xskoSlZgbuX/8Veqhx4GC0lSRLqn14M9CP/tzZN0dIZSTbM2aq58zk0wZZVB

Tmb06HdYvkLrcLkmyNBt3/PUlDIIdeXNCkqN5bjGD/elTtkaMmHN9OIIDHWA9olR

tcXoLJPF4kgg1q6y6pgy2sklYQhI8A4q8VoQNJDzF/SbKvlnGji5HyF6rvKDCF0m

/l0heQEMn4AyFbJ7LZt2zh4i3jSwyV4Ff+tWJD09xaNziKi791FaSBVMxsPhT4SD

w+R75JR/FV0IRpMsy8kdJw/+kejQwCmRqDbm3EHOESCOouxsL8JB39vX+1h32p1b

EdVyQIHZA+TomHsp/y3i+EX52MC8+8XmCukHfT0dCVcnfk2H0hKvFueBkW8Y2JGd

FJZb+CDX33Aapr6FW9CIXvI+1NFOz+cIWVZIYYECnUZe4l3Jikjw3rY2To4E/WUy

MN+ZKsMb6xlhMSoRa9qHWY+S/pp9D8qiqweOLg4cnCjZBZWVOMf4dMcDWNjsW3mX

GgYVmPf52WxvVFtp1yjNbHBu+is8/ZR1P04efD+kOg1WtwpfRdHKQ1o1fn/OxYX1

oP7PVR5BK05HaQYmI0Vlwkcv59RyeYqqOQOiEfL0hEWdGy1gdj0R0eHYuZLnBLfb

SHJ2OtRpcqHuXB27EU3C4OR/N++7ExhG/MNB8WPFb82cbIP8xDF9q+3b73b7myTn

JpAYj4p2ocv9Zf1DH9HHaT7bYD37hvjLlNXe07kYOlMWB9+48meO/o+Yjn5oEj60

wipRdCiP4TUoAwC9EDFED64qLXST9MBycLrc5DwiMYzfdyauiHU3MNhUfErXVaRJ

/5ljtJUGHA/P/ouqbSCleHQ=

=2Sgq

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

注意:通過以上方式被加密的資訊也可以被簽名,方法是在上述指令中再加上一個-s參數。 

要對上述加密資料進行解密,接收者可以使用“--decrypt”指令,并指定輸出重定向的位置。具體指令及執行情況如下: 

$ gpg --decrypt message.txt.asc > message.txt

You need a passphrase to unlock the secret key for

user: "Jonny Xu (for test) <>"

1024-bit ELG-E key, ID 133B44E7, created 2009-03-16 (main key ID 880C18D5)

GPG使用的是非對稱的密鑰體系,使用者擁有一對密鑰,包括一個公鑰和一個私鑰。公鑰對外公布,私鑰則由自己儲存。使用公鑰加密的資料可以用私鑰解密,同樣,使用私鑰加密的資料可以用公鑰解密。作為使用者,也會收到别人的GPG公鑰,它們可能來自網站、電子郵件、FTP和目錄服務等,隻要信任其來源,就可以将其導入自己的GPG環境,之後才可以與相應的人員進行基于GPG的各種應用。導入公鑰的過程可以分為以下三步:在非對稱加密體系中,私鑰是由使用者保管,而公鑰是對外公開的。使用者在生成密鑰對後,需要把其中的公鑰導出到一個檔案中,然後将其分發給其它使用者。

繼續閱讀