OpenPGP
最近在学习一些网络安全协议的内容,自己复习的时候总结了一下,把这些发出来以供交流学习。
1. 概述
Pretty Good Privacy(PGP)是一个提供加密和认证的计算机程序。
PGP经常被用于签名、加密和解密电子邮件,以增加电子邮件通信的安全性。
提供的安全功能
保密性:对称加密信息,非对称加密会话密钥
完整性:对消息摘要数字签名
身份认证:数字签名
PGP模块
加解密
数字签名
压缩:为了高效地传输数据,PGP支持ZIP、ZLIB、BZIP2等格式的压缩和解压。
电子邮件兼容性:
为了兼容电子邮件(ASCII码格式),加解密的二进制结果将会转换为Radix-64编码(基于Base64编码,增加检测错误的校验和)
2. 加密与解密
2.1 加密
图示:
解释:
第一步,先将消息进行压缩,减少需要计算的数据的量。
第二步,生成一个随机的会话密钥,用于之后加密消息。
第三步,使用对称加密算法加密消息(为了快速高效),使用的密钥就是刚刚生成的会话密钥
第四步,处理会话密钥。选择非对称加密算法,用接收者的公钥加密会话密钥。
第五步,拼接加密后的会话密钥和消息。如果是邮件还需要转码成Radix-64编码
2.2 解密
图示:
解释:
第一步,按长度分解接收到的数据(如果是电子邮件还要先解码为二进制),分解为加密的会话密钥和消息。
第二步,用接收者的私钥解密会话密钥。
第三步,用会话密钥解密消息。
第四步,解压解密后的消息,得到明文消息。
2.3 私钥管理
由加密和解密的过程可以看到,解密时需要接收者输入的就是接收者的私钥,但是现在就有以下的问题:
如果直接输入私钥的话,由于这个值通常十分复杂,难以记忆,可用性很低。
如果直接以明文存储接收者私钥到本地,将不满足纵深防御的理念,一旦有攻击者得到计算机的控制权,密钥将形同虚设。
为了解决私钥存储的问题,PGP使用PBE(Password Based Encryption)。
简单的PBE:
这样使用PBE仍然是不安全的,这样很容易遭受口令字典暴力破解攻击。为了对抗这样的安全威胁,最好的办法是随机化hash函数的输入
加盐的PBE:
通过加一个随机的“盐”值,将会增加hash函数输入的熵,使得口令字典暴力破解攻击变得更加困难。
PGP的私钥管理:
图示:
解释:
第一步,接收者输入口令,使用一个盐值与口令拼接。
第二步,将拼接后的口令输入hash函数,得到一个处理过的私钥的“密文”
第三步,使用这个私钥的“密文”解密加密后的私钥,得到真正需要使用的私钥
2.4 完整流程图示
3. 数字签名生成和验证
加密方法满足了信息的保密性要求,但是为了认证发送者的身份,还是需要数字签名的技术。
3.1 签名
图示:
解释:
第一步,首先将消息输入hash函数,得到一个定长的消息摘要
第二步,按照与PGP的私钥管理规则,得到发送者的私钥(参见前文)
第三步,使用发送者的私钥进行签名
第四步,拼接要发送的消息和签名,并对拼接后的消息进行压缩
第五步,发送数据(如果为了邮件兼容性,还需如上图增加转码到Radix-64的过程)
3.2 验证
图示:
解释:
第一步,解压缩数据(如果做了转码处理,这里还需要解码成二进制数据)
第二步,按长度分解数据,分为消息和签名
第三步,用发送者的公钥验证签名得到消息的哈希值A
第四步,计算消息的哈希值B
第五步,对比哈希值A和哈希值B,若相同,则接受这个签名
3.3 完整流程图示
4. 加解密与数字签名结合
为了同时保证保密性以及验证身份,只需结合加解密与数字签名的过程即可:
5. 信任网
在PGP协议的加解密和数字签名过程中都是用到了公钥,之前并没有讨论到公钥的合法性问题。按照一般的方法,公钥的认证依赖于一个可以信任的机构,依赖于公钥基础设施PKI。但是PGP假定没有任何机构可以信任,其使用的是一种称为信任网的模式。
5.1 基本原则
通过各个用户的签名以及用户的受信任级别来决定该公钥是否有效。
5.2 具体实施
在阐述信任网的实施方法之前,需要先搞清楚PGP信任级别,因为这个将是信任网的基础:
自己签名确认:
如果某个公钥被用户自己签过名,那么则认为这个公钥有效。
例子:用户A与用户B通过某种方式交换了各自的公钥,并且用户A和用户B在交换时就对对方的公钥进行了签名。在之后要使用公钥时,用户A或用户B会发现对方的公钥已经被自己签过名了,所以这个公钥将会被认为是一个合法的公钥。
完全信任的用户签名确认:
如果某个公钥被另一个用户签过名,而这个用户的信任级别是完全信任,那么则认为这个公钥有效。
例子:用户A有一个好朋友用户C,用户C为用户B的公钥进行了签名。当用户A要使用用户B的公钥时,用户A会发现用户C签名了这个公钥,那么由于用户A完全信任用户C,那么用户A将会认为用户B的公钥是有效的。这个过程比较类似现实生活中,我的好朋友介绍他的好朋友给我的过程。
多个有限信任的用户签名确认:
如果某个公钥被多个用户签过名,且这些用户的信任级别是有限信任,那么则认为这个公钥有效。如果只有一个有限信任的用户签名了这个公钥,那么这个公钥将被认为是无效的。
例子:用户A有两个同时用户D和用户E,用户D和用户E同时为用户B的公钥签了名。当用户A要使用用户B的公钥时,用户A看到有两个用户为B签了名,而这两位同事比较可靠,那么用户A便认为这个公钥是有效的。如果只有一个用户D为用户B签了名,那么由于用户A并不能完全信任用户D,害怕用户D和用户B联合起来作假欺骗自己,于是用户A认为用户B的公钥是无效的。
6. PGP选用的算法
6.1 数字签名
DSS、RSA:签名
SHA:签名时使用的哈希算法
6.2 消息加密
CAST-128、IDEA、3DES:用来加密消息
RSA:用来加密会话密钥