GPG/PGP
版本1
联系我:一般还是使用站内短信通知比较快。 http://forum.ubuntu.org.cn/ucp.php?i=pm&mode=compose&u=171468
cat650@163.com
使用特性
GPG大多用于加密信息的传递。如果你仅仅是想在本地加密数据,推荐使用Ecryptfs企业级加密文件系统(安装系统时提示是否加密主文件夹,使用的就是这个加密系统)。
除了仅用密码加密外,GPG最大的不同是提供了“公钥/私钥”对。利用你的“公钥”别人加密信息不再需要告诉你密码,随时随地都能发送加密信息。而这种加密是单向的,只有你的“私钥”能解开加密。
数字签名又是另一大使用方向。通过签名认证,别人能确保发布的消息来自你,而且没有经过修改。
实际应用
kgpg
这是kde下的软件,gnome的朋友也可以安装。当然默认gnome已经有自己的gpg软件了。
安装
sudo atp-get install kgpg
它依赖于gpg这个底层软件(默认已经安装)。我们安装软件、设置软件源时,导入密钥、验证软件来源就是与它有关。实际上大多数linux发行版都包含了gpg这个东西。
喜好命令行的朋友请直接使用gpg命令来操作。对于只想点点鼠标就完事的,还是根我一起用kgpg。
第一次使用
首先你要有一对自己的密钥,才能开始工作。生成,导入都可以(如果是陌生的密钥,可能无法使用需要设置一下,或在密钥属性中提高信任等级)。
导入:启动kgpg,在“系统托盘”区,有一个金锁样的东西(没看见的朋友,请展开)。右键,打开“密钥管理器”。“密钥”导入。注意:这里除了导入密钥对,还可以导入别人的“公钥”以完成加密工作。
生成密钥对
“密钥管理器”中“密钥”,“生成密钥对”请选择“专家模式”(普通模式等待时间太长)。
请选择您要使用的密钥种类:
一般选择:(2) DSA and Elgamal
您的选择?
输入2,回车
下面就问密钥长度。这个不用记,关系也不大。密钥长度越长,加密强大越大,使用时间越多,生成密钥耗时越多。
请设定这把密钥的有效期限。
大家先使用默认的0吧。正规使用时,根据别人使用“公钥”的需要(给你发送加密数据),设定时间。
真实姓名:
这里需要一个标识,起码你与别人(拿走你“公钥”的人)都能明白这个代表谁。
电子邮件地址:
你与别人(拿走你“公钥”的人)都能明白这个代表谁。如果没有别的考虑,写个能联系你的地址吧。
注释:
这个可写可不写,方便自己而已。
更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)?
这是最后一步了,没问题就输入o吧。
接下来就是输入密码了,这个东西不说也肯定要记住。
接着它就开始告诉你密钥开始生成,同时需要你作一些其它操作以便获得足够的加密随机数。这个时间很慢长,你先别管它,虽然它看起来像是僵死了。进行你日常操作吧,当它获得了足够的加密随机数,自己会关闭窗口的。
好,窗口关闭后,按F5刷新一下“密钥管理器”。看见没,属于你自己的密钥对生成了。
导出密钥
现在这东西存在于
~/.gnupg/
中。虽然也经过处理不能直接获得,但是在其它软件的攻击下,依然能进行篡改。这是整个gpg的薄弱之处,记得一定要保护好这个文件夹。
- 首先导出私钥:使用u盘等进行保存。以后,需要时还能导入回来,或者在其它电脑上使用。
指着密钥对(主密钥),右键,“导出绝密密钥”
找个地方存放好,千万不要放在本机。虽然有密码保护,可是也非常不安全。
- 导出公钥:这个就是交给别人的东西。
指着密钥对(主密钥),右键,“导出公开密钥”
这个东西只能加密不能解密,随便放啦。放到网络上给朋友下载。
加密
- dolphin中指到要加密的文件(夹)上,“动作”,加密即可。此时会弹出密钥选择,选择正确的密钥加密即可。(如果是陌生的密钥被导入,可能无法使用需要设置一下,或在密钥属性中提高信任等级)
- 选取复制要加密的内容,在kgpg图标上(系统托盘处)点右键,选择“加密剪贴板”,根据提示进行操作。在能输入文字的地方,粘贴。即可得到加密文本。通过email、QQ、IPTUX等网络工具发送即可。
对图标点右键,选择“加密剪贴板”就能把选中复制、剪切的文本进行加密。再粘贴出来,就是加密后的文本了。
- 密钥管理器中还有个“编辑器”。相当于一个文本编辑器,但是具备了加密/解密功能。
对称加密
在加密高级选项里,有个对称加密选项。使用这个选项后,不再需要密钥,只需要一个密码即可加密。
接收者也不再需要什么密钥,只需要这个密码即可解密。这就是很常见的加密方式。安全性也不高
密钥加密
这是用到“公/私”密钥的加密方式。
先创建一对密钥对(公钥、私钥),及密码。把私钥藏好,把公钥交给朋友。
加密高级选项中不要选择“对称加密”,选择时找对公钥(接收者要有对应的私钥),加密即可。
ASCII加密
在高级选项中,还有一个“ASCII加密”加密选项。它的意思是加密后以ASCII码表示出来(无论原来是文本还是图片或其它)。方便你使用email、QQ等文本方式发送加密内容。如果是对文件加密,加密文件结尾为.asc。
特点是传送方式多样,纯文本形式。压缩包、文件夹、图片、非ASCII(word、数据库)等都能转换为ASCII码。
缺点是,加密文件比较大。
非ASCII加密
在高级选项中,不要选择“ASCII加密”加密选项。对文件加密,加密文件结尾为.gpg
特点是加密文件比较小。
缺点是解密前无法以文本方式阅读。
解密
收到加密文件后,通过加密对应的方式,反操作即可解密。其中要求选择正确的“私钥”,还要输入密钥的密码。
如果是压缩包、文件夹、图片、非ASCII,在“编辑器”解密可能会解出一堆乱码。相当于用文件查看器查看这些内容。是不是一定非要了解对方加密的是什么东西呢?不需要。
- 以文本方式保存得到的加密ASCII码,记得开头和结尾的带————的英文也要完整的保存进去。
- 文件以.asc结尾命名。理论上无论文件以什么结尾,系统应该能自动识别。
- 在dolpin中,使用动作“解密”
这样你就能得到正确的解密文件了,不用伤脑子。
对于“非ASCII加密”,直接解密.gpg文件即可。
密钥管理
导入密钥后,会有个信任提问。这个东西是给自己看的,提示自己。默认情况下,加密/解密的密钥选择中,没有那些“不信任的密钥”。你可通过设置来改变。
密钥属性,可以随时改变信任程度。
密钥对的钥属性还可以更改有效期。
签名
它的作用是验证以传的明文、加密文件、密钥是来自正确的发送者的,没有经过其它人的修改。
签名使用的也是密钥对,与加密操作相同。只是在结果上,有点不同。它只是在文件最后添上加密的验证信息(签名)。一旦文件有所改变,签名验证就会出错。
比如我们ubuntu安装软件时,首先要用事先保存的密钥(大多从hkp://keyserver.ubuntu.com获得)验证软件源的签名。以保证我们没连上个“李鬼”下载服务器。
ssh(远程控制)也使用了密钥进行了签名,以保证我们连接的机子是真正要连接的机子,而不是来骗密码、资料的。它的使用请看Ubuntu-servers
密钥服务器
我们的公钥除了能通过传统方式送到朋友手上,还能传送到密钥服务器。这东西有点像下载服务器。
这些密钥服务器们互相合作,进行同步。你一次上传基本都有了。
因为它会一直保存你的公开密钥直到它过期,所以你不要设置“永不过期”。那样很不道德。一般来说12月比较适合,再长丢失私密,忘记密码的事发生就比较频繁了。
你的朋友通过搜索你的密钥名或email,就能找到它。然后再看看密钥特征(属性里又被称为“指纹”),与你告知的是否相符。就可以下载下来进行加密发文件、消息给你了。
初学者还是不消耗服务器资源了,ubuntu的软件还要靠它来验证呢
gnome下
gnome下的加密管理有点混乱,特别是在密钥管理上有点乱不清。但底层都是gnupg,所以概念与kgpg是一样的。因为没有再使用gnome桌面系统,所以请使用gnome的同学认真补充操作指南。
版本2
PGP(Pretty Good Privacy)又称为Pretty Good Privacy,它可以用来保护私隐信息。虽然很难统计这个世界上究竟有多少人使用PGP,但Philip Zimmermann作为PGP的设计者,被评为50位Internet上最有影响力的人之一。
以前,PGP是一种邮件加密软件,它被用于保证邮件在传输过程中保证其保密性和身份确凿性(即身份不可冒认)。现在,PGP的应用已经超出邮件范围,在即时通讯、文件下载、论坛等地方都时常看到PGP的踪迹。
pgp.org.cn
.PGP是啥?GPG是啥?
PGP么,简单的说,是一款以利用公钥和密钥技术的加密和身份验证软件。
而GPG呢,就是开源的PGP。
.公钥?密钥?听起来很麻烦啊!
公钥和密钥,是现在密码学的一个发明。以我们生活中的例子来说,公钥相当于你的银行帐号,私钥相当于你的银行存折和银行卡。
公钥,也就是银行帐号,是公开的,让大家都知道,这样可以让别人向你汇钱。
而私钥这个存折呢,是要小心的藏好的,绝对不能满世界乱丢,因为凭它就可以去银行取你的钱呢。
.那么说PGP和GPG是很NB的加密软件了?
虽然PGP和GPG有强大的安全性,足够胜任加密软件的功能。但是,严格意义上来说,PGP和GPG的加密功能应该叫做保密功能比较贴切。只把PGP和GPG当加密软件用,有点大才小用和不方便了,如果只是要加密软件的话,我个人还是比较推荐TrueCrypt这款软件,毕竟TureCrypt在保持了强大的安全性的同时,不需要好好保护自己的私钥这么麻烦。就那前面的银行帐号的例子来说,你可以天天去银行自己给自己汇款,但是还是直接存钱比较方便不是么?
那么PGP和GPG的保密性又是啥回事捏?这很好理解。你汇钱给别人的帐号,是希望持有对应帐号银行存折的人才能取,其他的 比如 银行保安阿,柜台的工作人员阿,银行里排队排在你后面的人阿,就算经手了你的钱和汇款帐号也不能偷偷摸摸的把对方的钱取出来对不?所谓的保密性,就是起到这个作用。
.额,我只是要个加密软件而已,保密性对我没什么用吧?
保密性当然很重要。对于目前整个互联网应用来说,还是基于帐号+密码的体系的。这是非常脆弱的一种体系。试想如果银行不给你银行卡和存则,而是给你一个帐号和密码,凭这个帐号和密码就能动你的钱,你能放心吗?而且,我们只是租用互联网和互联网上的服务而已,不管是你的isp,你的email服务商,你上的bbs,甚至管你的一个小小的网管,只要他们高兴,都能看到你在网络上的所有数据。说不定你那个网管还可以边嘲笑你些给你女朋友的email肉麻边帮你修改里面的错别字呢…………要知道现在我们常用的http,smtp,pop服务都是明文传递你的信息甚至是你的帐号密码的。不信?自己去搜索"外贸邮件不正常"看看。
而现在的PGP也好,用于安全协议的https、sftp也好,或者说现在大行其道的数字证书也好,都是采用公钥/密钥模式,把以前明文通信的,如同明信片一样内容,精心的加上了一个只有收件人能打开的信封而已。若果你觉得保密性不重要,那么想想你会把比较个人的信件用人人都能看到的明信片寄出去吗?
.听起来有点道理,那么那个"签名"又是啥东西?
其实呢,这个"签名"是英文的直译。我个人的角度来看,还是理解为手写体的笔迹比较贴切。以那个信件的例子来说,谁都可以自称你给你女朋友写信,签上你的地址,也可以在公共场所以你的名义贴大字报。那么你的女朋友又是以什么来判断写信的是不是你呢?自然是靠那个别人很难模仿的笔迹。而PGP,或者其他的公钥/密钥系统的软件所产生的签名,就是等于把原来是印刷体的文字,变成你自己手写的内容。
而用pgp或者数字证书等东西进行签名,其意义就在于,声明某一段文字或者文件是你本人发表的,而且防止别人篡改你的东西。这在bbs等公共场合,有权限的各级管理员可以修改你发布的帖子的内容的时候,特别有用。
那我要验证别人的签名不是要保留一堆公钥?那不是很麻烦?
要是在以前,或许很麻烦,但现在是网络时代,就不用担心这点了。
现在网络上有很多公钥服务器,而且都是互相同步的。比如:
http://keyserver.ubuntu.com:11371 http://pgp.mit.edu/ http://wwwkeys.pgp.net:11371 http://subkeys.pgp.net
只要上这些网站或者在pgp/gpg软件中把公钥同步上去就可以了。
基本所有的pgp和gpg软件都支持这些全球性的公钥服务器,你也可以建立自己的公钥服务器供小范围使用。
在这些服务器上,所有的公钥都以一个id来识别。这个id是建立公钥的时候就固定下来的。在常用的pgp软件中都可以查看到。在公布公钥时,只要把公钥发布到这些服务器上,然后交给别人一个id就可以了
比如我就把我的id放在 http://www.mrxu.net 的最下面,想导入我密钥的人只要在pgp或者gpg软件内搜索我的key的id就可以了。
.放在服务器上自己去下载?那我怎么知道这是真的还是假的?
这又是个聪明的问题。对于所有的公钥/密钥的软件来说,验证公钥都是非常重要的一步。如果不能验证公钥,那么签名或者加密都不过是自欺欺人而已。那么,现让我们看看常见的数字证书是怎么验证公钥的。
数字证书,是由有足够权威的商业/政府机构作根服务器,对所有发出的数字证书经过验证后进行签名确保其有效。
这个主意不错吧?比如前一阵汶川地震的时候,各种渠道的散尽天良的骗子冒充红十字会的帐号满天飞,那时候我们怎么办?我们还是以够权威的电视/报纸上公布的帐号为主。这就和数字证书的验证方式相同了,以电视台(报纸)这个认证机构CA,对红十字会的帐号(公钥)进行认证。
与数字证书这种偏重商业性的验证方式不同,PGP采用的是一种更细致化的验证方式。当然,pgp也可以实现类似于数字证书的认证方式,但那只是pgp认证方式的用途之一而已。
还记得你身边的大多朋友是怎么由陌生人变成你可以信赖的人吗?没错,介绍。你父母把你的邻居介绍给你,你的老师把你的同学介绍给你,你的领导把你的同事介绍给你。而你的邻居,你的同学,你的同事,又介绍他们的朋友给你。前一阵不是流行六度空间理论吗?世界上每两个人可以通过6个人互相之间产生联系。
pgp就是基于这种介绍人体系。
每个公钥可以对其他的公钥进行签名,表示"我和这个人很熟","我听说过这个人","我和它不熟"。
而你又可以对你得到的公钥设定信任程度:极信任 (我自己的其他身份,我父母),完全信任(我的铁哥们,老朋友,老板),勉强信任(我见过几面的朋友),不信任(我听说过而已),我没听说过。
那么,你遇到的公钥就能分为好几种:
A:我自己很熟,听说过的人 (用自己的公钥签名过的公钥) B:我铁哥们(我完全信任的公钥) C:我的熟人的熟人(用A的公钥签名过的公钥) D:铁哥们的熟人(B签名过的公钥) E:我铁哥们的熟人的听说过的人(用D的公钥签名过的人) F:我铁哥们的熟人的听说过的人的听说过的人(用E的公钥签名过的人)
PGP公钥能表示的关系比网上那些什么SNS网络有效精确多了吧?
对于ABCDEF这6个人,我想你对他们的信任程度是不同的吧?而根据他们的关系,你也能判断出ABCDEF哪些可以信任,那哪些压根就不熟了吧?但是如果每个钥匙都要你这么确认,你头也要大了吧?没关系,PGP建立了一个方法能让系统自动判断一个签名可以不可以相信。
你对每一个公钥的信任程度,代表你给用这个公钥的人打了个分。
比如,你的铁哥们是80分吧
而公钥的签名,就对应了打几折(8折,5折)
你自己是100分,B是80分,c是64分,D是64分,E是32分,而f就只要可怜的16分了
而系统可以判断,60分或者70分以上的人自动可以信任(还有多个签名的因素)
那么当以后系统遇到60分或70分以上的人,就自动归为可信的了。(数字只是举例)
在这个系统内,如果你完全相信一个权威认真机构的公钥,那么就等同于数字证书的效果了。
这点上,PGP.COM就开始作这件事了。它作了个keyserver.pgp.com,必须要认证email才能上传公钥,上传后会为公钥加一个有固定期限的签名,不与别的服务器同步。不过由于email的安全性比PGP要差得多了,我觉得这个意义实在一般,只能作为辅助手段。
对于你这个用户而言,对这个系统不必搞的那么清楚。你只要知道,如果有一个人,你的几个朋友都信任他,那么,你的PGP/gpg也会帮你信任他了。
PGP的信任系统当然比我的描述的复杂,并严谨的多了,可以进行很多很细致的设置。但是,我们不是白话PGP么,大概知道是怎么回事就足够了。
.听起来不错,但你只是粗略的扯了一通,总要让我们看看PGP的加密或者签名到底是啥样子的吧?
也是,耳闻不如目见么。
如果你导入并信任了我前面说的标在我blog上的key(到我发帖为止是F00CCD42)
那么,你就可以验证如下文字是我发的,并没有被人篡改过(可以使用PGP[win],Firegog[firefox 浏览器+gpg],KGPG[linux/kde])
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 > 我觉得PGP是个很好用,很有前途的软件,并推荐大家去使用它。 Jarlyyn Hsu . 2008年7月22日 > -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) iD8DBQFIhZeCffjdfvAMzUIRAkTwAKCM5H0FFbaxSsLa5O6aPCIn5eSgZgCghifT CySKm5brE/UatqDcVEogT7o= =+NNM -----END PGP SIGNATURE-----
而如下则是我用自己的密钥对其他的文字进行了加密,你没我的私钥,是解不出来的,就算你有我的公钥也么用
-----BEGIN PGP MESSAGE----- Version: GnuPG v1.4.6 (GNU/Linux) hQINA89Ul2Kr0xIkEAf/QnBtnf8IwqpgcY0vX40FeSO1F6nmqIBdJ5KV0YemejKX d5r8qJ5IqmFCoc6WkXc4AaxCKC1H20QeS2CSbxeTFbUrYIOX9ho3tM/oD52uXdM4 ARXegRFLt2+8lLQo+1hYLvcGJy37PnvSVeE5AnnqKPnERW/wtjomqiRSfsqlM+ev Y8tlcJhNtqTBiH/lnq7yFLpP9BNA2zuYsqQ0Y3/1lHXM2iSSuEcWmy1FfVYISKnY zGw6FOoDGN+WtPV67uWCVAlkxpa665mRpQuPWEBr2/HkG9ps2i7BGdkB+LGLmxfp Ow4HjtDl3Oo/gljrAiFvIM5RLukn1p+g2K11ChrtIAfzBdBHGe1dCqEihaUVSl70 u7IuTay1FDSEFwpoa69T1djhrknQGFh3WMnARWjFLi/JgFzxtAOCDJpN1oYGubYn 38GY34Gizn0+C8iAAXULt0mEpnRMow2ACQIzOqz6EtL79j9C+zTe9SlZoQEDrYVi 6Etfq+9bScc86Q8Kl5xqpb3pGiqEHLFFgysh+UITG51uo1CuhzIRMPuSk5OZNxJQ X+oZDFKwFNCsRnubpWiyDPsIQ6cD8f1Rl1HMfg9DrxW5R0yZpDYZkIU9ll2YOky+ YUSXKMstWw0jEM7cgC1dh+7xZSzNxPnBQBbrMSeRfO26aHgQBe/0ThA234RzvLSv 0lAByFqVOncwefKWTAmuweocZwauuyRoiY6Bu/3tCAY9xur7qdOzIP77JOIyKn9U 9uJ/NkTCoA4gaD1qn39zz/pCVs9TKxoNDp+MgUGsi1pMrg== =zE2J -----END PGP MESSAGE-----