这是《图解密码技术》的读书笔记

一些概念

  • 对称密码 (symmetric cryptography)
  • 公钥密码 (public-key cryptography)
  • 单向散列函数 (one-way hash function)
  • 消息认证码 (message authentication code)
  • 数字签名 (digital signature)

32305584-58c5ab08-bf44-11e7-9063-e9dee5a6bd60.png

接下来会对上述概念进行简单讲解

0. 经典密码

0.1 凯撒密码 (Caesar cipher)

凯撒密码是一种替换加密技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。

如偏移量是向后3位时,明文 DOG 就被加密为 GRJ,将字母表向前3位即可解密。

凯撒密码非常容易被暴力破解,而且在实际应用中也无法保证通信安全。

0.2 简单替换密码

简单替换加密是一种以偏移(如凯撒密码)或逆转或更复杂方式改变字母表上的字母顺序,并以此顺序书写的加密方式 。

如将字母表 ABCDEFGHIJKLMNOPQRSTUVWXYZ 改变顺序为 ZEBRASCDFGHIJKLMNOPQTUVWXY 即可把明文 flee at once. we are discovered! 加密并省略掉标点成 SIAA ZQ LKBA VA ZOA RFPBLUAOAR

简单替换加密一般不容易被暴力破解但可通过频率分析进行破解

1. 对称密码

对称密码又称共享密钥密码,用相同的密钥进行加密和解密,如下图

Powered by Powerpoint :)

1.1 一次性密码本

一次性密码本 (one time pad) 是一种将明文与密钥 (一串比特序列) 进行异或 (XOR) 运算获得密文,密文与密钥进行异或运算获得明文的加密算法。

在理论上此密码算法是牢不可破的,但实际操作起来有如下问题

  • 密钥需要是真随机产生的
  • 明文与密钥需要一样长
  • 密钥仅能使用一次,用完需要销毁

1.2 DES

DES (Data Encryption Standard) 是一种将 64 比特的明文加密成 64 比特的密文分组对称密码算法。其密钥长度是 64 比特,但由于每隔 7 比特会设置一个错误检查比特,所以实际上真正的加密密钥只有 56 比特。虽然 DES 因为只有 56 比特的密钥长度而广受批评,但它还是对现代密码学产生了长远影响。

DES 是分组密码的一种,当要加密的明文比 64 比特长时就需要对明文分组进行加密,分组的方式称为模式 (mode)。

DES 由 Horst Feistel 设计,其基本结构为 Feistel 网络。在 Feistel 网络中,加密的步骤称为 (round),整个加密过程就是进行若干轮的循环。DES 是一种 16 轮循环的 Feistel 网络。

一轮的步骤:

  • 将输入的数据均分为左右两部分
  • 右测直接成为该次运算输出的右侧
  • 将右侧输入至轮函数 f
  • 轮函数 f 根据右侧和子密钥计算出一串比特序列
  • 将上一步的得到的比特序列与左侧进行 XOR 运算,并将结果作为加密后的左侧输出

因为 右侧 没有被加密,所以需要将左右两侧交换进行下一轮的运算,

Feistel 网络的特性:

  • 轮数可以任意添加
  • 加密和解密可以用完全相同的结构来实现

1.3 三重 DES

因为 DES 已经可以在较短的时间内被暴力破解,所以出现了 三重 DES 来应对这个问题,但处理速度较慢,安全性方面也没太大改善,所以已经不推荐使用。

三重 DES 的加密方式:

(图反了)

wKiom1hStybR6nRgAABzM1_8bWA892.png

由于明文经过三次 DES 处理才会生成最终密文,所以三重 DES 的长度就由 56 比特变成了 56*3=168 比特。

三重 DES 并不是顺序的三次加密的叠加,而是加密-解密-加密的方式,这样做是为了向后兼容解密,当所有密钥都一样时,三重 DES 就等同于普通 DES 了。

三重 DES 解密的过程则与加密相反,以密钥 3 、密钥 2 和密钥 1 以 解密-加密-解密的方式进行解密

wKioL1hSupqweE1JAACDK9OtHAc865.png

1.4 AES

AES (Advanced Encryption Standard) 是用来替代原先的 DES,已经被多方分析且广为全世界所使用。

AES 的分块大小为 128 比特,而密钥长度则可以从 128,192 或 256 之间进行选择。

AES 更多的相关介绍可移步维基百科

2 分组密码的模式

DES 和 AES 都属于分组密码,分组密码自身只能加密长度等于密码分组长度的单块数据,若要加密变长数据,则数据必须先被划分为一些单独的密码块。通常而言,最后一块数据也需要使用合适填充方式将数据扩展到匹配密码块大小的长度。一种工作模式描述了加密每一数据块的过程,并常常使用基于一个通常称为初始化向量的附加输入值以进行随机化,以保证安全。

2.1 初始化向量

初始化向量是一个固定长度的输入值,一般是情况下是一个随机数。

初始化向量与密钥相比有不同的安全性需求,所以初始化向量通常无须保密。

2.2 填充

分组密码只能对确定长度的数据块进行处理,而明文的长度通常是可变的。因此部分模式需要最后一块在加密前进行填充。

2.3 电子密码本模式 (ECB)

最简单的加密模式,将需要加密的消息按照分组密码的分组大小划分为若干分组,对每一组进行独立加密。

2.4 密文分组链接模式 (CBC)

