rsa加密c语言源码库,RSA加密算法源代码C语言实现.doc-资源下载在线文库www.lddoc.cn...

RSA加密算法_源代码__C语言实现.doc

RSA 算法 1978 年就出现了这种算法,它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名Ron Rivest, AdiShamir 和 Leonard Adleman。但 RSA 的安全性一直未能得到理论上的证明。RSA 的安全性依赖于大数难于分解这一特点。公钥和私钥都是两个大素数(大于 100个十进制位)的函数。据猜测,从一个密钥和密文推断出明文的难度等同于分解两个大素数的积。密钥对的产生。选择两个大素数,p 和 q 。计算n p * q 然后随机选择加密密钥e,要求 e 和 p - 1 * q - 1 互质。最后,利用 Euclid 算法计算解密密钥 d, 满足 e * d 1 mod p - 1 * q - 1 其中 n 和 d 也要互质。数 e 和 n 是公钥,d 是私钥。两个素数 p和 q 不再需要,应该丢弃,不要让任何人知道。加密信息 m(二进制表示)时,首先把m 分成等长数据块 m1 ,m2,., mi ,块长 s,其中 2s include include using namespace std;RSA 算法所需参数typedef struct RSA_PARAM_Tagunsigned int64 p, q; 两个素数,不参与加密解密运算unsigned int64 f; fp-1*q-1,不参与加密解密运算unsigned int64 n, e; 公匙,np*q,gcde,f1unsigned int64 d; 私匙,e*d1 mod f ,gcdn,d1unsigned int64 s; 块长,满足 2s1; aa * a n; 函数看起来可以处理 64 位的整数,但由于这里 a*a 在 a232 时已经造成了溢出,因此实际处理范围没有 64 位aMulModa, a, n; b; ca * c n; 这里也会溢出,若把 64 位整数拆为两个 32 位整数不知是否可以解决这个问题。cMulModa, c, n; return c;/*Rabin-Miller 素数测试,通过测试返回 1,否则返回 0。n 是待测素数。注意通过测试并不一定就是素数,非素数通过测试的概率是 1/4*/long RabinMillerKnlunsigned int64 mn - 1;j0; 0、先计算出 m、j ,使得 n-1m*2j,其中 m 是正奇数,j 是非负整数whilem m1; 1、随机取一个 b,2 q p q;unsigned int64 bp q p q;unsigned int64 bp 1;b1; ifa 如果 a 为偶数,交换 a, bab;bt; dowhileb b 为偶数,a 为奇数时,gcdb,agcdb/2,a ifb 1; b、a 都是奇数,gcdb,agcdb-a/2,a whileb;return r * a;/*已知 a、b,求 x,满足 a*x 1 mod b相当于求解 a*x-b*y1 的最小整数解*/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;/*随机产生一个 RSA 加密参数*/RSA_PARAM RsaGetParamvoidRSA_PARAM Rsa 0 ;unsigned int64 t;Rsa.pRandomPrime16; 随机生成两个素数Rsa.qRandomPrime16;Rsa.nRsa.p * Rsa.q;Rsa.fRsa.p - 1 * Rsa.q - 1;doRsa.eg_Rnd.Random65536; 小于 216,65536216Rsa.e|1; 保证最低位是 1,即保证是奇数,因 f 一定是偶数,要互素,只能是奇数 whileSteinGcdRsa.e, Rsa.f 1; Rsa.dEuclidRsa.e, Rsa.f;Rsa.s0;tRsa.n 1;whiletRsa.s; slog2nt1; return Rsa;/*拉宾米勒测试*/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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值