第4章 安全电子邮件-PGP

4.1 电子邮件的安全属性

电子邮件的特殊安全需求:

  • 通信双方不会同时在线进行通信,无法在线协商会话密钥
  • 很难找到双方可信的第三方公钥分发机构
  • 传统 SMTP 仅支持可打印的 ASCII,但加密后的密文未必符合要求

4.2 PGP

PGP (Pretty Good Privicy)
  PGP 是1990 年左右由 Phil Zimmermann 个人编写的密码软件,不同于常规的引入可信第三方的公钥管理机制,PGP 基于去中心化的分布式网络,通过一次性会话密钥加密消息来确保消息的机密性,通过公钥来传递一次性会话密钥,通过公钥加密传递消息验证码,接收方生成新的 MAC 与发送的加密 MAC 进行比较,确保消息的完整性

  三种工作方式:加密、认证、认证并加密

4.2.1 工作流程

认证
  认证主要是通过公钥密码,和消息验证码来完成信息内容的比对和双方身份的认证

主要流程如下:

  1. 发送方使用 Hash 函数,生成消息的散列值
  2. 发送方用自己的私钥,通过 RSA 算法加密散列值 ,得到 MAC
  3. 将 MAC 和消息拼合在一起,压缩并进行 Base-64 转换
  4. 接收方将消息进行解压缩和逆 Base-64 转换
  5. 接收方将 MAC 和消息分离,用发送方的公钥解密 MAC ,得到消息的散列值
  6. 接收方同样用 Hash ,生成消息的散列值
  7. 对比两个散列值,若相同则认证成功,消息完整且发送方属实

加密
  由于电子邮件双方不会同时在线,无法在线协商一次性会话密钥,所以先要解决密钥分发问题
  发送方使用随机生成的密钥 Ks 作为一次性会话密钥,并加密邮件消息;使用接收方的公钥加密一次性会话密钥 Ks,来完成密钥分发

主要流程如下:

  1. 发送方首先对消息进行压缩
  2. 发送方生成一个仅针对当前邮件的随机 128 位的密钥 Ks,使用 CAST-128 (或 IDEA、TDEA) 对称加密算法,用 Ks 加密压缩后的邮件
  3. 用接收方的公钥加密一次性会话密钥 Ks
  4. 把加密后的密钥和加密后的压缩邮件拼接,进行 Base-64 转换
  5. 接收方首先进行逆 Base-64 转换,将加密后的密钥和加密后的邮件分离
  6. 接收方使用自己的私钥,解密得到一次性会话密钥 Ks
  7. 接收方用 Ks 解密,再进行解压缩,得到邮件消息

认证并加密
  认证和加密操作合并,首先完成认证部分,再进行加密

发送方的主要流程如下:

  1. 发送方使用 Hash 函数,生成消息的散列值
  2. 发送方用自己的私钥,通过 RSA 算法加密散列值 ,得到 MAC
  3. 将 MAC 和消息拼合在一起,进行压缩,生成一个仅针对当前邮件的随机 128 位的密钥 Ks,使用 CAST-128 (或 IDEA、TDEA) 对称加密算法,用 Ks 加密压缩后 MAC 和消息
  4. 用接收方的公钥加密一次性会话密钥 Ks
  5. 把加密后的密钥和加密后的压缩邮件拼接,进行 Base-64 转换,发送给接收方

  接收方的操作与之前的类似

压缩
  PGP 在发送方签名后,加密前进行压缩,原因如下

  • 对未压缩的邮件进行签名有利于实现不可否认性,便于事后验证
  • 对压缩后的消息加密可以增强加密的安全性,长度较小且关键字段为乱码,增加了密文分析的难度

Base-64 转换
  Base-64 就是将二进制值转换为可打印的 65 个 ASCII 字符,每个字符对应 6 位二进制值,任何符号都可以转换成这个字符集中的字符,这个转换过程就叫做base64编码
索引和字符的对应

索引 对应字符
0-25 A-Z
26-51 a-z
52-61 0-9
62 +
63 /
64 = (填充)

