TLS握手和算法

团队文化:进取,分享,快乐,责任!

团队愿景:做最好的产品,打造有影响力的团队!

为建立以安全为目的的HTTP通道,HTTPS应运而生。HTTPS在HTTP通信建立连接的握手过程中多加了一次TLS握手,用于产生会话秘钥,用对称加密算法对会话的内容进行加密。

图解TLS握手过程

图中的女士Alise作为客户端向作为服务端的Bob发送请求,协商建立起HTTPS通话的过程:

HTTPS的握手过程

在TCP三次握手成功之后,开始建立TLS握手。这里我们主要分析HTTPS特别的一步,即TLS握手,主要分为三个阶段:参数协商、身份验证、密钥交换。具体过程如下:

关于TLS握手过程,每一步骤的主要含义是:

ClientHello:一次新的握手中的第一条消息,将客户端的功能和首选项传送给服务器。

ServerHello:将服务器选择的连接参数传送给客户端。

Certificate:典型用于携带服务器X.509证书链。服务器必须保证它发送的证书与选择的算法套件一致。Certificate消息可选,因为并非所有的套件都使用身份验证,并非所有的身份验证都需要证书。

ServerKeyExchange:携带秘钥交换的额外数据。

ServerHelloDone:表明服务器已经将所有预计的握手消息发送完毕,等待客户端发消息。

ClientKeyExchange:携带客户端为秘钥交换提供的所有信息。

ChangeCipherSpec:表明发送端已取得用以生成连接参数的足够信息,已生成加密密钥,并且将切换到加密模式。客户端和服务器都会在条件成熟时发送这个消息。

Finished:意味着握手已经完成,消息内容将加密,以便双方可以安全的交换验证整个握手完整性所需的数据。

TLS握手的结果

握手过程中协商了本次请求使用的加密套件,以及使用套件中的算法进行证书校验、身份验证、秘钥交换,再利用秘钥交换产生的预主秘钥,使用对称加密算法计算出会话秘钥。

下图是密码套件的具体构成,包含了上述的四个算法。

常用的密码套件有:

为了深入的了解TLS握手过程,需要搞清楚算法在这里起到了什么样的作用,下面选每一类算法里基础的算法进行分析,加密强度可能会比现在使用的算法强度低,但从原理的角度并不影响理解。

信息摘要算法

信息摘要算法和数字签名算法配合使用,用于证书加密和认真,首先理解一下这两个算法使用场景:

左半部分是服务端生成数字证书的过程:使用协商好的安全散列算法计算明文生成摘要,使用数字签名算法的私钥对证摘要加密,生成数字证书编号,和明文放在一起组成数字证书。

右半部分是客户端对数字证书认证的过程,客户端拿到数字证书后,一方面,使用协定的数字签名算法的公钥对证书编号解密,另一方面,再使用安全散列算法计算明文生成摘要,那这个摘要和解密处理的摘要比对,相等则认证通过,不相等则认证不通过。

下面首先讲一下,握手过程中用到的第一个算法,安全散列算法SHA1(Secure Hash Algorithm),对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要:

以上是对消息的完整的计算过程,大体上可以分为三步:一是对消息分组和填充,二是对每组数据计算,三是把计算的结果再进行分组处理,得到最终的160比特。

填充分组:把最长为264比特的消息进行填充,使其长度为512比特的倍数,然后每512比特为一组。

分组计算:把每组的512比特分解为16个32比特,再对这16个初始值W~W15,异或操作,生成W16~W79,一共80个值。计算过程如下:

分组处理:用一个初始值和第1组的结果进行分组处理,处理的结果再和第2组的结果分组处理,依次进行80步,这里的每一步的计算过程是:

在这个过程中,第一步的A,B,C,D,E是缓冲区初始值,和第一组的W~W79的值,根据不同的步骤计算规则,处理成一个新的A,B,C,D,E用于后续的计算。

复杂的异或过程,输入的明文中改变一位消息数据会使输出值大幅度变动,使SHA1算法呈现雪崩效应与不可逆性,保证了验证数据完整性与消息验证。

数字签名算法

数字签名算法以RSA为例:

加密解密的公式看起来很简单,但是这几个数字之前存在着质数的性质和欧拉函数的计算,可以保证

已知E,N,却很难推导出D:

因为E*D ≡ 1(modΦ(N)),由于N为两个素数的乘积,

所以E*D ≡ 1 (mod(p-1)(q-1))

所以,需要将N因数分解为p和q,只要N足够大(1024),很难将D计算出来。

密钥交换算法

以DH算法为例,在TLS握手的过程中,客户端和服务端会传递DH计算所需的参数:

发送的具体数字如下:

其中P和G是一对生成元。整个过程,可窃听的数字有,可窃听的数字:P、G、GAmodP、GBmodP,根据生成元的数学性质,通过GAmodP计算出A的有效算法到现在还没出现,没有A和B,要推算GA*BmodP很难。

DH算法解决的是,通过公共信道交换一个信息,就可以创建一个可以用于在公共信道上安全通信的共享密钥。这样,客户端和服务端拿到了生成会话密钥的关键数字预主密钥,再加上之前交换得到的客户端随机数和用户端随机数,各自计算出会话密钥,开始加密对话。

对称加密算法

相对于非对称加密算法,对称加密算法计算量小、加密速度快、加密效率高,所以在握手之后,在会话过程中使用的加密算法就是对称加密算法了。以AES_128算法为例,AES为分组密码,把明文分成一组一组的,每组长度为128位,不足128位的会使用补数据的规则补齐128位,分别对每一组加密,直到加密完整个明文。具体的计算过程如下:

计算过程中,每一组数据会把128位按字节处理,即16个字节,经历的10轮的计算,除了第10缺少一步列混合计算,每一轮计算都包括4个步骤:字节代换、行移位、列混合、轮秘钥加。下面分别介绍每个步骤:

字节代换:

AES定义了一个S盒和逆S盒,把状态元素中的每个元素映射为S盒中的一个新的值,替换掉原有的值。

行移位:

这是一个简单的左循环移位操作。

列混合:

与一个固定的矩阵相乘,得到一组新的矩阵,新的矩阵的第j列(0≤j≤3)的列混合计算如下所示:

轮秘钥加:

其中,密钥Ki中每个字W[4i],W[4i+1],W[4i+2],W[4i+3]为32位比特字,包含4个字节。轮密钥加过程可以看成是字逐位异或的结果,也可以看成字节级别或者位级别的操作。也就是说,可以看成S0 S1 S2 S3组成的32位字与W[4i]的异或运算,i为10轮计算中的第几轮。

初始秘钥产生的W[0],W[1],W[2],W[3]只用在第一轮之前的轮秘钥加操作中,后面10次轮秘钥加操作用到的W[4i]~ W[4i](i取值1到10)都是经过秘钥扩展算法产生的。如下所示:

其中,T是一个复杂的函数计算。

欢迎加群沟通:

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180810G12F2R00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券