零基础了解Https - 前导知识(RSA)(2)

上面的前导知识简要介绍了一下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<e<φ(n),且e与φ(n)互质

乙就在1到3120之间,随机选择了17

因为e与φ(n)互质,根据求模反元素的公式计算e,对于e的模反元素d有:

ed ≡ 1(mod φ(n))

这个式子等价于

(ed-1)/φ(n)=k(k为任意正整数)

即

ed-kφ(n)=1,代入数据得:

17d-3120k=1

实质上就是对以上这个二元一次方程求解

得到一组解为:(d,k)=(2753,-15)

将n和e封装成公钥,n和d封装成私钥

n=3233,e=17,d=2753

所以公钥就是(3233,17),私钥就是(3233,2753)

其中,n的长度就是密钥长度,3233写成二进制是110010100001



一共有12位,所以这个密钥就是12位



实际应用中,RSA密钥一般是1024位,重要场合则为2048位

密钥组成与加解密公式

公钥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部分。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值