PGP
???————密碼技術(shù)的完美組合
PGP簡介
?PGP是于1990年左右由菲利普.季默曼(Philip Zimmermann)個(gè)人編寫的密碼軟件疏叨,現(xiàn)在依然在世界上被廣泛使用。PGP這個(gè)名字是Pretty Good Privary(很好的隱私)的縮寫穿剖。
?PGP可以在Windows蚤蔓、Mac OS X、Linux等很多平臺(tái)上運(yùn)行糊余,版本包括商用版和免費(fèi)版秀又。此外還有一個(gè)GNU遵照OpenGPG(RFC4880)規(guī)范編寫的叫作GnuPG(GNU privacy Guard)的自由軟件。
?這里介紹的主要是根據(jù)PGP Command Line User's Guide 10.3 以及GnuPG2.1.4的內(nèi)容編寫的贬芥。在詳細(xì)功能以及所支持的算法方面吐辙,PGP和GunPG有所區(qū)別,而且不同的版本之間也會(huì)有所不同蘸劈,這里介紹統(tǒng)一PGP為準(zhǔn)昏苏。
關(guān)于PGP
?OpenPGP是對(duì)密文和數(shù)字簽名格式進(jìn)行定義的標(biāo)準(zhǔn)規(guī)格(RFC1991、RFC2440威沫、RFC4880贤惯、RFC5581、RFC6637)棒掠。
?1996年的RFC1991中對(duì)PGP的消息格式進(jìn)行了定義孵构。2007年的RFC4880中新增了對(duì)RSA和DSA的支持。2012年的RFC6637中新增了對(duì)橢圓曲線密碼(ECC)的支持烟很,并且還支持基于Curve P-256颈墅、P-384和P-521三種橢圓曲線的橢圓曲線DSA和橢圓曲線Diffie-Hellman密鑰交換。
?RFC6637中新增了用于比較密碼學(xué)強(qiáng)度的平衡的對(duì)照表雾袱。由這張表可知恤筛,例如當(dāng)我們選用256比特的橢圓曲線密碼算法時(shí),相應(yīng)低應(yīng)該選用256比特的散列散發(fā)以及密鑰長度為128比特的對(duì)稱密碼算法谜酒。
關(guān)于GNU Privacy Guard
?GNU Privacy Guard(GnuPG叹俏、GPG)是一款基于OpenPGP標(biāo)準(zhǔn)開發(fā)的密碼學(xué)軟件,支持加密僻族、數(shù)字簽名粘驰、密鑰個(gè)管理屡谐、S/MIME、ssh等多種功能蝌数。GnuPG是基于GNU GPL協(xié)議發(fā)布的一款自由軟件愕掏,因此任何人都可以自由的使用它。GnuPG本身是一款命令行攻擊顶伞,但它也經(jīng)常被集成到其他應(yīng)用軟件中饵撑。
?GnuPG 分為stable、modern和classic三個(gè)系列唆貌。
- GnuPG stable 的版本號(hào)為2.0.x滑潘,支持OpenPGP、S/MIME和ssh
- GnuPG modern 的版本號(hào)為2.1.x锨咙,在stable的基礎(chǔ)上增加了對(duì)橢圓曲線密碼的支持语卤。GnuPG modern是比較新的版本,今后將會(huì)逐漸取代現(xiàn)在的GnuPG stable版本酪刀。
- GnuPG classic 的版本號(hào)1.4.x粹舵,是比較舊的版本。
PGP的功能
- 對(duì)稱密碼
? PGP支持用對(duì)稱密碼進(jìn)行加密和解密骂倘。對(duì)稱密碼可以單獨(dú)使用眼滤,也可以和公鑰密碼組合成混合密碼系統(tǒng)。
?可以使用的對(duì)稱密碼算法包括AES历涝、IDEA诅需、CAST、三重DES睬关、Blowfish诱担、Twofish、Camellia等电爹。 - 公鑰密碼
? PGP支持生成公鑰密碼的密鑰對(duì)蔫仙,以及用公鑰密碼進(jìn)行加密和解密。實(shí)際上并不是使用公鑰密碼直接對(duì)明文進(jìn)行加密丐箩,而是使用混合密碼系統(tǒng)來進(jìn)行加密操作摇邦。
?可以使用的公鑰密碼算法包括RSA和ElGamal等。 - 數(shù)字簽名
?PGP支持?jǐn)?shù)字簽名的生成和驗(yàn)證屎勘,也可以將數(shù)字簽名附加到文件中施籍,或者從文件中分離出數(shù)字簽名。
?可以使用的數(shù)字簽名算法包括RSA概漱、DSA丑慎、ECDSA(橢圓曲線DSA)、EdDSA(愛德華茲曲線DSA)等。 - 單向散列函數(shù)
?PGP可以使用單向散列函數(shù)計(jì)算和顯示消息的散列值竿裂。
?可以使用的單向散列函數(shù)算法包括SHA-1玉吁、SHA-224、SHA-256腻异、SHA-384进副、SHA-512和RIPEMD-16等。MD5依然可以使用悔常,但并不推薦影斑。 - 證書
?PGP可以生成OpenGPG中規(guī)格規(guī)定格式的證書,以及與X.509規(guī)范兼容的證書机打。此外矫户,還可以頒發(fā)公鑰的作廢證明(revocation certificate),并可以使用CRL和OSCP對(duì)證書進(jìn)行校驗(yàn)残邀。 - 壓縮
?PGP支持?jǐn)?shù)據(jù)的壓縮和解壓縮吏垮,壓縮采用ZIP、ZLIB罐旗、BZIPZ等格式。 - 文本數(shù)據(jù)
?PGP可以將二進(jìn)制和文本數(shù)據(jù)相互轉(zhuǎn)換唯蝶。例如九秀,當(dāng)不得不使用某些無法處理二進(jìn)制數(shù)的軟件進(jìn)行通信時(shí),可以將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成文本數(shù)據(jù)(ASCII radix-64格式)粘我,這些軟件就能夠處理了鼓蜒。
?radix-64格式是在郵件等場合中經(jīng)常使用的base64編碼基礎(chǔ)上照瘾,增加了校驗(yàn)數(shù)據(jù)錯(cuò)誤的校驗(yàn)和的版本筏养。base64編碼是一種可以將任何二級(jí)制數(shù)據(jù)都用AZ、az锣杂、0~9匙姜、+畅厢、/共64個(gè)字符再加上=(用于末尾填充)來表示格式。 - 大文件的拆分和拼合
?在文件過大無法通過郵件發(fā)送的情況下氮昧,PGP可以將一個(gè)大文件拆分成多個(gè)文件框杜,反過來,也可以將多個(gè)文件拼合成一個(gè)文件袖肥。 - 鑰匙串的管理
?PGP可以管理所生成的密鑰對(duì)以及外部獲取的公鑰咪辱。用于管理密鑰文件稱為密鑰串(key ring)。
生成密鑰對(duì)
?略
加密和解密
加密
?PGP的加密過程椎组,如圖所示油狂,消息經(jīng)過混合密碼系統(tǒng)進(jìn)行加密,然后轉(zhuǎn)換成報(bào)文數(shù)據(jù)(文本數(shù)據(jù))。
?這里的內(nèi)容专筷,和前面提到的混合密碼系統(tǒng)的結(jié)構(gòu)基本上是一樣的弱贼,差異在于這里還包括了消息的壓縮以及二進(jìn)制——>文本轉(zhuǎn)換(轉(zhuǎn)換為ASCII radix-64)這兩個(gè)步驟。
- 生成和加密會(huì)話密鑰
- 用偽隨機(jī)數(shù)生成器生成會(huì)話密鑰仁堪。
- 用公鑰密碼加密會(huì)話密碼哮洽,這里使用的密鑰是接收者的公鑰。
- 壓縮和加密消息
- 壓縮消息
- 使用對(duì)稱密碼對(duì)壓縮的消息進(jìn)行加密弦聂,這里使用的密鑰是步驟1生成的會(huì)話密鑰
- 將加密的會(huì)話密鑰 步驟2與加密的消息 步驟4拼合起來鸟辅。
- 將步驟5的結(jié)果轉(zhuǎn)換為文本數(shù)據(jù),轉(zhuǎn)換后的結(jié)果就是報(bào)文數(shù)據(jù)莺葫。
用公鑰密碼加密會(huì)話密鑰匪凉,用對(duì)稱密碼加密消息 就是混合密碼系統(tǒng)的特點(diǎn)
解密
- 解密私鑰
?PGP的私鑰是保存在用戶的鑰匙串中的。為了防止鑰匙串被盜捺檬,私鑰都是以加密狀態(tài)保存的再层,并在保存時(shí)使用了基于口令的密碼(PBE)”の常口令是由多個(gè)單詞組成的短語聂受,沒有正確的口令就無法使用相應(yīng)的私鑰。如果攻擊者想要使用你的私鑰烤镐,就必須先竊取保存私鑰的鑰匙串蛋济,然后再破譯加密私鑰的密碼。
?解密私鑰的步驟如下
- 接收者輸入解密的口令
- 求口令的散列值炮叶,生成用于解密私鑰的密鑰碗旅。
- 將鑰匙串中經(jīng)過加密的私鑰進(jìn)行解密。
- 解密會(huì)話密鑰
- 將報(bào)文數(shù)據(jù)(文本數(shù)據(jù))轉(zhuǎn)換成二進(jìn)制數(shù)據(jù)
- 將二進(jìn)制數(shù)據(jù)分解成兩部分:加密的會(huì)話密鑰镜悉、經(jīng)過壓縮和加密的消息祟辟。
- 用公鑰密碼解密會(huì)話密鑰,這里使用步驟3中生成的接收者的私鑰侣肄。
- 解密和解壓縮消息
- 對(duì)步驟5中得到的經(jīng)過壓縮和加密的消息用對(duì)稱密碼進(jìn)行解密旧困。這里使用步驟6中生成的會(huì)話密鑰。
- 對(duì)步驟7中得到的經(jīng)過壓縮的消息進(jìn)行解壓縮稼锅。
- 得到原始消息叮喳。
生成和驗(yàn)證數(shù)字簽名
生成數(shù)字簽名
?在上圖中,消息與相對(duì)應(yīng)的簽名進(jìn)行拼合缰贝,并最終轉(zhuǎn)換成報(bào)文數(shù)據(jù)(文本數(shù)據(jù))馍悟。順便提一下,對(duì)于是否要將報(bào)文數(shù)據(jù)轉(zhuǎn)換成文本數(shù)據(jù)剩晴,在PGP是可以選擇的锣咒。
- 解密私鑰
?在鑰匙串中侵状,私鑰是通過口令進(jìn)行加密保存的,因此不知道口令的人就無法使用相應(yīng)的私鑰毅整。
- 發(fā)送者輸入簽名用的口令
- 求口令的散列值趣兄,生成用于解密私鑰的密鑰
- 求鑰匙中經(jīng)過加密的私鑰進(jìn)行解密。
- 生成數(shù)字簽名
- 用單向散列函數(shù)計(jì)算消息的散列值
- 對(duì)步驟4中得到的散列值進(jìn)行簽名悼嫉。這一步相當(dāng)于使用步驟3中得到的私鑰進(jìn)行加密艇潭。
- 將步驟5中生成的數(shù)字簽名與消息進(jìn)行拼合
- 將步驟6的結(jié)果進(jìn)行壓縮。
- 將步驟7的結(jié)果轉(zhuǎn)換為文本數(shù)據(jù)
- 步驟8的結(jié)果就是報(bào)文數(shù)據(jù)
驗(yàn)證數(shù)字簽名
- 恢復(fù)發(fā)送者發(fā)送的散列值
- 將報(bào)文數(shù)據(jù)(文本數(shù)據(jù))轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)戏蔑。
- 對(duì)經(jīng)過壓縮的數(shù)據(jù)進(jìn)行解壓縮
- 將解壓縮后的數(shù)據(jù)進(jìn)行分解成經(jīng)過簽名的散列值和消息兩部分
- 將經(jīng)過簽名的散列值(經(jīng)過加密的散列值)用發(fā)送者的公鑰進(jìn)行解密蹋凝,恢復(fù)發(fā)送者發(fā)送的散列值。
- 對(duì)比散列值
- 將步驟3中分解出的消息輸入單向散列函數(shù)計(jì)算散列值总棵。
- 將步驟4中得到的散列值與步驟5中得到散列值進(jìn)行對(duì)比
- 如果步驟6的結(jié)果相等則數(shù)字簽名驗(yàn)證成功鳍寂,不相等則驗(yàn)證失敗。這就是數(shù)字簽名的驗(yàn)證結(jié)果情龄。
- 步驟3中分解出的消息就是發(fā)送者發(fā)送的消息迄汛。
生成數(shù)字簽名并加密以及解密并驗(yàn)證數(shù)字簽名
生成數(shù)字簽名并加密
?上圖展示了對(duì)消息生成數(shù)字簽名以及對(duì)消息進(jìn)行壓縮和加密這兩個(gè)過程,并將兩者的結(jié)果拼合在一起形成報(bào)文數(shù)據(jù)(文本數(shù)據(jù))骤视。對(duì)于是否要將報(bào)文數(shù)據(jù)轉(zhuǎn)換成文本數(shù)據(jù)鞍爱,在PGP中是可以選擇的。
- 生成數(shù)字簽名
- 加密
解密并驗(yàn)證數(shù)字簽名
解密
驗(yàn)證數(shù)字簽名
信任網(wǎng)
公鑰的合法性
?在使用PGP時(shí)专酗,確認(rèn)自己所得到的公鑰是否真的屬于正確的人是非常重要的硬霍,因?yàn)楣€可能會(huì)通過中間人攻擊被替換。
?證書就是由認(rèn)證機(jī)構(gòu)對(duì)公鑰所施加的數(shù)字簽名笼裳,通過驗(yàn)證這個(gè)數(shù)字簽名就可以確認(rèn)公鑰合法性。
?然而粱玲,PGP中卻沒有使用認(rèn)證機(jī)構(gòu)躬柬,而二十采用了一種叫作信任網(wǎng)(web of trust)的方法。在這種方法中抽减,PGP用戶會(huì)互相對(duì)對(duì)方的公鑰進(jìn)行數(shù)字簽名允青。
?信任網(wǎng)的要點(diǎn)是“不依賴認(rèn)證機(jī)構(gòu)”,而是建立每個(gè)人之間的信任關(guān)系卵沉。換言之颠锉,就是能夠自己決定要信任哪些公鑰。
該系列的主要內(nèi)容來自《圖解密碼技術(shù)第三版》
我只是知識(shí)的搬運(yùn)工
文章中的插圖來源于原著