对称加密与非对称加密的变迁

2021年水的第一篇文章

HTTP明文分段

TCP将HTTP明文分段,最大段取决于Min(MTU,MSS)
MTU:最大传输单元(Maximum Transmission Unit,MTU)用来通知对方所能接受数据服务单元的最大尺寸,主要取决于物理环境(光纤、路由器、交换机、服务器等)。
MSS:TCP(Maximum Segment Size,最大报文长度),一般1500字节。再减去IP与TCP头部各20字节,所以一般1460字节。
SMSS = Min(MTU,MSS)

SMSS就是报文最大段

对称加密

TLS/SSL:对称加密与非对称加密_TLS/SSL

使用相同的密钥进行加密解密

对称加密是如何加密的

TLS/SSL:对称加密与非对称加密_TLS/SSL_02

对明文的二进制以密钥进行异或操作。

密钥:0110
明文:1010

client                     serve
密文 = 明文 ⊕ 密钥         明文 = 密文 ⊕ 密钥
       0110                      0110
        ⊕                        ⊕
       1010                      1100
        =                         =
       1100                      1010复制代码

填充 padding会将明文以密钥长度分段,但是最后一段可能小于密钥长度,需要填充

位填充:以bit位填充
密文:1101 1111 0010 1010 1101 1111 0110
明文:1101 0111 1100 1101 0000 0000 0000
4位bit一组,不足4位补1其余补0

字节填充:以字节填充(以两个16字节为一组)
密钥:AA AA AA AA AA AA AA AA AA AA AA AA AA AA
补零:DD DD DD DD DD DD DD DD DD 00 00 00 00 00  使用00补齐
ANSI X9.23:DD DD DD DD DD DD DD DD DD 00 00 00 00 05 00补齐,最后一位一共补几个就是几
ISO 10126:DD DD DD DD DD DD DD DD DD 86 86 A1 33 05 随机补齐,最后一位一共补几个就是几
PKCS7 (RFC5652):DD DD DD DD DD DD DD DD DD 05 05 05 05 05 总共补齐个数,都使用这个个数填充
PKCS7 (RFC5652)是主流方法

实际应用的对称加密算法需要很快的运算速度,加密解密明文在网络环境中传递数据。

对称加密的加密算法

ECB模式

明文 ⊕ 密钥直接加密解密
优点:可并发,速度很快
缺点:数据特征明显,只是简单的异或很容易破解
TLS/SSL:对称加密与非对称加密_TLS/SSL_03SMSS = 对于图片的加密数据特征明显,最后一个才是我们想要的

ECB模式

TLS/SSL:对称加密与非对称加密_对称加密_04

简简单单,明文按照密钥长度分段。最后明文与密钥异或操作形成密文。

优点:可并发,速度快

缺点:数据特征明显,容易破解

CBC模式

TLS/SSL:对称加密与非对称加密_TLS/SSL_05

1:明文分段
2:明文1与密钥异或加密生成密文1
3:密文1与明文2异或,再与密钥异或加密生成密文2
4:循环第三步,直至加密结束

优点:摸除了数据特征

缺点:串行执行,无法并发加密

CTR模式

TLS/SSL:对称加密与非对称加密_TLS/SSL_06

使用一个计数器Counter与密钥key先异或,再与明文加密生成密文

优点:摸除数据特征,可并发

缺点:无法校验数据完整性

MAC

这不是个加密算法,但是解决了数据完整性

client                             serve
        密文                                密文
                         
密钥    Hash算法       密文+MAC     密钥     Hash算法
        
        MAC                                MAC(client)===MAC(serve)复制代码

密文+密钥使用Hash算法生成MAC,服务端同样对密文+密钥使用Hash算法生成MAC。最后进行比对就能确认数据文字性。

GCM模式

TLS/SSL:对称加密与非对称加密_非对称加密_07

GCM=CTR+MAC组合

加密密文并行执行,计算MAC值会串行执行

iv:初始化向量,防止Hash碰撞发生

