RSA加密快速幂求余.docx
- 文档编号:28562887
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:7
- 大小:21.19KB
RSA加密快速幂求余.docx
《RSA加密快速幂求余.docx》由会员分享,可在线阅读,更多相关《RSA加密快速幂求余.docx(7页珍藏版)》请在冰豆网上搜索。
RSA加密快速幂求余
快速幂求余算法
(OJT1128)
求a^b%c(这就是著名的RSA公钥的加密方法)
当a,b很大时,直接求解这个问题不太可能,你能想到哪些优化呢?
算法1:
直观上,也许最容易想到的是利用a*b%c=((a%c)*b)%c,这样每一步都进行这种处理,这就解决了a^b可能太大存不下的问题,但这个算法的时间复杂度依然是O(n),根本没有得到优化。
当b很大时运行时间会很长
算法2:
另一种算法利用了分治的思想,可以达到O(logn)。
可以把b按二进制展开为b=p(n)*2^n+p(n-1)*2^(n-1)+...+p
(1)*2+p(0)其中p(i)(0<=i<=n)为0或1
这样a^b=a^(p(n)*2^n+p(n-1)*2^(n-1)+...+p
(1)*2+p(0))
=a^(p(n)*2^n)*a^(p(n-1)*2^(n-1)*...*a^(p
(1)*2)*a^p(0)
对于p(i)=0的情况,a^p(i)*2^(i-1)=a^0=1,不用处理,我们要考虑的仅仅是p(i)=1的情况,a^(2^i)=(a^(p(i)*2(i-1)))^2(当p(i)=1时,a^(2^i)=(a^(2(i-1)))^2)
利用这一点,我们可以递推地算出所有的a^(2^i)
当然由算法1的结论a*b%c=((a%c)*b)%c,我们加上取模运算a^(2^i)%c=((a^(2(i-1))%c)*a^(2(i-1)))%c
于是再把所有满足p(i)=1的a^(2^i)%c按照算法1乘起来再%c就是结果
示例:
3^6%7=3^(2^2)*3^(2^1)%7
=((3^(2^1))^2%7)*(3^1*3^1%7)
=(((3^1*3^1%7)%7)^2%7*2%7)%7
=(4*2)%7
=8%7
=1
当然算法可以进一步改进,比如二进制的每一位不必存起来,可以边求边用
经改进后代码如下:
(输入a,k,m,求a^k%m)
longf(longa,longk,longm)
{
longb=1;
while(k>=1)
{
if(k%2==1)b=a*b%m;
a=a*a%m;
k=k/2;
}
returnb;
}
例题
一、高级机密
TimeLimit:
1000MS MemoryLimit:
65536K
TotalSubmit:
43Accepted:
16
Description
在很多情况下,我们需要对信息进行加密。
特别是随着Internet的飞速发展,加密技术就显得尤为重要。
很早以前,罗马人为了在战争中传递信息,频繁地使用替换法进行信息加密。
然而在计算机技术高速发展的今天,这种替换法显得不堪一击。
因此研究人员正在试图寻找一种易于编码、但不易于解码的编码规则。
目前比较流行的编码规则称为RSA,是由美国麻省理工学院的三位教授发明的。
这种编码规则是基于一种求幂取模算法的:
对于给出的三个正整数a,b,c,计算a的b次方除以c的余数。
你的任务是编写一个程序,计算abmodc。
Input
输入数据只有一行,依次为三个正整数a,b,c,三个正整数之间各以一个空格隔开,并且1<=a,b Output 输出只有一个整数表示计算结果。 SampleInput 2611 SampleOutput 9 解: importjava.util.Scanner; //对于给出的三个正整数a,b,c,计算a的b次方除以c的余数,即: a^bmodc //相关公式: 用二进制表示b: b=p(n)*2^n+p(n-1)*2^(n-1)+...+p (1)*2+p(0)(其中p(i)值为0或1) //则a^b=a^(p(n)*2^n+p(n-1)*2^(n-1)+...+p (1)*2+p(0)) //=a^(p(n)*2^n)*a^(p(n-1)*2^(n-1))*...*a^(p (1)*2)*a^p(0) publicclassTopSecret{ publicstaticvoidmain(String[]args){ longa,b,c; Scannerinput=newScanner(System.in); a=input.nextInt(); b=input.nextInt(); c=input.nextInt(); System.out.println(getPowMod(a,b,c)); } publicstaticlonggetPowMod(longa,longb,longc){ longresult=1; while(b>=1){ if(b%2==1)result=a*result%c; a=a*a%c; b/=2;//通过b/2来求得p(i)为1还是0 } returnresult; } } 二、D: RaisingModuloNumbers TimeLimit: 1000ms CaseTimeLimit: 1000ms MemoryLimit: 30000KB Submit: 24 Accepted: 7 Description Peoplearedifferent.Somesecretlyreadmagazinesfullofinterestinggirls'pictures,otherscreateanA-bombintheircellar,otherslikeusingWindows,andsomelikedifficultmathematicalgames.Latestmarketingresearchshows,thatthismarketsegmentwassofarunderestimatedandthatthereislackofsuchgames.ThiskindofgamewasthusincludedintotheKOKODáKH.Therulesfollow: EachplayerchoosestwonumbersAiandBiandwritesthemonaslipofpaper.Otherscannotseethenumbers.Inagivenmomentallplayersshowtheirnumberstotheothers.ThegoalistodeterminethesumofallexpressionsAiBifromallplayersincludingoneselfanddeterminetheremainderafterdivisionbyagivennumberM.Thewinneristheonewhofirstdeterminesthecorrectresult.Accordingtotheplayers'experienceitispossibletoincreasethedifficultybychoosinghighernumbers. Youshouldwriteaprogramthatcalculatestheresultandisabletofindoutwhowonthegame. Input TheinputconsistsofZassignments.ThenumberofthemisgivenbythesinglepositiveintegerZappearingonthefirstlineofinput.Thentheassignementsfollow.EachassignementbeginswithlinecontaininganintegerM(1<=M<=45000).Thesumwillbedividedbythisnumber.NextlinecontainsnumberofplayersH(1<=H<=45000).NextexactlyHlinesfollow.Oneachline,thereareexactlytwonumbersAiandBiseparatedbyspace.Bothnumberscannotbeequalzeroatthesametime. Output Foreachassingnementthereistheonlyonelineofoutput.Onthisline,thereisanumber,theresultofexpression (A1B1+A2B2+...+AHBH)modM. SampleInput 3 16 4 23 34 45 56 36123 1 23748593029382 17 1 318132 SampleOutput 2 13195 13 题意 给出A1~Ah,B1~Bh,M,H,求(A1B1+A2B2+...+AHBH)modM. 做法 快速幂取模+累加步步取模 HIT 取模相当于在原数中不断减去M直到原数小于M,所以累加后取模和步步取模结果相同,因此在累加过程中取模以防止超过longlong界限 CODE #include longlongz,h,a,b,m,ans,pow; intmain(){ scanf("%I64d",&z); while(z--){ scanf("%I64d%I64d",&m,&h); ans=0; while(h--){ scanf("%I64d%I64d",&a,&b); pow=1; while(b>=1){ if(b%2==1) pow=a*pow%m; a=a*a%m; b/=2; } ans+=pow; ans%=m; } printf("%I64d\n",ans); } return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- RSA 加密 快速 幂求余