学习笔记:
下面这个文章介绍非常好,特总结如下:
Web技术(三):TLS 1.2/1.3 加密原理(AES-GCM + ECDHE-ECDSA/RSA)_流云IoT的博客-CSDN博客_tls加密算法
现代密码学根据密钥不同,可以分为对称密钥加密法和非对称密钥加密法;
类别 | 对称密钥加密法 | 非对称密钥加密法 |
---|---|---|
特点 | 加密和解密使用相同的的密钥 | 加密和解密使用成对的公钥和私钥, 可以使用公钥解密私钥解密(信息加密), 也可以使用私钥加密公钥解密(数字签名) |
优点 | 加密和解密的效率高(比非对称加密效率高几百倍),适合大数据量加解密 | 不需要交换密钥,安全性更强,还可用于身份认证 |
缺点 | 双方需要交换密钥,密钥的安全无法保证 | 加密和解密的效率低(只有对称加密效率的几百分之一),不适合大数据量加解密 |
常用算法 | DES、3DES、IDEA、AES | RSA、DSA、ECC、Diffie-Hellman |
TLS 通过非对称密钥加密法来交换会话密钥,通过对称密钥加密法来加密信息。
对称密钥加密法,按照加密方式不同可以将对称密码分为两大类:
- 序列密码(流密码)
- 分组密码(块密码)
类别 | 序列密码 / 流密码 | 分组密码 / 块密码 |
---|---|---|
特点 | 以最小单位比特作为一次加解密的操作元素,采用设计好的算法对明文数据流进行加密与解密操作 | 将明文分为若干长度固定的组块(长度不足的组块按特定格式填充),以每个组块作为一次加解密的操作元素,采用设计好的算法对明文数据组块进行加密与解密操作 |
优点 | 速度快,便于硬件实现,错误传播较轻 | 统计特性优良,修改敏感 |
缺点 | 统计混乱不足,修改不敏感 | 速度慢,错误传播严重 |
常用算法 | WEP、RC4、ChaCha20 | DES、3DES、IDEA、AES |
流密码算法安全性的关键也在于绝不第二次使用相同的密钥,这就需要能产生大量的随机数。流密码使用伪随机数发生器产生一次性密钥流,可以说流密码的安全性取决于伪随机数发生器的性能,高性能的伪随机数发生器(一个硬件模块)也可以构建出强度较高的流密码算法。
我们一般使用的计算机并没有专门提供高性能的伪随机数发生器硬件模块,所以使用流密码算法的比较少(流密码算法便于硬件实现,一般在专门设计有伪随机数发生器的平台上使用),更常用的是分组密码算法。
分组密码模式
常见的有五种模式ECB、CBC、CFB、OFB、CTR。这五种分组密码模式就不一一介绍了,这里主要介绍两种常用的模式:CBC(Cipher Block Chaining mode)和CTR(Counter mode),二者的主要区别对比如下:
类别 | CBC(Cipher Block Chaining mode) | CTR(Counter mode) |
---|---|---|
特点 | 首先将明文分组与前一个密文分组进行XOR异或运算,然后再进行加密;加密第一个分组时,使用一个随机产生的初始化向量 IV(Initialization Vector)来代替前一个密文分组 | 每个分组对应一个逐次累加的计数器,并通过对计数器加密生成分组密码;最终的密文分组是通过将计数器加密得到的密钥流与明文分组进行XOR异或运算得到的 |
优点 | 明文的重复排列不会反映在密文中,支持并行解密 | 支持并行 |
缺点 | 加密不支持并行运算,密文分组包含某些错误比特时会影响后续所有的分组解密 | 主动攻击者反转密文分组中的某些比特时会引起明文分组对应比特位的反转 |
在早期的TLS / SSL版本中主要使用 AES CBC 进行信息加密,后来 AES CTR 支持并行加解密的优势逐渐凸显,被TLS 1.2 及之后的版本选用,TLS / SSL 各版本支持的信息加密算法如下:
TLS 1.3版本增强安全性的同时对协议进行了简化,删除了对不安全加密算法的支持,对于分组密码只支持
- AES GCM(Galois-MAC + CTR Mode)
- AES CCM(CBC-MAC + CTR Mode )
- 这两种加密算法实际上都是AES CTR,只是在此基础上增加了MAC(Message Authentication Code)用来验证数据完整性。
HASH和MAC的区别联系:
- Hash散列值可以实现数据完整性检查,能够辨别出“篡改”;但无法辨别出“伪装”。
- 假如将消息密文与对应的散列值一起发送,攻击者可以同时修改密文和对应的散列值,接收端仍然能通过消息完整性校验。
- 怎么才能保证Hash散列值不被篡改呢?一个简单的思路就是对散列值进行加密后发送,使用密钥加密后的散列值称为消息认证码(Message Authentication Code)。
- 密文与对应的MAC一起发送,由于攻击者不知道密钥,即便修改密文也没法生成合法的MAC,也就能保证散列值不被篡改(前提是密钥没泄露),接收方可以同时辨识出数据的“篡改”和“伪装”。
因此:
消息认证码MAC有两个输入数据:消息和密钥,
- 输入的消息可以是明文也可以是密文
- 输入的密钥可以是分组密码、流密码、公钥密码等
- MAC算法中至少包含一种散列算法以便获取消息的散列值
根据选用的输入密钥Key类型和MAC算法,消息认证码MAC可以有不同的实现方式,比如:
- HMAC(Hash-MAC):使用SHA-2之类的单向Hash函数实现,根据使用散列函数的不同可细分为HMAC-MD5、HMAC-SHA1、HMAC-SHA256/384等;
- CMAC(CBC-MAC):使用AES之类的分组密码实现,并采用CBC模式将消息全部加密,由于CBC模式最后一个分组会受到整个消息和密钥的双重影响,因此可以将它用作MAC;
- GMAC(Galois-MAC):使用AES之类的分组密码实现,但与CMAC不同的是,GMAC在计算散列值时使用了Galois有限域的加法和乘法运算,可以充分利用并行处理获得更高的效率;
- Poly1305:使用ChaCha20之类的流密码实现;
AEAD很明显不需要HASH算法去产生MAC值,而是靠加密算法来产生。
TLS 1.3仅支持AEAD来校验数据完整性。
AEAD(Authenticated Encryption with Associated Data)**全称关联数据认证加密,认证加密是一种将对称密码加密和消息认证码相结合,同时满足机密性、完整性和认证功能的机制。
AEAD包含对称加密和MAC计算两部分,根据二者的先后顺序可以将AEAD分为:
- Encrypt-then-MAC
- Encrypt-and-MAC
- MAC-then-Encrypt
AEAD是对称加密算法与MAC计算的组合
TLS 1.3 支持的AEAD算法有三种:AES-CCM、AES-GCM、ChaCha20-Poly1305。
AEAD算法 | AEAD方法 | 优缺点对比 | 使用场景举例 |
---|---|---|---|
AES-CCM (AES-CTR + CBC-MAC) | Encrypt-and-MAC | 受限于CBC模式特性,不能充分发挥并行处理的优势 | TLS 1.2/1.3、IPsec、WLAN WPA2、BT LE等 |
AES-GCM (AES-CTR + Galois-MAC) | Encrypt-then-MAC | 可以充分利用并行处理提高效率 | TLS 1.2/1.3、IPsec、WLAN WPA3、SSH等 |
下面简单介绍下GCM认证加密过程:
附上HASH算法: