rsa加密c语言源码库,RSA加密算法源代码C语言实现.doc-资源下载在线文库www.lddoc.cn...
RSA加密算法_源代碼__C語(yǔ)言實(shí)現(xiàn).doc
RSA 算法 1978 年就出現(xiàn)了這種算法,它是第一個(gè)既能用于數(shù)據(jù)加密也能用于數(shù)字簽名的算法。它易于理解和操作,也很流行。算法的名字以發(fā)明者的名字命名Ron Rivest, AdiShamir 和 Leonard Adleman。但 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 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,其中 2s include include using namespace std;RSA 算法所需參數(shù)typedef struct RSA_PARAM_Tagunsigned int64 p, q; 兩個(gè)素?cái)?shù),不參與加密解密運(yùn)算unsigned int64 f; fp-1*q-1,不參與加密解密運(yùn)算unsigned int64 n, e; 公匙,np*q,gcde,f1unsigned int64 d; 私匙,e*d1 mod f ,gcdn,d1unsigned int64 s; 塊長(zhǎng),滿足 2s1; aa * a n; 函數(shù)看起來(lái)可以處理 64 位的整數(shù),但由于這里 a*a 在 a232 時(shí)已經(jīng)造成了溢出,因此實(shí)際處理范圍沒(méi)有 64 位aMulModa, a, n; b; ca * c n; 這里也會(huì)溢出,若把 64 位整數(shù)拆為兩個(gè) 32 位整數(shù)不知是否可以解決這個(gè)問(wèn)題。cMulModa, c, n; return c;/*Rabin-Miller 素?cái)?shù)測(cè)試,通過(guò)測(cè)試返回 1,否則返回 0。n 是待測(cè)素?cái)?shù)。注意通過(guò)測(cè)試并不一定就是素?cái)?shù),非素?cái)?shù)通過(guò)測(cè)試的概率是 1/4*/long RabinMillerKnlunsigned int64 mn - 1;j0; 0、先計(jì)算出 m、j ,使得 n-1m*2j,其中 m 是正奇數(shù),j 是非負(fù)整數(shù)whilem m1; 1、隨機(jī)取一個(gè) b,2 q p q;unsigned int64 bp q p q;unsigned int64 bp 1;b1; ifa 如果 a 為偶數(shù),交換 a, bab;bt; dowhileb b 為偶數(shù),a 為奇數(shù)時(shí),gcdb,agcdb/2,a ifb 1; b、a 都是奇數(shù),gcdb,agcdb-a/2,a whileb;return r * a;/*已知 a、b,求 x,滿足 a*x 1 mod b相當(dāng)于求解 a*x-b*y1 的最小整數(shù)解*/unsigned int64 Euclidunsigned int64 long xx, yy;mb;ea;x0;y1;xx1;yy1;whileeim / e;jm e;me;ej;jy;y*i;ifxx yyifx yyx - y;elsey-x;yy0;elseyx;xx1 - xx;yy1 - yy; xj; ifxx 0xb - x; return x;/*隨機(jī)產(chǎn)生一個(gè) RSA 加密參數(shù)*/RSA_PARAM RsaGetParamvoidRSA_PARAM Rsa 0 ;unsigned int64 t;Rsa.pRandomPrime16; 隨機(jī)生成兩個(gè)素?cái)?shù)Rsa.qRandomPrime16;Rsa.nRsa.p * Rsa.q;Rsa.fRsa.p - 1 * Rsa.q - 1;doRsa.eg_Rnd.Random65536; 小于 216,65536216Rsa.e|1; 保證最低位是 1,即保證是奇數(shù),因 f 一定是偶數(shù),要互素,只能是奇數(shù) whileSteinGcdRsa.e, Rsa.f 1; Rsa.dEuclidRsa.e, Rsa.f;Rsa.s0;tRsa.n 1;whiletRsa.s; slog2nt1; return Rsa;/*拉賓米勒測(cè)試*/void TestRMvoidunsigned long k0;cout “ - Rabin-Miller prime check.n“ endl;forunsigned int64 i4197900001; i 4198000000; i2ifRabinMilleri, 30k;cout i endl; cout “Total “ k endl;/*RSA 加密解密*/void TestRSAvoidRSA_PARAM r;char pSrc“abcdefghijklmnopqrstuvwxyz“;const unsigned long nsizeofpSrc;unsigned char *q, pDecn;unsigned int64 pEncn;rRsaGetParam;cout “p“ r.p endl;cout “q“ r.q endl;cout “fp-1*q-1“ r.f endl;cout “np*q“ r.n endl;cout “e“ r.e endl;cout “d“ r.d endl;cout “s“ r.s endl;cout “Source“ pSrc endl;q unsigned char *pSrc;cout “Encode“;forunsigned long i0; i n; ipEnciPowModqi, r.e, r.n;cout hex pEnci “ “; cout endl;cout “Decode“;forunsigned long i0; i n; ipDeciPowModpEnci, r.d, r.n;cout hex unsigned longpDeci “ “; cout endl;cout char *pDec endl;/* */int mainvoidTestRSA;return 0;
總結(jié)
以上是生活随笔為你收集整理的rsa加密c语言源码库,RSA加密算法源代码C语言实现.doc-资源下载在线文库www.lddoc.cn...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C/C++程序员桌面壁纸---简尚黑
- 下一篇: 四级菜单实现(Python)