資源描述:
《RSA的C語言算法實(shí)現(xiàn)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、RSA算法的C語言實(shí)現(xiàn)一、RSA算法的描述1、選取長度相等的兩個(gè)大素?cái)?shù)p和q,計(jì)算其乘積:n=pq然后隨機(jī)選取加密密鑰e,使e和(p–1)(q–1)互素。最后用歐幾里德擴(kuò)展算法計(jì)算解密密鑰d,以滿足ed=1(mod(p–1)(q–1))即d=e–1mod((p–1)(q–1))e和n是公鑰,d是私鑰2、加密公式如下:ci=mi^e(modn)3、解密時(shí),取每一密文分組ci并計(jì)算:mi=ci^d(modn)Ci^d=(mi^e)^d=mi^(ed)=mi^[k(p–1)(q–1)+1]=mimi^[k(p–1)(q–1)]=mi*1=mi4、消息也可以用d加密用e解密二、C源
2、程序//RSA算法的C程序?qū)崿F(xiàn)#includeintcandp(inta,intb,intc)//數(shù)據(jù)處理函數(shù),實(shí)現(xiàn)冪的取余運(yùn)算{intr=1;b=b+1;while(b!=1){r=r*a;r=r%c;b--;}printf("%d",r);returnr;}intfun(intx,inty)//公鑰e與t的互素判斷{intt;while(y){t=x;x=y;y=t%y;}if(x==1)return0;//x與y互素時(shí)返回0elsereturn1;//x與y不互素時(shí)返回1}voidmain(){intp,q,e,d,m,n,t,c,r;print
3、f("請(qǐng)輸入兩個(gè)素?cái)?shù)p,q:");scanf("%d%d",&p,&q);n=p*q;printf("計(jì)算得n為%3d",n);t=(p-1)*(q-1);//求n的歐拉數(shù)printf("計(jì)算得t為%3d",t);printf("請(qǐng)輸入公鑰e:");scanf("%d",&e);if(e<1
4、
5、e>t
6、
7、fun(e,t)){printf("e不合要求,請(qǐng)重新輸入:");//e<1或e>t或e與t不互素時(shí),重新輸入scanf("%d",&e);}d=1;while(((e*d)%t)!=1)d++;//由公鑰e求出私鑰dprintf("經(jīng)計(jì)算d為%d",d);pr
8、intf("加密請(qǐng)輸入1");//加密或解密選擇printf("解密請(qǐng)輸入2");scanf("%d",&r);switch(r){case1:printf("請(qǐng)輸入明文m:");//輸入要加密的明文數(shù)字scanf("%d",&m);c=candp(m,e,n);printf("密文為%d",c);break;case2:printf("請(qǐng)輸入密文c:");//輸入要解密的密文數(shù)字scanf("%d",&c);m=candp(c,d,n);printf("明文為%d",m);break;}}三、程序運(yùn)行結(jié)果及相關(guān)說明主函數(shù)實(shí)現(xiàn)求N的歐拉數(shù)、由公鑰求解私鑰、加
9、密解密選擇以及相應(yīng)的密文明文輸出。子函數(shù)candp實(shí)現(xiàn)加密解密時(shí)的求冪取余運(yùn)算,fun實(shí)現(xiàn)e與t的互素判斷,已驗(yàn)證e是否符合要求。程序主體參考了網(wǎng)上的相關(guān)RSA算法程序,我對(duì)其中e的合法性判斷、主函數(shù)實(shí)現(xiàn)的順序以及相關(guān)提示信息做了補(bǔ)充與修改并加上了注釋,這樣程序可讀性更強(qiáng),運(yùn)行時(shí)更容易操作,思路也更加嚴(yán)密。當(dāng)P=43,q=59時(shí),對(duì)134進(jìn)行加密,運(yùn)行結(jié)果如下:第一次取e為15,與t不互素,提示需重新輸入,輸入13后,便可以進(jìn)行正確操作。由于int型變量為十六位,因此n最大只能小于65536,此程序只是對(duì)RSA算法的入門,無法實(shí)現(xiàn)達(dá)到安全要求的數(shù)據(jù)位數(shù)。