最近在做题的时候发现好多密码题都会有RSA相关内容,包括比赛也是,这个东西既然那么重要,就简单地总结一下吧
RSA公开密钥密码体制的原理是:根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥
RSA算法主要由互质数和欧拉函数组成,分别简单地介绍一下:
如果两个正整数,除了1以外,没有其他公因子,我们就称这两个数是互质关系
在数论,对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目.
φ函数的值:
φ(x)=x(1-1/p(1))(1-1/p(2))(1-1/p(3))(1-1/p(4))…..(1-1/p(n)) 其中p(1),p(2)…p(n)为x
的所有质因数;x是正整数; φ(1)=1(唯一和1互质的数,且小于等于1)。注意:每种质因数只有一个。
例如:
φ(10)=10×(1-1/2)×(1-1/5)=4;
1 3 7 9
φ(30)=30×(1-1/2)×(1-1/3)×(1-1/5)=8;
φ(49)=49×(1-1/7)=42;
其中欧拉函数是RSA算法最重要的部分
跟欧拉函数相关的还有费马小定理
如果p是一个质数,而整数a不是p的倍数,则有a^(p-1)≡1(mod p)。
费马小定理通常用来检验一个数是否是素数,是素数的必要非充分条件。
然而满足费马小定理检验的数未必是素数,这种合数叫做卡迈克尔数
(1)先找出两个质数p,q,再计算公共模数n,利用欧拉函数计算φ(n),n=p*q,φ(n) =(p-1)*(q-1);
(2)任意选取一个大整数e,满足gcd(e,φ(n))=1;整数e用做加密钥(注意:e的选取是很容易的,例如,所有大于p和q的素数都可用);
(3)确定的解密钥d,满足(de)modφ(n)=1,即de=k*φ(n) +1,k>=1是一个任意的整数;所以,若知道e和φ(n) ,则很容易计算出d ;
(4)公开整数n和e,秘密保存d;
(5)将明文m(m<n是一个整数)加密成密文c,加密算法为 c=E(m)=pow(m,e)*mod n
(6)将密文c解密为明文m,解密算法为:m=D(c)=pow(c,d)*mod n;
然而只根据n和e(注意:不是p和q)要计算出d是不可能的。因此,任何人都可对明文进行加密,但只有授权用户(知道d)才可对密文解密 。
RSA在密码学中的应用:
1.RSA的选择密码攻击
所谓“选择密文攻击”,就是密码分析者并不知道解密的密钥,但是给出任意的消息,密码分析者都可以将其加密,再解密。或者说,密码分析者能获得解密服务。
设攻击者为A,密文接受者为T,公钥对为(e, n),私钥为d,T收到的密文为c,c对应的明文为m。
现在A想知道m = c^d mod n,但是他不想分解n。于是T找了一个随机数r,r < n。他进行如下计算:x = r^e mod n (对r用T的公钥加密,得到临时密文x)
y = (x * c) mod n (将临时密文x与密文c相乘)
t = r^(-1) mod n
A利用了RSA加密和解密过程的特点,即:
如果x = r^e mod n,那么 r = x^d mod n
现在A要做的是使T用d对t签名:u = t^d mod n。A需要获得u,然后计算
m = (t * u) mod n
2.RSA的选择密码攻击:
当公钥e取较小的值,虽然会使加密变得易于实现,速度有所提高,但这样做也是不安全的。最简单的办法就是e和d都取较大的值
常见的RSA题目之前也有提到过,后续会继续补充的。。。不过在这类题目中,用到最多的是Crypto库,python中记得安装,如果开始安装好了以后还显示没有这个模板,那你可以试试看下图的方式:
按照上图来,然后原本的crypto是小写,你把改成大写就好了。
emm......暂时就这么多,后面想到了再补充吧。。。。