上面的前导知识简要介绍了一下tcp,现在开始应用层协议部分前导知识介绍。
Https 全称是Http over SSL,因此Https是建立在Http的基础上,加了一层安全套接层。Https既然被称为安全的Http协议,怎么实现安全的,那就是加密算法。
加密方法有三种方法:
1.摘要算法:常用的有MD5、SHA,这种加密方式是不可逆的,没法解密,很多网站的用户名和密码就这么干的,比如用MD5加密之后保存在数据库,用户输入用户名和密码提交,再通过MD5加密之后,和数据库保存数据匹配。前几年出现了一些用户名密码泄露事件,当某些网站采用明文保存用户名和密码被泄露出来之后,立马有人把这些数据拿到其他网站去撞库。安全性方面不一定很好。
2.对称加密:通过同一个秘钥加密和解密,典型的是凯撒加密,比如ABCD加密之后变成BCDE,很容易知道是加了1,优点是运算快速,缺点是只有一个秘钥泄露,通信双方都不再安全。
3.非对称加密:最大的特点是通信双方的秘钥都不一样,加密的秘钥只能加密不能解密,只有解密者的秘钥可以解密。最典型的是RSA算法,几乎是现在互联网安全的基石,RSA是其发明人Ron Rivest、Adi Shamir、Leonard Adleman的名字取首字母组合起来的。
下面重点介绍一下RSA算法原理
RSA算法
在RSA诞生之前,也就是1976年之前,加密和解密使用的是同一种规则。
1.甲方选择某一种加密规则,对信息进行加密;
2.乙方使用同一种规则,对信息进行解密。
虽然理论上,只要加解密“规则”(即“密钥”)足够复杂,这种方式也可安全的传递信息,但这种方法最大的弱点就是,密钥在传递的过程中易被泄露。这种加密方式也就是前面提到的对称加密算法。
倘若在加解密信息的过程中,能让加密密钥(公钥)与解密密钥(私钥)不同,即
1.甲要传密信给乙,乙先根据某种算法得出本次与甲通信的公钥与私钥;
2.乙将公钥传给甲(公钥可以让任何人知道,即使泄露也没有任何关系);
3.甲使用乙传给的公钥加密要发送的信息原文m,发送给乙密文c;
4.乙使用自己的私钥解密密文c,得到信息原文m .
这种新的加密方式就是非对称加密算法。
RSA算法涉及到的数学概念挺多的,过程也挺复杂的,下面简单介绍一下:
质数:一个大于1的自然数,除了1和它本身外,不能被其他自然数整除(除0以外)的数称之为质数(素数)
互质数:公约数只有1的两个数,叫做互质数。
判断互质数的定理很多,这里只取需要用到的两条
1.任意两个质数一定构成互质数(如3与11、53与61);
2.大数是质数的两个数一定是互质数(如97与88);
模运算
让m去被n整除,只取所得的余数作为结果,就叫做模运算。
同余
给定一个正整数m,如果两个整数a和b满足a-b能被m整除,即(a-b)mod m=0,
那么就称整数a与b对模m同余,记作a≡b(mod m),同时可成立a mod m=b
欧拉函数
任意给定正整数n,计算在小于等于n的正整数之中,有多少个与n构成互质关系?
计算这个值的方法就叫做欧拉函数,以φ(n)表示.
比如,在1到8之中,与8形成互质关系的是1、3、5、7,所以φ(n)=4,在一些概念中也会提到简化剩余系,欧拉函数推到的过程中会用到,有兴趣可以搜索一下欧拉函数的推导过程,推荐搜索别人视频,自己看,可能会有点困难。
在RSA算法中,我们需要明白欧拉函数对以下定理成立
1.如果n可以分解成两个互质的整数之积,即n=p×q,则有:φ(n)=φ(pq)=φ(p)φ(q);
2.根据“大数是质数的两个数一定是互质数”可以知道:
一个数如果是质数,则小于它的所有正整数与它都是互质数;
所以如果一个数p是质数,则有:φ(p)=p-1
所谓“大数”,也就是较大的那个数。
由上易得,若我们知道一个数n可以分解为两个质数p和q的乘积,则有
φ(n)=(p-1)(q-1)
欧拉定理
如果两个正整数a和n互质,则n的欧拉函数φ(n)可以让下面的等式成立:
a^φ(n) ≡ 1(mod n)
模反元素
根据欧拉定理,有:
a^φ(n) = a × a^(φ(n)−1) ≡ 1(mod n)
令b = a^φ(n)-1,得:
ab ≡ 1(mod n)
b就是a的模反元素
意即,如果两个正整数a和n互质,那么一定可以找到整数b
使得ab-1被n整除,或者说ab被n除的余数是1
给个真实的例子
根据以上介绍的定义和数学知识
先来看一个真实的例子加深印象
假设甲要发送一串秘密数字m=65给乙
乙发送了一个公钥(n,e)=(3233,17)给甲
甲根据以下公式及公钥对密文m加密成c
m^e ≡ c(mod n)
代入得
c=m^e mod n=6517 mod 3233 = 2790
甲将使用公钥加密的密文c=2790发送给乙
乙收到c=2790的密文后,使用私钥(n,d)=(3233,2753)根据以下公式进行解密
c^d = m(mod n)
代入得
m = c^d mod n= 27902753 mod 3233=65
乙使用与公钥不同的私钥成功计算出密文m,发现了吗?
从始至终,用来解密的私钥(n,d)=(3233,2753)一直都在乙处,从未泄露
乙给甲的仅仅是用来加密的公钥(3233,17)
这个公钥并不能用来解密,即使被他人截获,也没有任何泄密的风险
那么,乙是如何计算出给甲的公钥(3233,17)和私钥(3233,2753)的呢?
计算密钥 , 根据以上“真实的例子”,看看乙是如何计算密钥(公钥和私钥)的
随机选择两个不相等的质数p和q(乙选择了61和53)
计算p和q的乘积n=p×q=61×53=3233
根据本文“欧拉函数”介绍过的公式
φ(n)=(p-1)(q-1)
代入计算n的欧拉函数值
φ(3233)=(61-1)×(53-1)=60×52=3120
随机选择一个整数e,条件是1
密钥组成与加解密公式
公钥KU |
n:质数p和质数q的乘积(p和q必须保密) e:与(p-1)×(q-1)互质 |
私钥KR |
n:同公钥n d:e^-1(mod(p-1)(q-1)) |
加密 |
c = m^e mod n |
解密 |
m = c^d mod n |
加密公式
m^e ≡ c (mod n)
这里的c就是我们的密文。
解密公式
c^d ≡ m (mod n)
我们会很奇怪,为什么通过这两个公式可以刚好加密和解密呢
公式证明
我们的加密公式是:
m^e ≡ c (mod n)
我们的解密公式是:
c^d ≡ m (mod n)
根据上面的规则,c可以这么表达:
c = m^e - kn
把c代入我们的解密方程:
(m^e - kn)^d ≡ m (mod n)
因为这是一个同余等式,等号左边加减n都不会影响等式,所以我们可以把等式简化为
m^ed ≡ m (mod n)
当我们在求d的时候有同余等式:
ed ≡ 1 (mod φ(n))
这个等式也可以写成这个样子:
ed = h * φ(n) + 1
代入刚刚简化后的等式:
m^(hφ(n)+1) ≡ m (mod n)
到这里,只要我们能够证明这个等式是成立的,那么就能够证明我们的加密和解密公式是成立的,这里就有两种情况了:
m和n是互质的关系
欧拉定理:如果两个正整数a和n互质,则n的欧拉函数 φ(n) 可以让下面的等式成立:
a^φ(n) ≡ 1 (mod n)
我们把m和n代入公式可以得到:
m^φ(n) ≡ 1 (mod n)
因为m和n互质,那么以下等式依然成立:
(m^φ(n))h * m ≡ m (mod n)
对指数稍微换算一下就能得到我们之前的等式了,m和n互质的情况下,我们很容易就能证明之前的等式成立。
m和n不是互质的关系
首先我们有n = p * q,因为m和n不是互质的,而因为n是两个质数相乘的结果,也就是说p或者q就是m和n的一个公约数,所以有m = p * k,或者m = q * k。假设p是m和n的公约数,那么就有m = p * k。
然后因为p和q都是质数,质数和除了是自己倍数之外的数都互质,又因为m必须小于n,所以这里k取值必然不能是q或者更大的数,所以我们有一个结论是:k必然和q互质。
k * p必然和q互质,把k * p和q代入,所以我们能够得出以下同余等式:
(kp)^φ(q) ≡ 1 (mod q)
因为k * p和q互质,所以可以有:
(kp)^(h * φ(q) + 1) ≡ kp (mod q)
而我们之前已经求出:
ed = h * φ(n) + 1
代入刚刚的式子:
kp^ed ≡ kp (mod q)
假设有t,使得求模运算可以写成:
kp^ed = t * q + k * p
转换一下等式:
kp^(ed - 1) = t * q
因为p和q是互质关系,所以k * p只有当k等于q或者其倍数的时候,才能整除q,但是m = q * k,而且m < n,所以k * p必然是不能整除q的,由此可得p必然能够整除t才能使得等式成立,也就是有:t = t' * p,由此可得如下等式:
kp^ed = t' pq + kp
因为m = kp,而n = pq,所以:
m^ed = t'n + m
写成同余等式可得:
m^ed ≡ m (mod n)
这里就得出了我们刚刚求出的等式。
结论
到这里,我们已经证明了两种情况下等式都是成立了,也就是明文通过公钥加密之后,使用私钥也必然能够得到原本的结果,RSA算法也就成立了。
RSA中的对称性
其实你会发现,RSA里面,公钥加密的东西私钥能够解密,同样的,从公式中发现,私钥加密的东西公钥也能解密,这也是非常重要的一个特性。那么,为什么不能把({n, d})作为公钥给用户呢?因为({n, e})中,n是公开的,e基本都使用常数65537,所以很容易就被猜到了,因此,虽然在算法上都能加密和解密,但是只把({n, e})作为公钥,公钥和私钥有非常严格的区分。
当然非对称加密算法有好几种,这里只介绍RSA。前导知识介绍完了,下面才真正进入Https部分。