实验三RSA算法代码的实现.docVIP

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验三 RSA算法代码实现 代码实现结果: 四、实验要求 1、在RSA算法中,求解私钥d可以采用扩展欧几里得算法和线性代入法两种方法,但这两种方法的计算效率很低(即计算d要花费很多时间,特别是数次乘积运算占用了大量计算时间,使得RSA时间复杂度增加),请你通过网络或自己设计一种及一种以上更为高效的求解d的方法,并写出详细计算过程。 2、用VC调试实验步骤给出的RSA加解密程序,结合原理分析程序中密钥是如何产生的?如何加密的?如何解密的?并在程序中给于解释。 3、你还能采用别的方法自主设计RSA公钥密码算法吗?如果能请列出相关代码。 【参考答案】 在RSA算法中,求解私钥d可以采用以下方法: 扩展欧几里得算法(模幂乘法运算) 线性代入法(模幂乘法运算) 平方-乘法:按平方计算模指数运算 一种二进制查表方幂模快速计算方法:该方法根据指数二进制形式结构进行分组计算,记忆典型操作数,通过查表法大量减少了乘法次数。 采用分解计算和内联汇编方法加速RSA算法的执行 设计规划密钥空间 【代码分析】 #includeiostream #includevector #includestring using namespace std; int Euclid(int a, int n)//na,求n和a的最大公因数为1 { int x,y,r; x=n;y=a; for (int i=0;;) { if(y==0) return x;//a=0 if(y==1) return y;//a=1 r=x%y;//a≠0,1,r=n%a x=y; y=r; } } double extenEuclid(double a,double n)//利用扩展的Euclid计算a^-1 mod n 的乘法逆元 { double x1=1,x2=0,x3=n,y1=0,y2=1,y3=a,Q; double t1,t2,t3; for(int i=0;;) { if(y3==0) { return x3; coutno reverseendl;//a=0,无乘法逆元 } if(y3==1) return y2;//a=1,a%n=1 Q=int(x3/y3);//Q=[n/a] t1=x1-Q*y1;//t1=x1=1 t2=x2-Q*y2;//t2=Q t3=x3-Q*y3;//t3=n-Qa,相当于d原理中的1=de-xfn x1=y1;x2=y2;x3=y3; y1=t1;y2=t2;y3=t3;//返回d的结果 } } bool Rabin(int a,int n)//Miler-Rabin素性测试算法对一个给定的大数进行测试 { vectorint b;//判断一个变量b是否是素数 unsigned int N=n-1; for(int i=0,j=1;;i++) { if(jN) break; if((Ni)(unsigned int)1) b.push_back(1); else b.push_back(0); j*=2; }//将n-1表示成二进制形式 for(int k=0;kb.size();k++) coutb[k]; coutendl; int d=1,x=0; for(int ii=b.size()-1;ii=0;ii--) { x=d; d=(d*d)%n; if(d==1x!=1x!=n-1) return false; if(b[ii]==1) d=(d*a)%n; }//b为素数 if(d!=1) return false;//不为素数 return true; } double quickindex1(double a,double m, double n)//实现a^m mod n 的运算 { vectorint b; unsigned double N=m;//公钥m=e for(int ii=0,j=1;;ii++) { if(jN) break; if((Nii)(unsigned double)1) b.push_back(1); else b.push_back(0); j*=2; }//将m表示成二进制形式 double c=0,d=1; for(int i=b.size()-1;i=0;i--) { c*=2; d=(d*d)-int((d*d)/n)*n; if(b[i]==1) { c+=1; d=(d*a)-int((d*a)

文档评论(0)

bhl0572 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档