公钥密码原理及RSA密码

公钥密码

相对于对称密码,对称密码中,加密解密的密钥相同,因此要向接收者配送密钥,即密钥配送问题。公钥密码则不需要,因为公钥密码有公钥和私钥


密钥配送问题

简而言之,运用对称密码时,配送密钥时密钥有可能被窃听者拿到,而如果不配送密钥,解密者无法解密。如何把密钥安全地送到解密者手上,这就是密钥配送问题
一些方法

1.事先共享密钥

在送密文之前就先以安全方式共享密钥。但此方法受空间距离和人数规模限制,越远越不好共享,人越多越不好共享

2.密钥分配中心

Key Distribution Center, KDC.密钥分配中心先生成一个通信密钥,每一个需要加密通信的人只要和密钥分配中心事先共享密钥即可。密钥分配中心可以是一台服务器,一台计算机等载体。
加密通信流程:
1.A,B有各自的密钥,从KDC取得
2.A发起对B通信请求,KDC收到请求,伪随机数生成器生成临时密钥
3.KDC用A密钥加密临时密钥发给A,用B密钥加密临时密钥发给B
4.A,B各自收到加密后临时密钥,各自用自己的密钥解密,然后用临时密钥加密邮件,发送给B,B用临时密钥解密密文
5.删除临时密钥

局限性:一旦KDC故障,整个用户整体的加密通信直接瘫痪;如果用户整体中有窃听者并且通过技术手段盗取了密钥数据库,则整个用户整体的加密通信直接告破。

3.Diffie-Hellman密钥交换

加密通信双方需要交换一些信息,双方可以生成相同密钥,但窃听者无法生成相同密钥,后面详讲

4.公钥密码

加密密钥和解密密钥不同,发送者发送密文和加密密钥给接收者,但只有接收者有解密密钥,因此窃听者即使窃听到了也无法解密

什么是公钥密码

密钥分加密密钥和解密密钥,发送者用加密密钥加密,接收者用解密密钥解密
解密密钥从一开始就是接收者本人保管
加密密钥一般是直接公开,因此称之为公钥
解密密钥绝对不可公开,称之为私钥
公钥和私钥一一对应,一对公钥私钥称之为密钥对,两个密钥之间有强烈的数学关系,因此无法独立生成某一个密钥

公钥加密流程

A,B进行加密通话,由接收者B启动
1.B生成密钥对,发送公钥给A
2.A用公钥加密发回给B
3.B用私钥解密

非对称密码=公钥密码
私钥=个人密钥=私有密钥=非公开密钥=私有秘密密钥

公钥密码无法解决的问题

1.判断所得公钥是否合法,被称为公钥认证问题。
2.处理速度只有对称密码的几百分之一






了解RSA算法前的准备工作

mod运算

除法求余运算,用mod定义,类比时钟转的运算

加法

9点转15刻度:(9+15)/12=2余2 即时钟转到两点
上式写成:26mod12=2,读作26与2以12为模同余

减法

由于时钟不能逆时针转,所以要转模-已转刻度,转回0刻度
比如时针在8,则需要转12-8=4小时来回到0刻度

乘法

约等于加法

除法(重点)

研究倒数存在问题
在mod12 条件下,是否每一个数都有对应的倒数?
0不存在,0乘任何数都是0
1存在,1×1 mod 12=1
2不存在,2作乘法一定只会是偶数
3也不存在,列表可知
4同2
经过列表研究,发现在mod 12条件里,1,5,7,11是存在倒数的

其规律就在于:在mod 12条件下,存在倒数的数,和12的公约数只有1,即该数与模互质
所以要判断一个数在某个模下是否有倒数,就看该数和模是否互质

乘方

7的四次方 mod 12=7×7×7×7 mod 12
这里我们分开来mod
即((7×7 mod 12)×(7×7 mod 12))mod 12
在中间步骤进行mod运算,正是RSA加密解密算法中所使用方法

对数运算

时钟运算中的对数称为离散对数,运算量很大,在Diffile-Hellman密钥交换协议和ElGamal公钥算法中运用到,此处不细讲

从时钟到RSA

要理解上面的乘方,乘方运算就是RSA核心





RSA

RSA加密算法:
密文=明文的E次方 mod N
RSA解密算法
明文=密文的D次方 mod N
E和N的组合就是公钥
D和N的组合就是私钥

生成密钥对

求E,D,N三个数就是生成密钥对的过程
步骤
1.求N
2.求L(只在生成密钥对过程中使用的数)
3.求E
4.求D

1.求N

准备两个很大的质数p和q,为了防止被简单破译因此用大的
生成方法:伪随机数生成器生成后判断是否为质数
N=p×q

求L

L是p-1和q-1的最小公倍数(least common multiple简称lcm)
L=lcm(p-1,q-1)

求E

E是一个比1大比L小的数,此外,E和L的最大公约数(greatest common multiple简称gcm)
则有
1<E<L
gcd(E,L)=1
通过伪随机数生成器再1<E<L范围内找数,判断第二个条件
最大公约数用辗转相除法求
gcd(E,L)=1是为了保证一定存在解密时需要的D(上面除法那里说的倒数存在条件)

求D

1<D<L
E×D mod L=1

经历上述几步,我们求到了D,N,E。EN构成公钥,DN构成私钥

例题:BUUCTF RSA
在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17
求解出d作为flga提交

思路:
N=pq
L=(p-1)
(q-1)

17*D mod L=1
p = 473398607161
q = 4511491
e = 17

N = 2135733555619387051
L = 2135733082216268400

脚本:
import gmpy2
p = 473398607161
q = 4511491
e = 17

N = 2135733555619387051
L = 2135733082216268400

D=gmpy2.invert(e,L)
print(D)

答案:flag{125631357777427553}

posted @ 2021-03-06 16:53  ChristopherWu  阅读(416)  评论(0编辑  收藏  举报