面中金问到,记录下:
知识梳理系列之六——HTTPS握手过程
使用RSA加密算法的HTTPS握手过程
1. 先梳理下RSA算法:
了解下素数、互素、欧拉公式、费马小定理:
- 如果一个正整数只能被自身和1整除,那么这个数是素数(或者称为质数);
- 如果两个或两个以上的正整数的公因数只有1,那么称这些数互素(或者称为互质);
- 已知两个素数P1、P2,它们的乘积: n = P 1 × P 2 ; n = P1 \times P2; n=P1×P2;欧拉公式: 欧拉函数的值是所有小于或等于n的正整数中与n互质的数的个数。 Φ ( n ) = ( P 1 − 1 ) ⋅ ( P 2 − 1 ) ; \Phi(n) = (P1-1) \cdot (P2-1); Φ(n)=(P1−1)⋅(P2−1);
- 费马小定理:假如m是一个整数,n是一个质数,那么 mn- m 是n的倍数,可以表示为:
m n ≡ m ( m o d n ) 或 m ( n − 1 ) ≡ 1 ( m o d n ) 又 ∵ n 是 质 数 , ∴ ( n − 1 ) = Φ ( n ) m Φ ( n ) ≡ 1 ( m o d n ) \begin{aligned} & m^n \equiv m \ (mod \quad n) \\ & 或 \ m^{(n-1)} \equiv 1 \ (mod \quad n) \\ & 又\because n是质数,\therefore (n-1) = \Phi(n) \\ & m^{\Phi(n)} \equiv 1 \ (mod \quad n) \\ \end{aligned} mn≡m (modn)或 m(n−1)≡1 (modn)又∵n是质数,∴(n−1)=Φ(n)mΦ(n)≡1 (modn)- 同余表示,数a模n(a除以n取余)与数b模n相等
∵ a ≡ b ( m o d n ) ⇔ a ( m o d n ) ≡ b ∴ m Φ ( n ) ( m o d n ) ≡ 1 \begin{aligned} & \because a \equiv b \ (mod \quad n) \Leftrightarrow a \ (mod \quad n) \equiv b\\ & \therefore m^{\Phi(n)} \ (mod \quad n) \equiv 1 \end{aligned} ∵a≡b (modn)⇔a (modn)≡b∴mΦ(n) (modn)≡1
使用费马小定理就可以进行计算解密的密钥,RSA正是使用这种原理:
已知两个素数P1、P2,计算出n= P1 * P2;φ(n) = (P1-1)(P2-1);并取一个与φ(n)互质的数e;
待加密的数据为m,使用幂运算和模运算对其加密,并传输密文:
p
r
e
M
a
s
t
e
r
K
e
y
=
m
e
(
m
o
d
n
)
preMasterKey = m^e \ (mod \quad n)
preMasterKey=me (modn)
收到密文进行解密:
p
r
e
M
a
s
t
e
r
K
e
y
d
(
m
o
d
n
)
=
m
preMasterKey^d \ (mod \quad n) = m
preMasterKeyd (modn)=m
此时未知d(它就是解密的私钥),计算它的结果就可以解密:
将
p
r
e
M
a
s
t
e
r
K
e
y
带
入
:
[
m
e
(
m
o
d
n
)
]
d
(
m
o
d
n
)
≡
m
;
m
e
∗
d
(
m
o
d
n
)
≡
m
;
.
.
.
.
.
.
.
.
.
.
.
.
.
.
(
1
)
∵
m
Φ
(
n
)
(
m
o
d
n
)
≡
1
,
1
k
≡
1
;
∴
m
k
×
Φ
(
n
)
(
m
o
d
n
)
≡
1
;
两
边
同
乘
以
m
,
得
:
m
k
×
Φ
(
n
)
+
1
(
m
o
d
n
)
≡
m
;
.
.
.
.
.
.
.
(
2
)
由
(
1
)
、
(
2
)
得
:
k
×
Φ
(
n
)
+
1
=
e
×
d
∴
d
=
[
k
×
Φ
(
n
)
+
1
]
÷
e
\begin{aligned} & 将preMasterKey带入: \\ & [m^e \ (mod \quad n)]^d \ (mod \quad n) \equiv m; \\ & m^{e*d} \ (mod \quad n) \equiv m; ..............{(1)}\\ & \because m^{\Phi(n)} \ (mod \quad n) \equiv 1, 1^k \equiv 1; \\ & \therefore m^{k \times \Phi(n)} \ (mod \quad n) \equiv 1; \\ & 两边同乘以m,得:\\ & m^{k \times \Phi(n) + 1} \ (mod \quad n) \equiv m; .......{(2)}\\ & 由(1)、(2)得:\\ & k \times \Phi(n) + 1 = e \times d\\ & \therefore d = [k \times \Phi(n) + 1] \div e \end{aligned}
将preMasterKey带入:[me (modn)]d (modn)≡m;me∗d (modn)≡m;..............(1)∵mΦ(n) (modn)≡1,1k≡1;∴mk×Φ(n) (modn)≡1;两边同乘以m,得:mk×Φ(n)+1 (modn)≡m;.......(2)由(1)、(2)得:k×Φ(n)+1=e×d∴d=[k×Φ(n)+1]÷e
上面求出了解密私钥
2. 在结合流程图说明握手过程:
图片来源:阮一峰的网络日志
http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html
如有侵权请联系删除
握手步骤
1.Client Hello: 客户端向服务器发起握手,客户端产生了一个随机数R1,传递给服务器;
2. Server Hello: 服务器收到R1,也产生一个随机数R2,并且携带服务器证书回复给客户端;
3. 客户端验证服务器证书,并从中取出公钥(n, e),随后产生一个随机数m,使用公钥加密:
p
r
e
M
a
s
t
e
r
K
e
y
=
m
e
(
m
o
d
n
)
preMasterKey = m^e \ (mod \quad n)
preMasterKey=me (modn) 然后将preMasterKey 发送给服务器;
4. 服务器收到preMasterKey ,使用私钥
d
=
[
k
×
Φ
(
n
)
+
1
]
÷
e
d = [k \times \Phi(n) + 1] \div e
d=[k×Φ(n)+1]÷e 解密出客户端数据m;
5. 最后由R1、R2、m生成session key.
可以看出第三方窃听者可以获取R1、R2、preMasterKey三个数据,但是需要通过preMasterKey解密出m,一旦公钥数据长度足够长,要破解出其中的两个质数P1、P2是困难的,因此保证了加密的安全性,但是这个安全性全部寄托在一个数据上。
使用DH加密算法的HTTPS握手过程
为了更加安全使用Diffie-Hellman算法,替换RSA算法来进行HTTPS握手。
1. Diffie-Hellman算法的原理见——知识梳理系列之四——网络协议(TCP/IP、Http/Https)中的附:有趣的加密原理(Diffie-Hellman算法)
2. 下面是握手过程,与RSA的差别是,不再直接传输preMasterKey,而是传输计算它的中间参数,最终计算出相同的preMasterKey。
图片来源:阮一峰的网络日志
http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html
如有侵权请联系删除