Base-64 转换的具体过程
  首先将字符串(图片等)转换成二进制序列,然后按每 6 个二进制位为一组,分成若干组,如果不足 6 位,则低位补 0。每 6 位组成一个新的字节,高位补 00,构成一个新的二进制序列,最后根据 base64 索引表中的值找到对应的字符。

分段
  由于电子邮件对于邮件长度的限制,可以将邮件分段,分开发送,这个过程在 Base-64 转换后进行,其中签名和密钥等在拆分后的第一段中,接收方需要接受全部的拆分后小段,才能获得邮件内容

4.2.2 密钥管理

PGP 最重要的内容就是对于其密钥的管理

在整个 PGP 中共有几种密钥呢?
 PGP 使用了4种类型的密钥:会话密钥 Ks 、公钥、私钥、私钥加密口令

密钥类型 加密算法 用途
会话密钥 Ks IDEA 用于加密和解密传送的消息,一次有效,随机生成
公钥 RSA 用于加密一次性会话密钥,发送方和接收方共享
私钥 RSA 用于加密消息的散列值来生成签名,仅发送方使用
私钥加密口令 IDEA 仅在私钥环中加密私钥,进行私钥的保存

1. 一次性会话密钥

Ks:对称加密会话密钥 这是一个伪随机数密钥,产生方法如下:

  1. PGP 维护一个缓冲区,用于记录用户键入的时间、内容等从而生成一个真随机数
  2. 把这个真随机数作为随机数生成器 ( 基于随机数生成算法 ANSI X9.17 ) 的种子,生成会话密钥 Ks

2. 公钥管理的信任模式

公钥的传递有多种方式

  • 物理方式获取
  • 可信任的个体进行派发
  • 通过电话验证
  • 基于可信第三方的证书发放机制

  PGP 作为去中心化的分布式系统,显然不能利用信任 CA 机构的方法来进行公钥管理,这里 PGP 使用的是信任网络,我们先来介绍一下公钥管理的信任模式

1 直接信任
  直接信任是最简单的信任模式。在这个模式中,使用者因为知道一把密钥从哪里来而信任它是有效的。所有的密码系统在某种程度上都使用了这样的信任形式。例如在网页浏览器上,CA 机构的根证书直接被信任,这是因为它们被内置在了操作系统和浏览器中

2 信任链/信任树
  在信任链中,会有许多来自”根证书”所延伸出来的信任。这些证书也许为他们自己担保、或担保更低层的证书。你可比这样的情形想做是一个信任链。下游证书的真实性由签发它的证书的真实性而得到证明,直到直接由根证书所信任为止。在个体的角度来看,这是一条信任链,而从整体的角度去看,这其实是一个信任树

3 信任网络
  信任网络与以上两种模式不同,信任网络可以被看作是若干个直接信任所连接起来的网络。在信任网络中,你相信一个密钥是有效的,是因为你完全信任的人相信它是有效的。这个人被称为引荐者

六度分隔理论:世界上任何互不相识的两人,最多只需要六个中间人就能够建立起联系。

也就是说,信任一个素不相识的人的证书,途中的引荐人可能不超过六个

Phil Zimmermann 曾说:

随着时间过去,你累积到许多人的密钥,其中有些人你也许愿意签署信赖他们,别人也会签署一些他们自己信赖的他人密钥。每个人都逐渐累积到一些他人已签署信赖的密钥,然后自己再签署并散发出去。那么便能期待,下一个拿到这把密钥的人在签署名单上总有一两个是自己信赖的。这最终能形成所有公钥的分布式防弊的信赖网络。

  这就是信任网络的信任理念。当任何使用者使用了别人的公钥,他就会成为那把公钥的引荐者。当这样的程序被持续地进行着,就会形成一张信任网络

上图为 PGP 中信任模型的实例

对于公钥的有效性作出如下归纳

  • 完全信任的用户签名的公钥肯定有效
  • 部分信任的用户签名的公钥可能有效 (信任权值达到有效)
  • 不信任的用户签名的公钥无效
  • 未知用户签名的公钥无效