在 CBC 模式中,每个明文块先与前一个密文块进行异或后,再进行加密。在这种方法中,每个密文块都依赖于它前面的所有明文块。同时,为了保证每条消息的唯一性,在第一个块中需要使用初始化向量。

2.5 密文反馈模式 (CFB)

在 CFB 模式中,前一个密文分组会被送回密码算法的输入端,即密文反馈

通过上图不难看出,在 CFB 模式中明文分组并没有通过密码来进行直接加密,实际上, CFB 模式与一次性密码本 (流密码) 很相似,都是将明文与随机比特序列进行 XOR 运算来得到密文,但由于分组密码的随机比特序列并不是真的随机数所以并不像一次性密码本那样具有不可破译性。

2.6 输出反馈模式 (OFB)

在 OFB 模式中,密码算法的输出会反馈到密码算法的输入中。

由于密文分组不依赖上一次加密的输出,所以 OFB 模式可以并行加密和解密。

2.7 计数器模式 (CTR)

在 CTR 模式中,每个分组对应一个逐次累加的计数器,并通过对计数器进行加密来生成密钥流。最终的密文是通过将计数器加密得到的比特序列,与明文分组进行 XOR 而得到的。

CTR 模式和 OFB 模式一样,加密和解密使用了完全相同的结构,因此在程序实现上比较容易。CTR 模式中可以任意顺序对分组进行加密和解密,因此在加密和解密时需要用到的计数器的值可以直接计算出来,这一性质是 OFB 模式所不具备的。能够以任意顺序处理分组,就意味着能够实现并行计算,在支持并行计算的系统中,CTR 模式的速度是非常快的。

2.8 分组密码模式比较

3. 公钥密码

公钥密码 (public-key cryptography) 又称非对称密码,其密钥分为公钥和私钥两种,一般用公钥进行加密私钥进行解密。公钥和私钥一一对应构成密钥对 (key pair)。比较著名的公钥密码有 RSA椭圆曲线数字签名算法

对称密钥存在配送问题

使用公钥密码则可以解决配送问题

但公钥密码也有其缺点

  • 加密速度要远低于对称加密
  • 容易收到中间人攻击

4. 混合密码系统

混合密码通过结合对称密码,公钥密码和伪随机数生成器三种技术能比较好地利用对称密码和公钥密码的优点。

hybrid_encrypt.png

5. 单向散列函数

单向散列函数可以用来确保信息的完整性,避免消息被篡改。

单向散列函数有一个输入和输出,输入为消息,输出则为散列值 (hash value)

5.1 单向散列函数的特性

  • 根据任意长度的消息计算出固定长度的散列值,譬如 SHA-1 计算出的散列值永远都是 160 比特
  • 只要消息有 1 比特的变更,最后的散列值也会有巨大差异
  • 散列值是单向的,无法单凭散列值计算出消息
  • 计算散列值的速度较快

5.2 单向散列函数无法解决的问题

通过运用单向散列函数可以保证消息是否被篡改,但无法辨别出消息是否是伪造的

6. 消息认证码

使用消息认证码除了可以确认消息没有被篡改以外还可以判定消息是否是伪造。

6.1 使用单向散列函数实现消息认证码

即 HMAC ,可选用任意高强度散列函数来实现

6.2 使用分组密码实现消息认证码

由于消息认证码不需要解密,所以可以使用分组密码的密钥作为消息认证码的共享密钥,选用 CBC 模式对消息进行加密,并取最后一个分组作为消息认证码的值即可。

6.3 消息认证码不能解决的问题

消息认证码可以对消息进行认证和确认完整性识别出消息的篡改和伪装,但并不能解决第三方认证防止否认问题,即接收者无法向第三方证明消息是由发送者发送而非自身生成。

7. 数字签名

跟公钥密码使用公钥加密私钥解密的方式相反,数字证书是使用私钥加密公钥解密。

密钥使用方式.png

数字签名只是用来标识身份的一种手段,并非为了保证机密性。

7.1 消息认证码与数字签名

消息认证码与数字签名.png

7.2 数字签名不能解决的问题

用数字签名可以识别出篡改和伪装,还可以防止否认。也就是说数字签名同时实现了确认消息的完整性、进行认证和防止否认。

然而,要正确使用数字签名,前提是用于验证签名的公钥必须属于真正的发送者

于是就陷入了一个死循环,用数字签名来确保消息没有被篡改、伪装和拒绝否认,但要能用上数字签名就又必须拿到正确的公钥来确认发送者不是伪装的。

8. 公钥证书

公钥证书 (Public-Key Certificate) 用来证明公钥拥有者的身份,文件包含了公钥信息、拥有者身份以及证书认证机构对这份文件的数字签名,以确保这个文件的整体内容正确。

CA.png

CA 证书具有信任链特性,由根证书为起点,透过层层信任,凭借对签发机构的信任,相信持有信任链终端的证书持有者为即为其人。

9. 传输层安全性协议

传输层安全性协议 (Transport Layer Security, TLS) 及其前身安全套接层 (Secure Socket Layer, SSL) 是一种安全协议,目的是为互联网通信提供安全及数据完整性保障,是当前互联网保密通信的工业标准。

TLS 使用非对称加密(即公钥证书)进行身份认证,接而交换对称密钥作为会谈密钥来对双方通信交换的数据进行加密,保证两个通信的保密性和可靠性。

10. 最后

本文只是简单地对书中一些概念进行了描述,并没有较深入地对单一个概念进行剖析,如果大家感兴趣可以自行借阅《图解密码技术》。