网络安全协议学习(一)——OpenPGP – 作者:FFFcaptain328

OpenPGP

最近在学习一些网络安全协议的内容,自己复习的时候总结了一下,把这些发出来以供交流学习。

1. 概述

Pretty Good Privacy(PGP)是一个提供加密和认证的计算机程序。

PGP经常被用于签名、加密和解密电子邮件,以增加电子邮件通信的安全性。

提供的安全功能

  • 保密性:对称加密信息,非对称加密会话密钥

  • 完整性:对消息摘要数字签名

  • 身份认证:数字签名

PGP模块

  • 加解密

  • 数字签名

  • 压缩:为了高效地传输数据,PGP支持ZIP、ZLIB、BZIP2等格式的压缩和解压。

  • 电子邮件兼容性:

    为了兼容电子邮件(ASCII码格式),加解密的二进制结果将会转换为Radix-64编码(基于Base64编码,增加检测错误的校验和)

2. 加密与解密

2.1 加密

图示:

1604411087_5fa15ecf2473318ec0ba4.png!small?1604411088825

解释:

  • 第一步,先将消息进行压缩,减少需要计算的数据的量。

  • 第二步,生成一个随机的会话密钥,用于之后加密消息。

  • 第三步,使用对称加密算法加密消息(为了快速高效),使用的密钥就是刚刚生成的会话密钥

  • 第四步,处理会话密钥。选择非对称加密算法,用接收者的公钥加密会话密钥。

  • 第五步,拼接加密后的会话密钥和消息。如果是邮件还需要转码成Radix-64编码

2.2 解密

图示:

1604411093_5fa15ed51ba8ac405ff7c.png!small?1604411094741

解释:

  • 第一步,按长度分解接收到的数据(如果是电子邮件还要先解码为二进制),分解为加密的会话密钥和消息。

  • 第二步,用接收者的私钥解密会话密钥。

  • 第三步,用会话密钥解密消息。

  • 第四步,解压解密后的消息,得到明文消息。

2.3 私钥管理

由加密和解密的过程可以看到,解密时需要接收者输入的就是接收者的私钥,但是现在就有以下的问题:

  • 如果直接输入私钥的话,由于这个值通常十分复杂,难以记忆,可用性很低。

  • 如果直接以明文存储接收者私钥到本地,将不满足纵深防御的理念,一旦有攻击者得到计算机的控制权,密钥将形同虚设。

为了解决私钥存储的问题,PGP使用PBE(Password Based Encryption)。

简单的PBE

1604411113_5fa15ee951c1d0cf9f4cd.png!small?1604411114982

这样使用PBE仍然是不安全的,这样很容易遭受口令字典暴力破解攻击。为了对抗这样的安全威胁,最好的办法是随机化hash函数的输入

加盐的PBE

1604411117_5fa15eed83ef7de2b4544.png!small?1604411121220

通过加一个随机的“盐”值,将会增加hash函数输入的熵,使得口令字典暴力破解攻击变得更加困难。

PGP的私钥管理

图示:

1604411123_5fa15ef39ff49654cdf38.png!small?1604411125272

解释:

  • 第一步,接收者输入口令,使用一个盐值与口令拼接。

  • 第二步,将拼接后的口令输入hash函数,得到一个处理过的私钥的“密文”

  • 第三步,使用这个私钥的“密文”解密加密后的私钥,得到真正需要使用的私钥

2.4 完整流程图示

1604411128_5fa15ef8397d85748926f.png!small?1604411129864

3. 数字签名生成和验证

加密方法满足了信息的保密性要求,但是为了认证发送者的身份,还是需要数字签名的技术。

3.1 签名

图示:

1604411140_5fa15f04d2594ea5072cf.png!small?1604411142530

解释:

  • 第一步,首先将消息输入hash函数,得到一个定长的消息摘要

  • 第二步,按照与PGP的私钥管理规则,得到发送者的私钥(参见前文)

  • 第三步,使用发送者的私钥进行签名

  • 第四步,拼接要发送的消息和签名,并对拼接后的消息进行压缩

  • 第五步,发送数据(如果为了邮件兼容性,还需如上图增加转码到Radix-64的过程)

3.2 验证

图示:

1604411150_5fa15f0ec0350715468c3.png!small?1604411152386

解释:

  • 第一步,解压缩数据(如果做了转码处理,这里还需要解码成二进制数据)

  • 第二步,按长度分解数据,分为消息和签名

  • 第三步,用发送者的公钥验证签名得到消息的哈希值A

  • 第四步,计算消息的哈希值B

  • 第五步,对比哈希值A和哈希值B,若相同,则接受这个签名

3.3 完整流程图示

1604411159_5fa15f174dff26044afc9.png!small?1604411160960

4. 加解密与数字签名结合

为了同时保证保密性以及验证身份,只需结合加解密与数字签名的过程即可:

1604411167_5fa15f1f7a1cb477a05da.png!small?16044111692071604411179_5fa15f2b3a534d69b73f2.png!small?1604411180902


5. 信任网

在PGP协议的加解密和数字签名过程中都是用到了公钥,之前并没有讨论到公钥的合法性问题。按照一般的方法,公钥的认证依赖于一个可以信任的机构,依赖于公钥基础设施PKI。但是PGP假定没有任何机构可以信任,其使用的是一种称为信任网的模式。

5.1 基本原则

通过各个用户的签名以及用户的受信任级别来决定该公钥是否有效。

5.2 具体实施

在阐述信任网的实施方法之前,需要先搞清楚PGP信任级别,因为这个将是信任网的基础:

1604411187_5fa15f336931faeada621.png!small?1604411189128

  • 自己签名确认

    如果某个公钥被用户自己签过名,那么则认为这个公钥有效。

    例子:用户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:用来加密会话密钥

来源:freebuf.com 2020-11-03 21:59:34 by: FFFcaptain328

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论