- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
信息工程大学
实验报告
〔2015-2016学年第一学期〕
报告题目:平方乘算法
课程名称:密码学B
任课教员:
专业:
学号:
姓名:
二O一五年十二月三十一日
一、课程概述
目的:培养学员的编程能力,理解算法原理。
要求:自定义一种乘法,给出平方乘算法的软件实现。
二、设计思路
平方乘算法是实现y=
输入:??x和正整数e;
输出:y
预处理:求出m比特数e的二进制表示,即
e
主算法:
Step1置y=1
Step2从i=m-1到i=0,依次执行:
〔1〕y←y2;
〔2〕当ei=1时,执行y←
Step3输出y.
三、采取的方案
使用C语言进行编程,为简化输入输出语句,调用了C++的cin、cout函数。预处理时参加了iostream.h包。
程序支持用户自己定义乘法运算,即模n乘法。
用户输入n的值后,程序将n存在无符号整形变量MO中。之后的每次运算,只需要对MO取余数即可,这样可以减小计算结果,简化了计算的空间复杂度。如果不取模,当计算结果大于232时,C语言就无法存放,会出现溢出。
算法的目标是计算y=xe,下一步程序会提示用户输入x、e
之后将e转化为二进制数,通过ToEr函数实现。ToEr函数采用除以2,取余的算法进行十进制数向二进制转化,利用了递归的思想,简化了代码。计算结果保存在32位无符号整形数组d[32]中。接下来利用上述算法的思想对平方乘进行运算,通过Alu函数实现。结果返回到无符号整形变量c中。最后输出结果c。
四、取得的成果
程序运行实例:计算9526〔mod163〕:
与Windows10自带的计算器进行结果比对,结果正确。
五、心得体会
通过本次实验,我对平方乘算法有了更加深入的理解,在公钥密码算法学习的过程中,个人编的小程序也得到了应用。RSA公钥密码体质的作业中有很多模n平方乘的题,我通常是利用自己的程序跑一遍,就得到了答案。
本程序比拟简单,经过教员的指导,一个学时就已经编完。但是没有实现对大模数的平方乘。模数n是储存在一个无符号整形变量中,无符号整形变量的最大值是232,如果模数大于这个数,本算法就无能为力。在真正的RSA算法中,我们要选定一个大合数N,进行模乘法。虽然比N小,但依然很大,否那么不能保证RSA的平安性。所以本人的平方乘算法在应用上有一定的局限性,只能进行小模数的乘法运算。
改良的思路:根据教员在课上讲的,可以使用unsignedint数组进行大数的存放,一个元素存32位二进制数。这样两个元素组成的数组就可以存放64位的数,随着数组中元素的增加,数的范围可以到达很大。但是本人能力有限,之前也没有接触到这方面的知识,如何对一个数组链接成的大数进行运算,成了一个难点。在之后的学习中,本人会逐渐探索,改良算法。
六、附录
程序代码:
#includeiostream.h
voidToEr(unsignedinte,unsignedintd[],unsignedintnum)//变为二进制
{
inta;
a=e%2;
num++;
// coutaendl;
d[num]=a;
e/=2;
if(e!=0)ToEr(e,d,num);
}
unsignedintAlu(unsignedintx,unsignedintd[],unsignedintnum,unsignedintMO)//运算
{
inta,b,c,i;
b=x;
c=1;
for(i=1;i=num;i++)
{
a=d[i];
if(a==1){c*=b;c%=MO;}
b=b*b%MO;
}
returnc;
}
voidmain()
{
unsignedintx,e,c,num,MO;
unsignedintd[32];
num=0;
cout首先需要定义模n乘法,请输入n:;
cinMO;
cout本程序定义为modMO乘法运算。endl;
couty=x^emo
您可能关注的文档
最近下载
- 2025年光伏电站设计与运维职业技能等级考试模拟试题集(含答案解析).docx VIP
- DB13(J)T 218-2016外墙保温装饰复合板应用技术规程(盒状金属装饰保温一体板).pdf
- 护理警示标识课件.pptx VIP
- EN1563-2011 球墨铸铁 中文版.pdf VIP
- 水泥罐施工方案方针.pdf VIP
- 六年级数学下册折扣与成数人教版.pptx VIP
- 跨文化交际:中英文化对比 (3).ppt VIP
- 2025年光伏运维人员职业技能竞赛考试练习题库(含各题型)含答案.pdf VIP
- “素养导向”初中历史大单元教学策略及案例 课件.pptx
- 云南劳技七年级上册家政教案.docx VIP
文档评论(0)