alancxx

          ------簡單就是美

          GPG(pgp)加解密詳述

          一、介紹

          我們都知道,互聯網是不安全的,但其上所使用的大部分應用,如Web、Email等一般都只提供明文傳輸方式(用https、smtps等例外)。所以,當我們需要傳輸重要文件時,應該對當中的信息加密。非對稱密碼系統是其中一種常見的加密手段。而在基于PGP方式加密的中文介紹少之又少,所以萌生了寫一個完整教程的想法,當然本文部分資料是我搜遍網絡整理出來的,并不能保證百分之百的原創

          GnuPG 是一個用來進行非對稱加密(PGP)的免費軟件,簡稱GPG(是不是有的童鞋已經被PGP和GPG給搞昏了)。先說說什么是非對稱加密。傳統的加密手段往往是使用同一個密碼進行加密和解密。例如你加密時用的密碼是“abc”, 則解密時也要使用“abc”才行。這樣就存在一個問題,你不能夠把一段加密信息發送給你的朋友。試想,如果采用這種加密方式把信息發送給你的朋友時,你的 朋友必須要知道你的密碼才能把你的信息解密出來。但你如何保證你的朋友是絕對可靠的呢?也就是說,如果你的朋友把你的密碼告訴了別人,你的密碼就不再安全 了。
          非對稱加密采用的是另一種思想。它會給你產生兩個密鑰,一個稱為“公鑰”,另一個稱為“私鑰”。公鑰是可以公開的,你盡管把它傳給別 人;私鑰你一定要保管好不讓其他任何人知道。當某人得到你的公鑰后,他就可以給你發送加密信息了。具體來說,他把他要發給你的信息用你的公鑰加密后發給 你,加密的信息只能用你的私鑰去解密。這樣,因為世界上除了你以外沒有別人知道你的私鑰,所以即使別人看到發送給你的加密信息他也無法解密,甚至連發送者 本人也不行。因為他不知道你的私鑰。簡單說來,就是用公鑰去加密;用對應的私鑰去解密。想給誰發送加密信息,首先要得到他的公鑰。
          支持非 對稱加密的軟件有多種,最著名的可能是美國的PGP了,不過它是個商業軟件,價格不便宜。對于加密軟件,我反對使用破解軟件,因為如果信息需要加密的話, 肯定是非常重要的信息,破解軟件無法保證加密的安全可靠。因此我建議使用免費開源的GnuPG軟件進行信息的加密和解密。

          二、使用:

          1.生成密鑰對
          要使用GnuPG加密,首先需要創建密鑰對,執行:

          # 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.

           

          請選擇您要使用的密鑰種類:
          (1) DSA 和 ElGamal (默認)
          (2) DSA (僅用于簽名)
          (5) RSA (僅用于簽名)
          您的選擇? 1  ←只有1可以用于加密,其他種類只能用于簽名
          DSA 密鑰對會有 1024 位。
          ELG-E 密鑰長度應在 1024 位與 4096 位之間。
          您想要用多大的密鑰尺寸?(2048)  ←選擇密碼的位數,位數越大,越安全,但速度越慢
          您所要求的密鑰尺寸是 2048 位
          請設定這把密鑰的有效期限。
          0 = 密鑰永不過期
          <n>  = 密鑰在 n 天后過期
          <n>w = 密鑰在 n 周后過期
          <n>m = 密鑰在 n 月后過期
          <n>y = 密鑰在 n 年后過期
          密鑰的有效期限是?(0) 0  ←根據實際情況選擇密鑰期限
          密鑰永遠不會過期
          以上正確嗎?(y/n)y  ←確認

          您需要一個用戶標識來辨識您的密鑰;本軟件會用真實姓名、注釋和電子郵件地址組合
          成用戶標識,如下所示:
          “Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>”

          真實姓名:Hyphen Wang  ←請填入真實姓名,后面會用到
          電子郵件地址:gpgencrypt@linuxfly.org  ←郵件作為標記之一,不能重復
          注釋:Use for GPG Encrypt  ←僅是注釋而已
          您選定了這個用戶標識:
          “Hyphen Wang (Use for GPG Encrypt) <gpgencrypt@linuxfly.org>”

          更改姓名(N)、注釋(C)、電子郵件地址(E)或確定(O)/退出(Q)?O  ←輸入“O”確認
          您需要一個密碼來保護您的私鑰。  ←輸入兩次用于訪問私鑰的密碼,緊記,不能公開或丟失

          我們需要生成大量的隨機字節。這個時候您可以多做些瑣事(像是敲打鍵盤、移動
          鼠標、讀寫硬盤之類的),這會讓隨機數字發生器有更好的機會獲得足夠的熵數。
          ++++++++++…++++++++++..++++++++

          隨機字節不夠多。請再做一些其他的瑣事,以使操作系統能搜集到更多的熵數!
          (還需要274字節)  ←運行一些的程序,以便在內存中獲得更多隨機數
          我們需要生成大量的隨機字節。這個時候您可以多做些瑣事(像是敲打鍵盤、移動
          鼠標、讀寫硬盤之類的),這會讓隨機數字發生器有更好的機會獲得足夠的熵數。
          +++++++++++++++++++++++++.+++++.+++++.++++++++++.+++<+++++..+++++^^^
          gpg: 密鑰 A3942296 被標記為絕對信任  ←密鑰ID
          公鑰和私鑰已經生成并經簽名。

          gpg: 正在檢查信任度數據庫
          gpg: 需要 3 份勉強信任和 1 份完全信任,PGP 信任模型
          gpg: 深度:0 有效性:  2 已簽名:  0 信任度:0-,0q,0n,0m,0f,2u
          pub   1024D/A3942296 2008-12-19
          密鑰指紋 = E95E 1F77 6C4E 33BD 740C  19AB EEF9 A67E A394 2296
          uid                  Hyphen Wang (Use for GPG Encrypt) <gpgencrypt@linuxfly.org>
          sub   2048g/911E677B 2008-12-19

          2.密鑰的回收
          當您的密鑰對生成之后,您應該立即做一個公鑰回收證書,如果您忘記了您的私鑰的口令或者您的私鑰丟失或者被盜竊,您可以發布這個證書來聲明以前的公鑰不再有效。生成回收證書的選項是”–gen-revoke”。

          gpg –output revoke.asc –gen-revoke mykeyID

          其中mykey 參數是可以表示的密鑰標識,產生的回收證書放在revoke.asc文件里,一旦回收證書被發放,以前的證書就不能再被其他用戶訪問,因此以前的公鑰也就失效了。

          PS:如果一旦決定撤銷已經上傳的公鑰,就需要將該密鑰的回收證書上傳至密鑰服務器完成回收工作。

          gpg –keyserver Server Address –send-keys mykeyID

          3.密鑰的上傳

          當上述工作完成以后,為了讓盡可能多的人獲取您的公鑰,您可以將公鑰郵寄出去,或者貼在自己的個人主頁上,當然還有一種更好的方法就是上傳到全球性的密鑰服務器,其他用戶可以通過您提供的公鑰ID來搜索并獲得您的公鑰。

          通過如下命令可以將你的key發布到服務器上:

          gpg –keyserver Server Address –send-keys mykeyID
          PS:當然您也可以定義默認的服務器key server,一般安裝好后的默認key server都是subkeys.pgp.net。你也可以通過修改.gnupg/gpg.conf中的keyserver信息來改變你的key server。
          4.密鑰的導出/導入

          我們通常需要導出公鑰和私鑰保存起來,當然公鑰是可以滿世界的潑灑,但是私鑰請務必保存好,否則你的密鑰對將會永久性的失去威力。
          • 公鑰的導出:

          gpg -o keyfilename –export mykeyID

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

          • 私鑰的導出:

          gpg -o keyfilename –export-secret-keys mykeyID

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

          • 密鑰的導入:

          gpg –import filename

          PS:用戶可以使用gpg –list-keys命令查看是否成功導入了密鑰。

          5.加密解密和數字簽名

          通過上述的密鑰生成以及公鑰分發后,加密和解密數據變得非常容易,用戶可以通過使用該功能來達到安全地在網絡上傳輸自己的隱密數據的目的。

          如果用戶patterson要給用戶liyang發送一個加密文件,則他可以使用liyang的公鑰加密這個文件,并且這個文件也只有liyang使用自己的密鑰才可以解密查看。下面給出加解密的步驟:

          • 用戶patterson使用liyang的公鑰加密文件test,使用下面的指令:

          # gpg -e test

          You did not specify a user ID. (you may use “-r”)

          Enter the user ID. End with an empty line: liyang

          Added 1024g/C50E455A 2006-01-02 “liyang (hello) < liyang@sina.com>”

          這樣,就可以將gpg.conf文件加密成test.gpg,一般用戶是無法閱讀的

          PS:當然你也可以直接指定使用哪個用戶的公鑰進行加密:

          gpg -e -r liyang test  (-r 表示指定用戶)

          還可以加上參數 -a 來輸出ASCII編碼的文件test.asc(test.gpg是二進制編碼的,不可用文本讀)

          gpg -ea -r liyang test

          • 用戶liyang 使用自己的私鑰來解密該文件,如下所示:

          # gpg -d test.gpg

          You need a passphrase to unlock the secret key for

          user: “liyang (hello) < liyang@sina.com>”

          1024-bit ELG-E key, ID C50E455A, created 2006-01-02 (main key ID 378D11AF)

          GnuPG提示用戶,需要輸入生成私鑰使用的密碼:

          Enter passphrase:

          gpg: encrypted with 1024-bit ELG-E key, ID C50E455A, created 2006-01-02

          “liyang (hello) < liyang@sina.com>”

          PS:無論加密解密,都可以加上-o參數來指定加密和解密后的輸出文件,例如

          #gpg -o doc.gpg -er name doc
          其中name是選擇誰的公鑰加密,即誰是文件的接收者。
          doc為要加密的文件,即原文件
          doc.gpg為命令執行后生成的加密的文件,這里要先指定好文件名

          • 對文件進行簽名

          1、數字簽名
          命令格式:
          #gpg -o doc.sig -s doc
          其中doc是原文件,doc.sig包含了原文件和簽名,是二進制的。這個命令會要求你輸入你的私鑰的密碼句。
          #gpg -o doc.sig -ser name doc
          既簽名又加密

          2、文本簽名
          #gpg -o doc.sig –clearsign doc
          這樣產生的doc.sig同樣包含原文件和簽名,其中簽名是文本的,而原文件不變。

          3、分離式簽名
          #gpg -o doc.sig -ab doc
          doc.sig僅包括簽名,分離式簽名的意思是原文件和簽名是分開的。
          b 表示分離式簽名detach-sign

          4、驗證簽名
          #gpg –verify doc.sig [doc]
          驗證之前必須導入文件作者的公鑰,對于分離式簽名,最后還要加上原文件,即后面的doc。

          • 密匙簽名和用戶信任(進階功能)

          盡管在理論上講,具備了公匙和私匙就可以實現安全的信息通訊,但是在實際應用中,還必須對公匙進行有效確認。因為,確實存在偽造公匙信息的可能。

          由此,在GPG中引入了一個復雜的信任系統,以幫助我們區分哪些密匙是真的,哪些密匙是假的。這個信任系統是基于密匙的,主要包括密匙簽名。

          當收到熟人的公匙并且GPG告知不存在任何實體可信信息附加于這個公匙后,首要的事情就是對這個密匙進行“指紋采樣”(fingerprint)。例如,我們對來自mike的公匙進行了導入操作,并且GPG告知我們不存在這個密匙的附加可信信息,這時候,我們首先要做的工作就是對這個新密匙進行“指紋采樣 ”,相關命令及執行情況如下:

          $ gpg –fingerprint mike@hairnet.orgpub 1024D/4F03BD39 2001-01-15 Mike Socks (I’m WIRED) Key fingerprint = B121 5431 8DE4 E3A8 4AA7 737D 20BE 0DB8 4F03 BD39sub 1024g/FDBB477D 2001-01-15$

          這樣,就從密匙數據中生成了其指紋信息,并且應該是唯一的。然后,我們打電話給mike,確認兩件事情。首先,他是否發送給我們了密匙;其次,他的公匙的指紋信息是什么。如果Mike確認了這兩件事情,我們就可以確信這個密匙是合法的。接下來,我們對密匙進行簽名操作,以表示這個密匙來自Mike而且我們對密匙的信任,相關命令及執行情況如下:

          $ gpg –sign-key mike@hairnet.orgpub 1024D/4F03BD39 created: 2001-01-15 expires: neversub 1024g/FDBB477D created: 2001-01-15 expires: never(1) Mike Socks (I’m WIRED) pub 1024D/4F03BD39 created: 2001-01-15 expires: neverFingerprint = B121 5431 8DE4 E3A8 4AA7 737D 20BE 0DB8 4F03 BD39Mike Socks (I’m WIRED) Are you really sure that you want to sign this keywith your key: Ima User (I’m just ME) Really sign? yYou need a passphrase to unlock the secret key foruser: Ima User (I’m just ME) 1024-bit DSA key, ID D9BAC463, created 2001-01-03Enter passphrase:$

          執行到此,使用我們的私匙完成了對Mike的公匙的簽名操作,任何持有我們的公匙的人都可以查證簽名確實屬于我們自己。這個附加到Mike的公匙上的簽名信息將隨它環游Internet世界,我們使用個人信譽,也就是我們自己的私匙,保證了那個密匙確實屬于Mike。這是一個多么感人的充滿誠信的故事啊 :-) 現實世界的人們是否應該從這嚴格的技術標準中反思些什么呢?

          還是回到這里。獲取附加于一個公匙上的簽名信息列表的命令是:

          gpg –check-sigs mike@hairnet.org

          簽名列表越長,密匙的可信度越大。其實,正是簽名系統本身提供了密匙查證功能。假設我們接收到一個簽名為Mike的密匙,通過Mike的公匙,我們驗證出簽名確實屬于Mike,那么我們就信任了這個密匙。推而廣之,我們就可以信任Mike簽名的任何密匙。

          為了更加穩妥,GPG還引入了另一個附加功能:可信級別(trust level)。使用它,我們可以為我們擁有的任何密匙的所有者指定可信級別。例如,即使我們知道Mike的公匙是可信的,但是事實上我們不能信任Mike在對其他密匙簽名時的判斷;我們會想,Mike也許只對少數密匙進行了簽名,但卻沒有好好地檢查一遍。

          設置可信級別的命令及執行情況如下:

          $ gpg –edit-key mike@hairnet.orgpub 1024D/4F03BD39 created: 2001-01-15 expires: never trust: -/fsub 1024g/FDBB477D created: 2001-01-15 expires: never(1) Mike Socks (I’m WIRED) Command> trust 1 = Don’t know 2 = I do NOT trust 3 = I trust marginally 4 = I trust fully s = please show me more information m = back to the main menuYour decision? 2Command> quit$

          在命令編輯環境中執行trust,然后選擇級別2(I do NOT trust),這樣我們割斷了任何信任鏈,使每個密匙都必須經過Mike的簽名。

          6.刪除密鑰

          從私鑰鑰匙環里刪除密鑰:

          # gpg –delete-secret-keys hyphenwang@redflag-linux.com
          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.

           

          sec  1024D/A3942296 2008-12-19 Hyphen Wang (Use for GPG Encrypt) <gpgencrypt@linuxfly.org>

          要從鑰匙環里刪除這把密鑰嗎?(y/N)y
          這是一把私鑰!――真的要刪除嗎?(y/N)y

          必須先刪除私鑰,然后才能刪除公鑰。
          從公鑰鑰匙環里刪除密鑰:

          # gpg –delete-keys hyphenwang@redflag-linux.com
          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.

           

          sec  1024D/A3942296 2008-12-19 Hyphen Wang (Use for GPG Encrypt) <gpgencrypt@linuxfly.org>

          要從鑰匙環里刪除這把密鑰嗎?(y/N)y

          三.對稱加密:

          當然GPG同樣具備普通的對稱加密功能,這時候就不需要密鑰,直接用密碼加密即可(注意,這里的密碼不一定是你私鑰的密碼,您大可以隨意設定)

          gpg -o doc.gpg -c doc

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

          四.GPG常用參數:

          語法:gpg [選項] [文件名]
          簽字、檢查、加密或解密
          默認的操作依輸入數據而定

          指令:

          -s, –sign [文件名]           生成一份簽字
          –clearsign [文件名]      生成一份明文簽字
          -b, –detach-sign             生成一份分離的簽字
          -e, –encrypt                 加密數據
          -c, –symmetric               僅使用對稱加密
          -d, –decrypt                 解密數據(默認)
          –verify                  驗證簽字
          –list-keys               列出密鑰
          –list-sigs               列出密鑰和簽字
          –check-sigs              列出并檢查密鑰簽字
          –fingerprint             列出密鑰和指紋
          -K, –list-secret-keys        列出私鑰
          –gen-key                 生成一副新的密鑰對
          –delete-keys             從公鑰鑰匙環里刪除密鑰
          –delete-secret-keys      從私鑰鑰匙環里刪除密鑰
          –sign-key                為某把密鑰添加簽字
          –lsign-key               為某把密鑰添加本地簽字
          –edit-key                編輯某把密鑰或為其添加簽字
          –gen-revoke              生成一份吊銷證書
          –export                  導出密鑰
          –send-keys               把密鑰導出到某個公鑰服務器上
          –recv-keys               從公鑰服務器上導入密鑰
          –search-keys             在公鑰服務器上搜尋密鑰
          –refresh-keys            從公鑰服務器更新所有的本地密鑰
          –import                  導入/合并密鑰
          –card-status             打印卡狀態
          –card-edit               更改卡上的數據
          –change-pin              更改卡的 PIN
          –update-trustdb          更新信任度數據庫
          –print-md 算法 [文件]    使用指定的散列算法打印報文散列值

          選項:

          -a, –armor                   輸出經 ASCII 封裝
          -r, –recipient 某甲          為收件者“某甲”加密
          -u, –local-user              使用這個用戶標識來簽字或解密
          -z N                          設定壓縮等級為 N (0 表示不壓縮)
          –textmode                使用標準的文本模式
          -o, –output                  指定輸出文件
          -v, –verbose                 詳細模式
          -n, –dry-run                 不做任何改變
          -i, –interactive             覆蓋前先詢問
          –openpgp                 行為嚴格遵循 OpenPGP 定義
          –pgp2                    生成與 PGP 2.x 兼容的報文

          (請參考在線說明以獲得所有命令和選項的完整清單)

          范例:

          -se -r Bob [文件名]          為 Bob 這個收件人簽字及加密
          –clearsign [文件名]         做出明文簽字
          –detach-sign [文件名]       做出分離式簽字
          –list-keys [某甲]           顯示密鑰
          –fingerprint [某甲]         顯示指紋

          ———————————————————————————–

          posted on 2011-04-23 22:55 蜂鳥 閱讀(770) 評論(0)  編輯  收藏 所屬分類: Security

          公告

           掌握了XML就掌握了未來!

          導航

          <2025年8月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          統計

          常用鏈接

          留言簿

          隨筆檔案(1)

          文章分類(17)

          文章檔案(17)

          搜索

          最新評論

          主站蜘蛛池模板: 隆安县| 林周县| 绥芬河市| 咸阳市| 阿拉善盟| 井陉县| 平江县| 资阳市| 基隆市| 厦门市| 平邑县| 阆中市| 惠安县| 固阳县| 内乡县| 唐河县| 绍兴市| 舒城县| 峡江县| 金华市| 金秀| 晴隆县| 临澧县| 鄂伦春自治旗| 平江县| 晋城| 河津市| 贵阳市| 滦南县| 麻江县| 陵川县| 兰溪市| 淮滨县| 綦江县| 绥中县| 武汉市| 饶平县| 灵石县| 五寨县| 秀山| 成安县|