RSA非对称加密
非对称加密机制
![](https://img.haomeiwen.com/i1510669/7d53c071c660ea4c.png)
只有Bob 持有私钥,而且只有Bob 才能解密,Alice也不行
伪代码
key_pair->{Kpub,Kpri}
Y=E(Kpub,X);
X=D(Kpri,Y);
密钥对 key_pair
加密:输入公钥Kpub、明文X 产生 密文 Y
解密:输入私钥Kpri,密文Y 产生 明文X
一般要求
![](https://img.haomeiwen.com/i1510669/19409a848f5e860d.png)
安全要求
![](https://img.haomeiwen.com/i1510669/e9687bd0870ea0ff.png)
详解RSA加密过程
RSA加解密算介绍
1、1977年MIT 的 Rivest-Shamir-Adleman 三位提出的,并以他们的首字母命名。
2、一直沿用至今,成为被广泛接受且被实现的通用公钥加密算法
RSA以整数域的指数运算、模运算为主,以分组为单位进行加密
C=P^e mod n
P=C^d mod n
其中,值{e,n} 组成公钥,值{d,n} 组成私钥
P代表明文,C代表密文 ,
加密过程:对明文P 计算e次方,然后对n 求模,余数就是密文;
解密过程:对密文C 求d次方,然后对n 求模,然后余数就是明文
RSA 加解密- 小数演示
例如选择下面的几个数
e=7 , d=23,n=187
加密过程
c(m=88)=m^e mod n=88^7 mod 187=11
解密过程
m(c=11)=c^d mod n=11^23 mod 187=88
m 为明文88 ; 11就是加密的结果 也就是 密文;
![](https://img.haomeiwen.com/i1510669/588bf1010a6c0ce6.png)
![](https://img.haomeiwen.com/i1510669/365605b9817f596d.png)
![](https://img.haomeiwen.com/i1510669/ac8b546377b8a2c3.png)
欧拉定理(费马欧拉定理)
![](https://img.haomeiwen.com/i1510669/1b2e88d3d12ab906.png)
反过来求 p 和 q 很难
![](https://img.haomeiwen.com/i1510669/d7f94b68f0a1a505.png)
目前只有1,5 两个与6互质, 也可以通过 计算出 Q(6)=(2-1)*(3-2)=2个
![](https://img.haomeiwen.com/i1510669/06560d3e8a299efe.png)
(xe)d (mod n)=x^(tQ(n)+1) mod n=((xQ(n))t)*x mod n= (1^t) *x
(22)2=2(2*2)=24=16
因为x^Q(n) mod n---1
RSA算法实现
![](https://img.haomeiwen.com/i1510669/37dffdfb1bfd73c2.png)
1000位 或者更大位
实践生产中 使用的是快速模幂算法
java 中提供了 modPow
快速幂取模的modPow方法
![](https://img.haomeiwen.com/i1510669/4f9e8fe7b5cf924d.png)
BigInteger p,e,n;
//c=p^e mod n
BigInteger c=p.modPow(e,n);
密钥生成的宏观描述
RSA算法中涉及的数{n,p,q,e,d} 来自密钥生成
![](https://img.haomeiwen.com/i1510669/3383cb6024b67908.png)
选择2个大质数
![](https://img.haomeiwen.com/i1510669/1b0266fd6ba3a0fb.png)
目前还没有好的方法验证是不是质数
根据数论的知识,平均每个Logn 就会有一个质数
排除掉偶数之后,大概有 logn 二分之一 这么多次
比如我们要招 2^1024 之前的质数, 那么要尝试 log2^1024 除以 2 大概要360次的尝试
找两次 找 到 p 和 q 两个大的质数
RSA示例演示
![](https://img.haomeiwen.com/i1510669/180973ab2d476897.png)
欧拉定理 :
Q(n)=(p-1)(q-1)=160
Q(187)=(17-1)(11-1)=1610=160
![](https://img.haomeiwen.com/i1510669/97ede799c58d9aac.png)
实际上,通常直接选择e=65537=2^16+1
gcd 就是 求最大公约数的方法
通常是 e=65537 = 2^16+1
确定d
![](https://img.haomeiwen.com/i1510669/65f2d87d2c78bd64.png)
![](https://img.haomeiwen.com/i1510669/045b4c2c861fb5ee.png)
因为 fai n 和 e 是互质,所以gcd(fai n ,e) 也等于1
![](https://img.haomeiwen.com/i1510669/c6ba79963d9c77d5.png)
fai n 、e 已知量
t、d 看做未知量
必等式,一定存在整数 x ,y 使得
ax+by=gcd(a,b)
已知a,b 对他们进行辗转相除 可以得到他们的最大公约数
在欧几里得里面只用到了 余数
在扩展欧几里得算法,还利用了代余除法得到的商
在辗转相除的时候就能得到必等式的x,y
扩展欧几里得算法可以得到模板元素
求出模板元素是RSA 加密运算中 产生公私钥必须的步骤
有关扩展欧几里得具体实现 可以参考 提供的详细资料
![](https://img.haomeiwen.com/i1510669/f37e9c4dc67caea1.png)
扩展欧几里得算法 ext_gcd可以直接求出 t、d 的值
t 可以忽略 我们不需要,d的值是我们想要的
ext_gcd演算 扩展欧几里得算法演算
![](https://img.haomeiwen.com/i1510669/3c9aa14c51a63d91.png)
![](https://img.haomeiwen.com/i1510669/3f5c52591a4f3f06.png)
![](https://img.haomeiwen.com/i1510669/01aa5d9268a51a03.png)
第一行是被除数
第二行是除数
第一行的 ri 的 160 就是 Q(n)
第二行 e 就是 ri 的 7
第一行 第二行的 t 和d 分别写做 1 0 , 0 1 因为还没有开始计算
第一行被除数的系数 t 就是 1
第二行 除数的系统d 就是 1
第一次计算
![](https://img.haomeiwen.com/i1510669/d476808f7b925853.png)
![](https://img.haomeiwen.com/i1510669/bdebda36e62b9714.png)
为什么6 要写在除数里面呢,因为这是欧几里得的辗转相除法,上一步的余数就是下一步的除数,交换辗转相除
160%7=22 余数6
t 的计算方法
x[i]=x[i-2]-q[i]*x[i-1]
当前值=倒数两个的值- qi倒数一个的值
1=1-220=1
t[i]=t[i-2]-q[i]t[i-1]=1-220=1
第三行 qi=22 t[i-1]=0 t[i-2]=1
d 的计算方法
x[i]=x[i-2]-q[i]*x[i-1]
当前值=倒数两个的值- qi倒数一个的值
1=0-221=-22
d[i]=d[i-2]-q[i]d[i-1]=0-221=-22
第三行 qi=22 d[i-1]=1 t[i-2]=0
第二次计算
![](https://img.haomeiwen.com/i1510669/4152e22c60aca71c.png)
r[i-1]%r[i]
7%6=1 余数 1
第二次t 的计算方法
q[i]=q[2]=1
x[i]=x[i-2]-q[i]*x[i-1]
当前值=倒数两个的值- qi倒数一个的值
-1=0-11=-1
t[i]=t[i-2]-q[i]t[i-1]=0-11=-1
第四行也就是q[2], q[i]=1 t[i-1]=1 t[i-2]=0
第二次d 的计算方法
q[i]=q[2]=1
x[i]=x[i-2]-q[i]*x[i-1]
当前值=倒数两个的值- qi倒数一个的值
23=1-1(-22)=23
d[i]=d[i-2]-q[i]d[i-1]=1-1(-22)=23
第四行 qi=1 d[i-1]=-22 t[i-2]=0
结果
![](https://img.haomeiwen.com/i1510669/c80475df769f3a1b.png)
验证一下
![](https://img.haomeiwen.com/i1510669/92a833d051a0425b.png)
实际生成中
![](https://img.haomeiwen.com/i1510669/12509b6cd373d386.png)
![](https://img.haomeiwen.com/i1510669/1fcc91bdf0da8eba.png)
modInverse(模反计算)
![](https://img.haomeiwen.com/i1510669/fcc3f2e6716b4abf.png)
e就是 7 phi 是 160 7.modInverse(160)
计算结果表格
![](https://img.haomeiwen.com/i1510669/4c5e9468acb8e030.png)
公钥加密
![](https://img.haomeiwen.com/i1510669/c823b0d07a318b4a.png)
m=88 n=187 m 是消息正文
私钥解密
![](https://img.haomeiwen.com/i1510669/72d8ed5c029c9056.png)
c=11 n=187
RSA安全性浅析
1、逆计算不可行
基于详细 x^e(mod n) 是单向函数
2、破解密钥很困难
已知公钥{n,e}求{d} 只能试图分解n=pq难度巨大
如果是n 是2千位的大数,一般认为是几百年的时间是不够的
![](https://img.haomeiwen.com/i1510669/78a466d67a983588.png)
这里是一个 168位的数字,谁能看出来他是谁和谁的乘积?
![](https://img.haomeiwen.com/i1510669/7787dd82e889dd7d.png)
实际中 比这个数还要大很多很多
RSA安全性
RSA生产使用的安全建议:
1、在一般的场合下,使用1024位及以上的密钥
2、在高级别安全场景下,使用2048位及以上的密钥