OpenPGP实验一、OpenPGP协议介绍OpenPGP源于PGP,世界上最广泛使用的电子数字签名/加密协议之一,是使用公开密钥加密算法加密的一个非私有协议,是一种近年来得到广泛使用成型的端到端的安全标准。
作为一种成为IETF标准(RFC2440)的免费加密协议,OpenPGP定义了对信息的加密解密,签名,公钥私钥和数字证书等格式,通过对信息的加密、签名以及编码变换等操作对信息提供安全服务。
1.OpenPGP加密数据加密就是通过加密系统把原始的数字信息(明文),按照加密算法变换成与明文完全不同的数字信息(密文)的过程。
OpenPGP采用公钥加密的方法,在使用公钥加密算法时,收信人首先生成在数学上相关联、但又不相同的两把钥匙。
一把公开钥匙用于加密,另一把秘密钥匙用于解密,这一过程称为密钥配置。
其中公开钥匙相当于一把锁,用于通信的加密;另一把秘密钥匙相当于开锁钥匙,用于通信的解密。
收信人将唯一的一把秘密钥匙自己掌握和保存起来,把公开钥匙通过各种方式公布出去,让想与收信人通信的人都能够得到。
这个过程就是公开钥匙的分发。
收信人可以使用收信人的公开钥匙对通信的文件进行加密,加密后的密文发信人再也无法解开。
相当于把信件十分可靠地锁在保险箱里。
收信人在收到密文以后,用自己的秘密钥匙解开密文获得信息。
由于公开钥匙和秘密钥匙是一对一地相匹配,唯一的一把秘密钥匙掌握在收信人的手里,除他之外,可以确信无人能够获取通信容。
如今的公钥加密算法有RSA,MD5加密算法。
公钥加密和解密的过程如下图所示:2.OpenPGP签名数字签名是指用户用自己的秘密密钥对报文的数字指纹(由散列函数产生的摘要)进行加密后所得的数据,数字签名从技术上标识了签名者对该电文的数字指纹的责任。
因为签名者的秘密密钥只有他本人所拥有,所以他一旦完成了签名便保证了签名者无法抵赖曾发过该信息(即不可抵赖性),所以也是用来描述数据与某个公开密钥的绑定关系,使用秘密密钥加密数据的过程就是签名的过程,这个签名可以通过与签名密钥对应的公开密钥以及原始信息一起得到验证。
发信者需要用的私钥对一段数据或者文档进行签名,就是用一种算法算出一段数据,而这段数据就代表文档独一无二的特征,一旦文档有任何改变这个数都会变化,这个签名将会失去作用。
签名的流程如下图所示:当一个用户对其他用户的属性信息真实性不确定时,可以查看验证其属性信息的签名用户。
如果对其签名用户表示信任,那么便会相信其属性信息是真实的。
验证签名就是验证属性信息签名者的身份以及签名信息的完整性。
当信息接收者拿到签名后的信息时,使用信息发送者的公共密钥对附在原始信息后的数字签名进行解密后获得数字指纹,并通过与自己用收到的原始数据产生的数字指纹对照,如果完全相符,文件容的完整性和正确性和签名的真实性都得到了保障。
验证签名的流程如下图所示:签名算法:目前PGP使用RSA公共密钥密码系统进行数字签名。
在数字签名中有重要作用的数字指纹是通过一类特殊的散列函数(HASH函数)生成的,对这些HASH函数的特殊要:1)接受的输入报文数据没有长度限制;2)对任何输入报文数据生成固定长度的摘要(数字指纹)输出;3)从报文能方便地算出摘要;4)难以对指定的摘要生成一个报文,而由该报文可以算出该指定的摘要;5)难以生成两个不同的报文具有相同的摘要。
常用的HASH算法有MDZ,MDS,SHA一1。
二、实验容1.产生公钥对:用命令gpg --gen-key,2.导入导出公钥1)导出公钥用命令:gpg -a --export -o mykey wongshy.其中参数:-a:以ASCII发布,这样比二进制文件看起来整洁一些;--export:导出公钥;-o mykey:导出的信息写入文件mykey;wongshy.:作为UID标识,即我们刚才建立的密钥。
这样,我们就得到了文件mykey。
2)导入公钥命令:gpg–importmykey3.把公钥发布到公钥服务器中GnuPG默认的公钥服务器是。
通过命令行:gpg --send-key AA9F7B044.从公钥服务器中搜索其他用户的公钥1)使用如下的命令可以搜索到我的公钥:gpg --keyserver--search-keywongshy.。
如下面的搜索结果,按数字1并回车就可以把我的公钥导入到本机。
输入q并回车可退出搜索。
2)搜索其他用户的公钥:gpg --keyserver --search-keyivarptr。
如下图,有重名的情况,这里会列出多条记录。
输入n并回车把搜索结果浏览个遍。
选择7号公钥,按数字7并回车,就可以把“AlongTan”的公钥导入到本机。
输入q并回车可退出搜索。
3)用gpg --list-keys,查看已有的钥匙。
5.公钥签名把“AlongTan”的公钥导入到本机后,就已经可以用它来加密信息或者用于校验我的数字签名。
不过这样每次操作时都会提示公钥不可信,因为虽然你导入了我的公钥,但存在导入冒充者的公钥的可能性。
所以你需要进一步跟我核对公钥是否正确,然后签收(sign key)它。
因为公钥有可能出现冒牌货,所以每个公钥里都加入了指纹值,使用下面命令可以查看指纹值:gpg –fingerprint。
出的结果应该有一组如下所示:其中“4D7C 8579 D440 353A 4AC7 B432 CF1B D6E4 3F90 4F0D”就是这个公钥的指纹值。
你应该通过打或者聊天工具等方式询问对方并核对指纹值是否一致,如果吻合的话就说明你取得的是真货了。
在确定公钥的真实性后,可以通过命令gpg –sign-key AlongTan6.设置信任度对于一个导入到自己公钥圈的公钥的主人,我们可以根据自己对他的熟悉程度来设置信任度,用命令gpg –edit-key AlongTan,再用命令sign 便会对其签名,再提示对其设置信任度,输入“trust”,共有5个等级,根据自己的需要来选择“4”,我完全相信。
7.查看key的有效性通过命令gpg--list-sigs可以查看key的有效性以及签名。
8.加密一个文件使用文本编辑器(比如记事本或者 vim、echo)创建一个名为 message.txt 的文件,里面写上任意一行文字,将该文件放在最初创建start.bat的文件夹下。
用以下命令加密它:gpg -a --output message-ciper.txt -r alongertangmail. -e message.txt其中参数:-a 表示输出文本文件格式。
–output 指定输出(即加密后)的文件名。
-r 指定信息的接收者(recipient)公钥的uid,可以是名字也可以是email地址。
-e 表示这次要执行的是加密(encrypt)操作。
执行完毕之后会在当前文件夹产生文件message-ciper.txt,这个就是被加密之后的文件。
注:如果你要加密的是一个二进制文件,则可以省略 -a 参数,这样产生的加密文件的体积会小一些。
9.解密一个文件现在假设我已经收到你寄过来的加密文件 message-ciper.txt(将其放在最初创建start.bat的文件夹下),使用如下的命令解密:gpg --output message-plain.txt -d message-ciper.txt其中参数:–output 指定输出(即解密后)的文件名。
-d 表示这次要执行的是解密(decrypt)操作。
GnuPG 程序会自动使用我的私钥来解密信息,最后得到一个跟原始容一样的文本文件message-plain.txt。
PS:因为不知道AlongTan的私钥,所以无法解密。
10.数字签名一个文件在我有一个文本文件 message.txt,使用如下命令即可对它进行数字签名:gpg -a -b message.txt其中参数:-a 表示输出文本文件格式。
-b 表示以生成独立的签名文件的方式进行签名。
命令执行完毕之后,会在当前文件夹里产生一个 message.txt.asc 的文件,这个文件即签名。
现在我应该把原信息文件 message.txt 连同签名文件 message.txt.asc 一起寄给你,然后你使用如下命令检验:gpg --verify message.txt.asc(验证签名时自己的公钥圈一定要有对方的公钥),你将会看到如下两行:其中最重要的是“完好的签名”字样,表示通过检验,否则表示没通过检验(即意味着原信息的容被篡改或者原信息不是我发出的)。
提示:如果你有多个私钥,在签名时需要加上参数 -u 指定私钥的 uid。
三、小结查相关资料,知道OpenPGP是一种用来加密电子的公用密钥系统。
而公用密钥系统使用RSA算法的健全性保证了的安全性。
本次实验,根据实验指导,利用GPG完成了公钥的产生、文件签名、加密、导入导出公钥、公钥签名、设置信任度、检查公钥有效性、上传服务器、下载服务器的过程。
也熟悉了DOS命令下的操作。
通过加密和解密文件,对RSA加密算法有了进一步解。
但是解密不成功,主要是因为下载了公钥服务器上的一个用户的公钥,通过他的公钥加密文件(不知怎的用自己的公钥加密不成功???),由于不知道私钥,所以没能解密文件。
感觉收获蛮大的。