EK:对密钥与iv进行AES加密操作,使得每个明文的加密密钥都不同

Auth Data1:额外参数,端口号、IP地址等进一步保证数据安全性

mult(h):MAC算法加密

Tag:MAC操作后的标识

AES加密

TLS/SSL:对称加密与非对称加密_非对称加密_08

三种不同密钥长度,加密轮数

AES-128加密步骤

1,把明文按128bit(16字节)拆分为多个明文块,每个明文块就是44的矩形(AES-192是66,AES-256是8*8)
2,按照上面介绍的字节填充填充方式填充最后一个明文块
3,每一个明文块利用AES加密器和密钥,加密为密文块
4,拼接所有密文块,形成最终密文

明文块加密

TLS/SSL:对称加密与非对称加密_对称加密_09TLS/SSL:对称加密与非对称加密_非对称加密_10

AddRoundKey 轮密加密

TLS/SSL:对称加密与非对称加密_非对称加密_11

明文块a与密钥块k,进行异或XOR运算

密钥块k也不是原始秘钥而是经过秘钥扩展算法的

密钥扩展

TLS/SSL:对称加密与非对称加密_非对称加密_12

1,将密文块以列的形式组合成一个字符w(每个4字节,总共16字节)
2,形成字符w0,w1,w2,w3
3, w3进行g函数操作得到w'
4,w'与w0进行XOR运算得到w4,w4与w1进行XOR运算得到w5...
5,得到一组新的密钥,在拆分成密钥块

g函数

1,把输入的w拆分B0,B1,B2,B3,每个4字节
2,左移操作B1,B2,B3,B0
3, S盒替换为B4,B5,B6,B7
4,RC(j),0,0,0与B4,B5,B6,B7对应XOR加密
RC根据j值数组中获取:{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1B,0x36,}
5,输出w'

SubBytes 字节替换

TLS/SSL:对称加密与非对称加密_TLS/SSL_13

将加密文块已行列位置与S盒中替换

TLS/SSL:对称加密与非对称加密_非对称加密_14

ShiftRows 行位移

TLS/SSL:对称加密与非对称加密_非对称加密_15

每行根据行数-1,向左移位字节

MixColumns 列混合

TLS/SSL:对称加密与非对称加密_非对称加密_16

矩阵

0E 0B 0D 09
09 0E 0B 0D
0D 09 0E 0B
0B 0D 09 0E复制代码

每列与矩阵中对应列的相乘

好了对称加密的介绍完了,之后问题是如何将对称加密的密钥安全的传输给客户端。

TLS/SSL:对称加密与非对称加密_对称加密_17

加密套件和client-random、service-random 的传输过程却是明文的。黑客可以获得client-random和service-random在进行计算获得密钥,对密文传递进行解密。

非对称加密

TLS/SSL:对称加密与非对称加密_对称加密_18

发布公私钥,私钥服务器保留。私钥解密只有公钥能解,公钥加密只有私钥能解。

加密解密过程

我们来看RSA算法就能理解非对称加密是如何加密解密的

1,随机两个不相等的质数p和q
2,计算p和q的乘积n,明文长度小于n
3,计算n的欧拉函数v
4,随机一个整数k,1<k<v,且k与v互质
5,计算k对v的模反元素
6,公钥 (k,n)
7,私钥 (d,n)

1,p , q
2,n = p * q
3,v = (p - 1)*(q - 1)
4,gcd(k,v) = 1
5,(d * k) % v = 1
6,(k,n)
7,(d,n)
密文C = M^k mode n
明文M = C^d mode n复制代码

在传递时公钥 (k,n)明文传递。即使黑客获取也无法用k倒推,而n则是p和q的乘积。只要n足够大就有大量的因数分解,难以获取p和q。

向前安全

黑客可以大量保存你的数据包,当你的私钥被泄漏或破解时就可以对以往的数据进行解密。

这就有了ECDHE利用椭圆函数与离散对数进行计算临时密钥,哪怕密钥被攻破也只是一段时间内的数据包被解密。这样也就有了向前安全性

