SSL/TLS握手过程可以根据秘钥生成的方式不同分为RSA握手过程和DH握手过程,分别使用RSA非对称加密方法和DH秘钥交换算法生成客户端和服务端共享的秘钥。
基础知识
RSA 非对称加密算法的原理
欧拉函数
欧拉函数用来计算对于给定的正整数
n
n
n,在小于等于
n
n
n的元素之中有多少个元素与其互质。其解析式如下:
ϕ
(
p
k
)
=
p
k
−
p
k
−
1
\phi(p^k) = p^k - p^{k - 1}
ϕ(pk)=pk−pk−1
如果
n
n
n为质数,则
ϕ
(
n
)
=
n
−
1
\phi(n) = n - 1
ϕ(n)=n−1;
如果
n
n
n可以分解为两个互质的整数
p
p
p和
q
q
q之积,则
ϕ
(
n
)
=
ϕ
(
p
)
ϕ
(
q
)
\phi(n) = \phi(p)\phi(q)
ϕ(n)=ϕ(p)ϕ(q)。
欧拉定理
如果两个正整数
a
a
a和
n
n
n互质,则
n
n
n的欧拉函数可以让如下等式成立:
a
ϕ
(
n
)
≡
1
(
m
o
d
n
)
a^{\phi(n)} \equiv 1(mod\ n)
aϕ(n)≡1(mod n)
模反元素
如果
a
a
a和
n
n
n互质,则一定存在元素
b
b
b,使得如下等式成立:
a
b
≡
1
(
m
o
d
n
)
ab \equiv 1(mod\ n)
ab≡1(mod n)
称
b
b
b为
a
a
a的模反元素。
RSA密钥生成过程
- 选取两个不相等的质数 p p p和 q q q;
- 计算 n = p q n = pq n=pq的欧拉函数 ϕ ( n ) = ϕ ( p q ) = ϕ ( p ) ϕ ( q ) = ( p − 1 ) ( q − 1 ) \phi(n) = \phi(pq)=\phi(p)\phi(q) = (p - 1)(q-1) ϕ(n)=ϕ(pq)=ϕ(p)ϕ(q)=(p−1)(q−1)
- 随机选择一个整数
e
e
e,并计算其对于
ϕ
(
n
)
\phi(n)
ϕ(n)的模反元素
d
d
d,则
(
n
,
e
)
(n,e)
(n,e)作为公钥,
(
n
,
d
)
(n,d)
(n,d)作为私钥,其他数字
p
,
q
,
n
,
ϕ
(
n
)
p,q,n,\phi(n)
p,q,n,ϕ(n)不公开。
如果一个攻击者在得知公钥的情况下获取私钥,需要根据 n , e n,e n,e计算出 d d d。
因为 d d d是 e e e关于 ϕ ( n ) \phi(n) ϕ(n)的模反元素,因而计算 d d d需要知道 ϕ ( n ) \phi(n) ϕ(n),而计算 ϕ ( n ) \phi(n) ϕ(n)则需要找到两个质数 p p p和 q q q,因为 ϕ ( n ) = ( p − 1 ) ( q − 1 ) \phi(n) = (p-1)(q-1) ϕ(n)=(p−1)(q−1)。而对于大整数的因数分解过程是非常耗时的,只有暴力一种解法。因而RSA算法被认为是安全的。
DH密钥交换算法的原理
DH秘钥交换算法涉及到离散对数的知识。选取两个大数 p p p和 g g g并公开,其中 p p p是一个质数, g g g是 p p p的模 p p p本原单位根,则DH密钥交换算法的流程为:
- Alice随机选择一个整数 a a a,计算 K a = a g m o d p Ka=a^g\ mod\ p Ka=ag mod p并将其发送给Bob;
- Bob随机算则一个证书 b b b,计算 K b = b g m o d p Kb=b^g\ mod\ p Kb=bg mod p并将其发送给Alice;
- Allice和Bob开始通过已知的信息计算密钥。Alice计算密钥 k e y = a × K b m o d p = a × b g m o d p = ( a b ) g m o d p key=a\times Kb\ mod\ p=a\times b^g\ mod p = (ab)^g\ mod\ p key=a×Kb mod p=a×bg modp=(ab)g mod p,Bob计算密钥 k e y = b × K a m o d p = b × a g m o d p = ( b a ) g m o d p = ( a b ) g m o d p key=b\times Ka\ mod\ p= b\times a^g\ mod\ p = (ba) ^ g\ mod\ p = (ab) ^g\ mod\ p key=b×Ka mod p=b×ag mod p=(ba)g mod p=(ab)g mod p,所以Alice和Bob计算出的密钥相同。
基于以下原因:
已知 a a a,计算 b = a g m o d p b = a^g\ mod\ p b=ag mod p容易,但是在已知 b , g , p b,g,p b,g,p的情况下计算a很难(很难的意思是计算出结果需要很长很长时间)。函数 f ( x ) = x g m o d p f(x)=x^g\ mod\ p f(x)=xg mod p在密码学中被称为陷门函数,因为已知 x x x算 f ( x ) f(x) f(x)简单,但是已知 f ( x ) f(x) f(x)算 x x x很难。
假设有一个中间人Eve通过窃听得到了 p , g , K a , K b p,g,Ka,Kb p,g,Ka,Kb,要想求得Alice和Bob协商得到的密钥 k e y key key,其必须求得 a a a或 b b b才能算出密钥,因而 k e y key key被认为是安全的,除了Alice和Bob外没人能知道。
RSA握手过程
DH握手过程
素性检验:如何生成一个大质数
方法1: 筛法。判断整数
n
n
n是否为素数的方法是
n
m
o
d
i
=
0
,
i
∈
[
2
,
n
)
n\ mod\ i = 0, i \in [2, \sqrt{n})
n mod i=0,i∈[2,n),即从2开始遍历直到
n
\sqrt{n}
n,如果没有整数能被
n
n
n整除则认为
n
n
n是素数。
方法2: 利用费马小定理。费马小定理的内容为:
假设 a a a是整数, n n n是一个质数,则有如下条件成立:
a n − 1 ≡ 1 ( m o d n ) a^{n-1} \equiv 1(mod\ n) an−1≡1(mod n)
费马小定理是判断一个数是否为质数的充分条件,即存在合数满足费马小定理,这些合数被称为迈克尔数。最小的迈克尔数为561。
利用费马小定理检验素数的方法被称为费马素性检验。费马素性检验是指通过多选择几个整数,如果满足费马小定理则
n
n
n是素数的可能性会很大。费马素性检验是概率性算法。
米勒—拉宾算法和AKS算法利用费马小定理进行素性检验。其中米勒—拉宾算法是概率性算法,在实际生活中应用较多,而AKS算法是确定性算法。两者都是多项式时间复杂度。