3. 密钥标识符

  因为每个用户会储存多个用户的公钥,当使用者接收到加密的消息时,如何选择正确的公钥成为了下一个问题,这里 PGP 引入了密钥标识符的概念
  简单来说,密钥标识符就是给每个公钥配备一个对应的公钥 ID,在进行信息交换时,讲公钥 ID 一起打包,发送给接收方,接收方收到消息后,通过公钥 ID 就能够找到对应的公钥,完成消息的接收
观察 PGP 消息的格式,看看密钥标识符的作用

  1. 接收方公钥 ID 是用来确认接收方,并让接收方使用自己的私钥来解密会话密钥,会话密钥是由接收方的公钥加密的
  2. 接收方必须先解密得到会话密钥,才能用会话密钥来解密整个消息
  3. 签名组件中包含有发送方的公钥 ID ,接收方得到这个 ID 后,在接收方的公钥环中进行查询,找到发送方的公钥 ID,从而解密得到原本的消息摘要

4. 密钥环

  PGP 引入了两种数据结构,分别是私钥环和公钥环,用来进行密钥的管理
私钥环 : 管理自己的私钥
公钥环 : 管理自己所拥有的他人的公钥
私钥环

时间戳 密钥 ID 公钥 加密的私钥 用户 ID
Time KUimod264 KUi E(KRi) UIDi

公钥环

时间戳 密钥 ID 公钥 拥有者信任 用户 ID 密钥合理性 签名 签名信任
Time KUimod264 KUi OnwerTrusti UIDi KeyTrusti Signi SignTrusti

  私钥的安全性对于 PGP 的安全性来说至关重要,用户的私钥加密存储在私钥环中,PGP 设计了安全的方法来加密并存储密钥

  1. 用户选择一个用于加密的私钥加密口令 ( passphrase )
  2. PGP 系统创建公钥/私钥对
  3. 用 Hash ( SHA-1 ) 算出口令的 128 位散列值,抛弃口令
  4. 以该 128 位散列值为密钥,用 CAST-128 加密私钥,储存在私钥环中,抛弃散列值

  当用户需要私钥时,输入口令,PGP 系统计算得到口令的散列值,并以散列值作为密钥来解密,得到用户的私钥
  若用户忘记了口令,则没有任何办法能得到私钥,明文口令和明文形式的私钥都不在 PGP 系统中存储,极大地保障了安全性

密钥环的使用
  签名信息: PGP 使用发送方的用户 ID 从私钥环中检索私钥;PGP 向用户请求口令短语,来恢复被加密的私钥,再用私钥进行对消息摘要的加密,完成签名。
  加密信息: PGP 产生一次性会话密钥并加密消息,用接收方的用户 ID 从公钥环中得到接收方的公钥,用接收方的公钥加密一次性会话密钥,和接收方的公钥 ID 一起,创建消息的会话密钥部分。
  解密消息: 接收方使用接收到的消息中的会话密钥部分中的密钥 ID 字段在私钥环中检索自己的私钥;PGP 提示接收方输入口令短语以恢复私钥;PGP 用私钥来恢复会话密钥并解密消息。
  认证消息: PGP 在消息的签名部分中获得发送者的密钥 ID,并用该 ID 在公钥环中检索发送者的公钥;PGP 恢复所传输的消息摘要;PGP 对接收到的消息计算消息摘要,并与接收到的消息摘要进行比较以实现认证。


下篇文章将介绍 PGP 的免费版本 GPG 的安装和使用,对于读者来说,要注重理解 PGP 的公钥管理,根据其分布式、去中心化的特点,构建起信任网络的概念,这样就能对 PGP 的安全机制有较好的了解

