資源描述:
《RSA加密算法_源代碼__C語(yǔ)言實(shí)現(xiàn).doc》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、RSA算法1978年就出現(xiàn)了這種算法,它是第一個(gè)既能用于數(shù)據(jù)加密也能用于數(shù)字簽名的算法。它易于理解和操作,也很流行。算法的名字以發(fā)明者的名字命名:RonRivest,AdiShamir和LeonardAdleman。但RSA的安全性一直未能得到理論上的證明。RSA的安全性依賴于大數(shù)難于分解這一特點(diǎn)。公鑰和私鑰都是兩個(gè)大素?cái)?shù)(大于100個(gè)十進(jìn)制位)的函數(shù)。據(jù)猜測(cè),從一個(gè)密鑰和密文推斷出明文的難度等同于分解兩個(gè)大素?cái)?shù)的積。密鑰對(duì)的產(chǎn)生。選擇兩個(gè)大素?cái)?shù),p和q。計(jì)算:n=p*q然后隨機(jī)選擇加密密鑰e,要求e和(p-1)*(q-1)互質(zhì)。最后,利用Euclid算法計(jì)算解密密鑰d,滿足e*d=1(
2、mod(p-1)*(q-1))其中n和d也要互質(zhì)。數(shù)e和n是公鑰,d是私鑰。兩個(gè)素?cái)?shù)p和q不再需要,應(yīng)該丟棄,不要讓任何人知道。加密信息m(二進(jìn)制表示)時(shí),首先把m分成等長(zhǎng)數(shù)據(jù)塊m1,m2,...,mi,塊長(zhǎng)s,其中2^s<=n,s盡可能的大。對(duì)應(yīng)的密文是:ci=mi^e(modn)(a)解密時(shí)作如下計(jì)算:mi=ci^d(modn)(b)RSA可用于數(shù)字簽名,方案是用(a)式簽名,(b)式驗(yàn)證。具體操作時(shí)考慮到安全性和m信息量較大等因素,一般是先作HASH運(yùn)算。RSA的安全性。RSA的安全性依賴于大數(shù)分解,但是否等同于大數(shù)分解一直未能得到理論上的證明,因?yàn)闆](méi)有證明破解RSA就一定需要作大
3、數(shù)分解。假設(shè)存在一種無(wú)須分解大數(shù)的算法,那它肯定可以修改成為大數(shù)分解算法。目前,RSA的一些變種算法已被證明等價(jià)于大數(shù)分解。不管怎樣,分解n是最顯然的攻擊方法。現(xiàn)在,人們已能分解140多個(gè)十進(jìn)制位的大素?cái)?shù)。因此,模數(shù)n必須選大一些,因具體適用情況而定。由于進(jìn)行的都是大數(shù)計(jì)算,使得RSA最快的情況也比DES慢上100倍,無(wú)論是軟件還是硬件實(shí)現(xiàn)。速度一直是RSA的缺陷。一般來(lái)說(shuō)只用于少量數(shù)據(jù)加密。*/#include#include#include
4、AM_Tag{unsigned__int64p,q;//兩個(gè)素?cái)?shù),不參與加密解密運(yùn)算unsigned__int64f;//f=(p-1)*(q-1),不參與加密解密運(yùn)算unsigned__int64n,e;//公匙,n=p*q,gcd(e,f)=1unsigned__int64d;//私匙,e*d=1(modf),gcd(n,d)=1unsigned__int64s;//塊長(zhǎng),滿足2^s<=n的最大的s,即log2(n)}RSA_PARAM;//小素?cái)?shù)表conststaticlongg_PrimeTable[]={3,5,7,11,13,17,19,23,29,31,37,41,43,4
5、7,53,59,61,67,71,73,79,83,89,97};conststaticlongg_PrimeCount=sizeof(g_PrimeTable)/sizeof(long);constunsigned__int64multiplier=12747293821;constunsigned__int64adder=1343545677842234541;//隨機(jī)數(shù)類classRandNumber{/**/private:unsigned__int64randSeed;/**/public:RandNumber(unsigned__int64s=0);unsigned__int
6、64Random(unsigned__int64n);};/**/RandNumber::RandNumber(unsigned__int64s){if(!s){randSeed=(unsigned__int64)time(NULL);}else{randSeed=s;}}/**/unsigned__int64RandNumber::Random(unsigned__int64n){randSeed=multiplier*randSeed+adder;returnrandSeed%n;}staticRandNumberg_Rnd;/*模乘運(yùn)算,返回值x=a*bmodn*/inlineun
7、signed__int64MulMod(unsigned__int64a,unsigned__int64b,unsigned__int64n){returna*b%n;}/*模冪運(yùn)算,返回值x=base^powmodn*/unsigned__int64PowMod(unsigned__int64&base,unsigned__int64&pow,unsigned__int64&n){unsigned__int64a=base,b=p