这篇文章介绍一下 TLS 协议,TLS 有着 20 多年的历史,包括了很多种加密方式,下面通过学习对称加密原理和非对称加密原理对 TLS 协议加深理解。
1.TLS 设计的目的
- 身份验证
- 保密性
- 完整性
2.TLS/SSL 发展史及通用模型
3.TLS 协议
- Record 记录协议
- 对称加密
- Handshake 握手协议
- 验证通讯双方的身份
- 交换加解密的安全套件
- 协商加密参数
4.TLS 安全密码套件
- 密钥交换算法
- 身份验证算法
- 对称加密算法、强度、工作模式
- 签名 hash 算法
5.对称加密示意图
6.基于 XOR 的对称加密原理
6.1 XOR 真值表
6.2 基于 XOR 的加密示意图
6.3 基于 XOR 的加密示意图
6.4 填充明文
上述加密过程是按位 XOR 操作,这就要求密钥序列和明文序列的长度保持一致,下面介绍若明文序列和密钥序列长度不一致的填充方法:
- Block cipher 分组加密:将明文分成多个等长的 Block 模块,对每个模块分别加解密
- 目的:当最后一个明文 Block 模块长度不足时,需要填充
- 填充方法
- 位填充:比
bit
位为单位来填充 - 以字节为单位填充
7.对称加密工作模式
允许使用同一个分组密码密钥对多块数据加密,并且保证其安全性:
7.1 ECB(Electronic codebook)模式
- 直接将明文分解为多个块,对每个块独立加密
- 问题:无法隐藏数据特征(例如给一张图片加密之后图像特征可能还在)
7.2 CBC(Cipher-block chaining)模式
- 每个明文块先与前一个密文块异或后,再加密
- 问题:加密过程串行化
7.3 CTR(Counter)模式
- 通过递增一个加密计数器以产生连续的密钥流
- 问题:不能提供密文消息完整性校验(这个问题可以通过哈希函数校验码来解决)
7.4 GCM 模式
- GCM 是在 CTR 模式的基础上增加一个 MAC 哈希值来校验数据完整性的:
8.AES 加密算法
AES 加密算法是比利时密码学家 Joan Daemen 和 Vincent Rijmen 两位设计的,又称为 Rijndael 加密算法,常用的填充算法是 PKCS7,常用的分组工作模式是 GCM:
8.1 AES 的三种密钥长度
AES 分组的长度是 128 位(16 字节):
AES | 密钥长度(32位比特) | 分组长度(32位比特) | 加密轮数 |
AES-128 | 4 | 4 | 10 |
AES-192 | 6 | 4 | 12 |
AES-256 | 8 | 4 | 14 |
8.2 AES 加密步骤
- 把明文按照 128 bit(16 字节) 拆分成若干个明文块,每个明文块是 4*4 矩阵
- 按照选择的填充方式来填充最后一个明文块
- 每一个明文块利用 AES 加密器和密钥,加密成密文块
- 拼接所有的密文块,成为最终的密文结果
8.3 AES 加密流程
C = E(K,P),其中 E 为每一轮算法,每轮密钥皆不同:
- 初始轮
- AddRoundKey 轮密钥加
- 普通轮
- AddRoundKey 轮密钥加
- SubBytes 字节替代
- ShiftRows 行移位
- MixColumns 列混合
- 最终轮
- SubBytes 字节替代
- ShitRows 行移位
- AddRoundKey 轮密钥加