利用代码实现RSA加密解密
1、题目内容描述:
密钥产生:随机选择两个素数p,q;
计算n=p*q; 欧拉函数t=(p-1)(q-1);
选择一个整数e,使得e 与t的最大公约数是1;
计算d=e-1mod t;所以公开密钥是(n,e);私有密钥是d。
加密过程:有明文m ,加密成密文是c=me mod n。
解密过程:有密文c ,解密成明文是m=cd mod n。
2、关键代码的设计、实现与执行
1,随机选择的素数,且素数通过概率性检验;
n-1=2sk;分解素数n得出s,k;k是奇数
for(num1~t=10){
选择随机整数b,2<=b<=n-2;
计算bk mod p,p是随机出来的素数;
第一次结果为+ 1时,可以判断可能是素数。
剩下结果是-1时,可以判断可能素数。
最多s次,循环模n。}
2,通过快速模密算法计算y= xa mod n;
将a转换成2进制数,设y1=1,从a二进制的最高位开始,遇到1就yx先平方再乘x;遇到 0
就直接平方。
通过函数将a转换成2进制,利用数组a[]储存。
For(i){
Y1=1;
If(a[i]==0){ y=y*y mod n }
Else {y=y*y*x mod n; }
} return y;
3,孙子定理;
已知m=cdmod n,n=pq;
则分解为1m=cdmod p,2m=cdmod q。
M=pq;m1=q,m2=p.
分别求m1模p的逆元和m2模q的逆元,得到x1,x2.//扩展欧几里得
m=m1*x1*cdmodM +m2*x2*cdmod M.//快速模密算法
4,加密解密算法:
利用快速模密得出密文。
利用孙子定理得出明文。
3、实验结果分析
187是n=11*17.
由欧拉函数得到t=(11-1)(17-1)=160,已知e=7
利用扩展欧几里得得到e的逆元是23. 23*7=161mod160=1。
公钥是187,7.私钥是23.
加密:M=333. C=3337mod187=181
解密:n=11*17.m1=17,m2=11.
求得17mod11的逆元是2,11mod17的逆元是14,算出明文是333。
实验不足:求指数的二进制使用了数组,数组开小了容易溢出。
三、实验思考
1、实验过程总结
在本次实验中学会了快速模密算法,将该算法分为两个部分,求指数的二进制和利用01快速求得幂,由于有时幂会溢出,因此每求一次幂就模一次,防止溢出。
选择素数并非输入,而是随机生成素数并利用米勒检验。通过检验的素数大概率是素数,不通过一定不是素数。因此米勒,也叫概率性检验。
2、回答实验指导书最后提出的问题
1 设A从2~(N-1)
C=(A EXP D) mod N
满足如下条件:
D是素数,N是两个素数(P,Q)之积,
(D * E) mod ((P-1) * (Q-1))=1
因为:若
C=(A EXP D)mod N
有:
A=(C EXP E) mod N
.由题可知,p=101,q=71,e=7.n=p*q=7171 s0=2
C1=27mod7171 C2=249mod7171 c3=2343mod7171 c4=22401mod7171 c5=216807mod7171 C6=2117649 mod 7171 c7=2823543mod7171 c8=25764801mod7171
C9=240353607mod7171 c10=2282475249mod7171