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握手过程
客户端
服务端
client hello {支持的TLS版本、加密和压缩算法、随机数C}
server hello {支持的TLS版本、选择的加密和压缩算法、随机数S}
服务端证书
其他
server hello done
验证证书
pre_master随机数,使用server的公钥加密
change Cipher spec:使用协商的加密算法和秘钥加密信息
握手结束通知,使用协商的密钥和加密算法发送之前发送所有信息的哈希值。
使用pre_master、C和S生成密钥,解密哈希值验证消息。
change cipher spec:使用协商的加密算法和秘钥加密信息。
握手结束通知,发送加密的所有之前发送信息的哈希值
客户端
服务端
DH握手过程
客户端
服务端
client hello {支持的TLS版本、加密和压缩算法、随机数C}
使用私钥加密DH参数、客户端和服务端生成的随机数生成数字签名
server hello {支持的TLS版本、选择的加密和压缩算法、随机数S、数字签名}
验证数字签名
确认数字签名 { 客户端DH参数 }
计算会话密钥
计算会话密钥
change Cipher spec:通知后续使用协商的加密算法和秘钥加密信息
握手结束通知,使用协商的密钥和加密算法发送之前发送所有信息的哈希值。
change cipher spec:通知后续使用协商的加密算法和秘钥加密信息。
握手结束通知,发送加密的所有之前发送信息的哈希值
客户端
服务端
素性检验:如何生成一个大质数
**方法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算法是确定性算法。两者都是多项式时间复杂度。
|