这块加密方式u1s1我没读懂,应该是我数学能力不够。

andrea.corbellini.name/2015/05/17/…

在RSA中可以看到非对称加密使用大量的乘法与mod取余运算,相比于对称加密的XOR运算对于大量数据来说是很耗时的。

混合加密

RSA混合加密

TLS/SSL:对称加密与非对称加密_对称加密_19

1,客户端生成Client Random随机数,将加密套件列表等数据发送给服务端
2,服务端生成Server Random随机数,将加密套件和数字证书发送给客户端
3,客户端校验证书,从中获取RSA私钥
4,随机生成pre-master随机数,利用RSA公钥加密发送给服务端。
黑客没有私钥无法解密改数据,也就无法获得pre-master随机数。
5,客户端与服务端利用pre-master、Client Random和Server Random生成对称加密所用的master sercret
6,用master sercret加密传递数据复制代码

ECDHE混合加密

TLS/SSL:对称加密与非对称加密_非对称加密_20

1,客户端生成Client Random随机数,将加密套件列表等数据发送给服务端
2,服务端生成Server Random随机数和Server Params,将加密套件和数字证书发送给客户端
3,客户端校验证书,验证通过生成Client Params发送给服务端
4,用Server Params和Client Params通过ECDHE生成pre-master随机数。
5,客户端与服务端利用pre-master、Client Random和Server Random生成对称加密所用的master sercret
6,用master sercret加密传递数据复制代码

TLS1.3的变化

TLS1.3删除了许多不安全的算法

  • 伪随机数函数由 PRF 升级为 HKDF(HMAC-based Extract-and-Expand Key Derivation Function);
  • 明确禁止在记录协议里使用压缩;废除了 RC4、DES 对称加密算法;
  • 废除了 ECB、CBC 等传统分组模式;废除了 MD5、SHA1、SHA-224 摘要算法;
  • 废除了 RSA、DH 密钥交换算法和许多命名曲线。

删除的原因是中间人攻击,修改加密套件列表删除加密性强的加密方法只留下指定的加密方法。TLS/SSL:对称加密与非对称加密_TLS/SSL_21

同时也优化了ECDHE的握手速度,减少了2次RTT时间TLS/SSL:对称加密与非对称加密_非对称加密_22

除了标准的“1-RTT”握手,TLS1.3 还引入了“0-RTT”握手

1-RTT

session

保存当前master secret密钥信息在服务端,客户端保存session信息。当再次握手时通过校验服务端session信息是否存在,存在直接使用。

问题:负载均衡时确保所有服务器的session存储的一致,session存储在服务器中消耗内存

ticket

使用票据,服务端利用私钥加密密钥给客户端保存。当再次握手时传递ticket,服务端私钥解密ticket获得master secret。

所有服务器的秘钥基本能确保一直,且ticket由客户端存储。

0-RTT

ticket传递时同时添加http资源请求。

重放攻击

如果0-RTT的数据包被拦截了,黑客可以一直使用这个数据包,无需解密就能一直修改你服务器中的数据。

所以session、ticket和0-RTT都要设置一个合理的过期时间。

证书

有了这么复杂的加密算法为什么还需要CA证书。当黑客DNS污染,将IP地址引导到自己的服务器,那么后续操作都是在他的服务器上操作的,也就不存在破解加密算法的问题。

所有需要CA证书验证目标网络的正确性。

数字证书组成:CA信息、公钥信息、公钥、权威机构的数字签名、有效日期

  • 校验有效日期
  • 将CA信息用Hash生成Hash值,用CA机构的秘钥加密生成加密信息A。验证时将CA证书中的CA信息用相同的Hash生成Hash值,用CA的公钥解密加密信息A,对比两个哈希值是否相同
  • CA证书中还有一个证书链,从Root CA、Issure CA、自身CA。Root CA内嵌与浏览器与操作系统中。

问题: 参考文档,建议按顺序阅读。