网络安全 第4章 安全电子邮件-PGP相关推荐

  1. 思科网络安全 第七章答案

    思科网络安全 第七章答案 哪种网络技术使用将所有流量(包括第 1 层错误)转发到分析设备的被动分流设备? 反馈 Refer to curriculum topic: 7.1.1 网络分流器是一种用于捕 ...

  2. 思科网络安全 第六章答案

    ** 思科网络安全 第六章答案 ** 计算机网络中的侦查跟踪攻击有什么用途? 反馈 Refer to curriculum topic: 6.2.2 阻止用户访问网络资源是一种拒绝服务攻击.侦查跟踪攻 ...

  3. 第四章 收发电子邮件

    文章目录 第四章 收发电子邮件 支持电子邮件协议 InterSystems IRIS如何表示`MIME`电子邮件 创建由单个部分组成的电子邮件 创建多部分电子邮件 指定电子邮件标题 指定基本电子邮件标 ...

  4. 《Outlook时间整理术》一第1章 在电子邮件泛滥狂潮中屹立

    本节书摘来异步社区<Outlook时间整理术>一书中的第1章,第1.1节,作者: [德]Lothar Seiwert , Holger Woeltje 译者: 欧阳宇,更多章节内容可以访问 ...

  5. 思科网络安全 第四章考试答案

    CCNA Cybersecurity Operations (版本 1.0) - CyberOps 第 4 章考试 GodLou的博客_CSDN博客-领域博主 1纽约的一所高中(学校 A)计划使用视频 ...

  6. 思科网络安全 第六章考试答案

    CCNA Cybersecurity Operations (版本 1.0) - CyberOps 第 6 章考试 GodLou的博客_CSDN博客-领域博主 1 为重获对邮件和数据服务器的控制,公司 ...

  7. 思科网络安全 第七章考试答案

    CCNA Cybersecurity Operations (版本 1.0) - CyberOps 第 7 章考试 GodLou的博客_CSDN博客-领域博主 1 该图显示的是嗅探器设备的图形界面.选 ...

  8. 网络安全 第3章 身份认证

    第3章 身份认证与访问控制技术-身份认证 3.1 单机身份认证 1. 基于静态口令的身份认证 静态的口令,一般不会改变 在初始化阶段,用户生成用户名和口令,系统将用户的用户名和口令进行哈希运算,将哈希 ...

  9. 思科网络安全 第五章考试答案

    CCNA Cybersecurity Operations (版本 1.0) - CyberOps 第 5 章考试 GodLou的博客_CSDN博客-领域博主 1 IPS 的作用是什么? 通过使用签名 ...

最新文章

  1. PCIE的事务类型:posted和non posted transaction
  2. python 接口自动化测试_python接口自动化测试之接口数据依赖
  3. Android无法运行AVD,android – 无法运行AVD(模拟器)
  4. 从Sun离职后,我“抛弃”了Java,拥抱JavaScript和Node
  5. wifi信号手机测试软件,专业的WiFi检测工具有哪些?如何解决wifi信号不好?
  6. 编程实战:如何管理代码里的常量
  7. java biz包 怎么写,关于java dao与biz分工探讨
  8. 使用mpx开发外卖小程序
  9. java day25【Junit单元测试 、反射 、 注解】
  10. bzoj 2743spoj DQUERY - D-query
  11. SQL2008卸载。
  12. 使用TinyPNG的API进行图片压缩
  13. 3个重点,20个函数分析,浅析FFmpeg转码过程
  14. 基于django的实验室网站管理平台设计与实现(二)
  15. 由于应用universal link 校验不通过 ios应用升级SDK 更换Universal Links校验
  16. 2016-2017 ACM-ICPC, Egyptian Collegiate Programming Contest (ECPC 16) 题解
  17. Centos校准时间
  18. ruby on rails validates uniqueness
  19. 类似微信群聊九宫格头像的算法实现
  20. 厉害!95后2万月薪程序员,背着电脑送外卖,途中还要改bug!

热门文章

  1. 论打造用户体验和数值系统,你得看看游戏类产品
  2. java 乘法保留两位小数,Java保留两位小数的方法
  3. 基于MATLAB的频率分析
  4. oracle里面asm的作用,Maclean介绍Oracle ASM基础概念和原理
  5. mysql 排它锁_Mysql共享锁、排他锁、悲观锁、乐观锁
  6. 玩qq游戏提示计算机内存不足,电脑玩游戏总提示内存不足怎么办
  7. 腾讯金融业务进退两难:依赖支付收入单一弊端渐显
  8. usb驱动开发7——接口描述符
  9. mysql中如何获取字段类型_MySQL获取字段类型的三种方式
  10. hive修改字段类型