HTTPS常用的密钥交换算法有两种,分别是RSA和ECDHE算法。
其中,RSA是比较传统的密钥交换算法,它不具备前向安全的性质,因此现在很少服务器使用它。而ECDHE算法具有前向安全,所以被广泛使用。
离散对数
ECDHE秘要协商算法是DH算法严禁过来的,所以我们先从DH算法说起。
DH算法是非对称算法,因此它可以用于秘钥交换,该算法的核心数学思想是离散对数。
离散对数是【离散+对数】的两个数学概念的组合。对数和指数互为反函数。
对数运算的取值是可以连续的,而离散对数的取值是不能连续的,因此也以【离散】得名。
离散对数是在对数运算的基础上加了模运算,也就是取余数,对应编程语言的操作符是%,也可以用mod表示。如下所示:
其中,如果对于一个整数b和质数p的一个原根a,可以找到一个唯一的指数i,使得:
a^i (mod p) = b
成立,那么指数i称为b的以a为底的模p的离散对数。其中,底数a和模数p是离散对数的公共参数,也就是说是公开的,b是真数,i是对数。知道了对数,就可以用上面的公式计算出真数。但反过来,知道真数却很难推算出对数。
特别是当模数p是一个很大的指数,即使知道底数a和真数b,在现有的计算机的计算水平是几乎无法算出离散对数的,这就是DH算法的数学基础。
DH算法
认识了离散对数,我们来看看DH算法是如何密钥交换的。
现假设小红和小明约定使用DH算法来交换密钥,那么基于离散对数,小红和小明需要先确定模数和底数作为算法的参数,这两个参数是公开的,用P和G来代替。
然后小红和小明各自生成一个随机整数作为私钥,双方的私钥要各自严格保管,不能泄漏,小红的私钥用a代替,小明的私钥用b代替。
现在小红和小明双方都有了P和G以及各自的私钥,于是就可以计算出公钥:
- 小红的公钥记作A,A = G^a(mod P);
- 小明的公钥记作B,B = G^b(mod P);
A和B也是公开的,因为根据离散对数的原理,从真数(A和B)反向计算a和b是非常困难的,至少在现有计算机的计算能力是无法破解的。
双方交换各自DH公钥后,小红手上共有5个数:P/G/a/A/B,小明手上也同样共有5个数:P/G/b/B/A。
然后执行运算:
小红:K=B^a mod p
小明: