- 1、本文档共12页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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)
您可能关注的文档
最近下载
- 【苏教版】初中七年级上册同步练习及单元测试(全册)(含答案).pdf VIP
- 山东省烟台市(新版)2024小学语文部编版小升初测试(培优卷)完整试卷(含答案).docx VIP
- 《干法》稻盛和夫.pdf-2019-02-13-13-27-03-150.docx VIP
- 筋伤-踝部筋伤(中医骨伤科学十三五教材)【57页】.pptx VIP
- 室内装修改造施工组织设计.pdf VIP
- 加利福尼亚州驾驶员手册简体中文版.pdf VIP
- 初中物理跨学科设计方案.docx VIP
- 毕业设计总结集锦3篇.docx VIP
- 2025年股东董事增资备忘录.docx VIP
- 八年级物理声现象单元测试卷.doc VIP
文档评论(0)