已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
RSA算法 #include #include #include using namespace std;/RSA算法所需参数typedef struct RSA_PARAM_Tag unsigned _int64 p, q; /两个素数,不参与加密解密运算 unsigned _int64 f; /f=(p-1)*(q-1),不参与加密解密运算 unsigned _int64 n, e; /公匙,n=p*q,gcd(e,f)=1 unsigned _int64 d; /私匙,e*d=1 (mod f),gcd(n,d)=1 unsigned _int64 s; /块长,满足2s=1; /a=a * a % n; /函数看起来可以处理64位的整数,但由于这里a*a在a=232时已经造成了溢出,因此实际处理范围没有64位 a=MulMod(a, a, n); b-; /c=a * c % n; /这里也会溢出,若把64位整数拆为两个32位整数不知是否可以解决这个问题。 c=MulMod(a, c, n); return c;/*Rabin-Miller素数测试,通过测试返回1,否则返回0。n是待测素数。注意:通过测试并不一定就是素数,非素数通过测试的概率是1/4*/long RabinMillerKnl(unsigned _int64 &n) unsigned _int64 b, m, j, v, i; m=n - 1; j=0; /0、先计算出m、j,使得n-1=m*2j,其中m是正奇数,j是非负整数 while(!(m & 1) +j; m=1; /1、随机取一个b,2=bn-1 b=2 + g_Rnd.Random(n - 3); /2、计算v=bm mod n v=PowMod(b, m, n); /3、如果v=1,通过测试 if(v = 1) return 1; /4、令i=1 i=1; /5、如果v=n-1,通过测试 while(v != n - 1) /6、如果i=l,非素数,结束 if(i = j) return 0; /7、v=v2 mod n,i=i+1 v=PowMod(v, 2, n); +i; /8、循环到5 return 1;/*Rabin-Miller素数测试,循环调用核心loop次全部通过返回1,否则返回0*/long RabinMiller(unsigned _int64 &n, long loop) /先用小素数筛选一次,提高效率 for(long i=0; i g_PrimeCount; i+) if(n % g_PrimeTablei = 0) return 0; /循环调用Rabin-Miller测试loop次,使得非素数通过测试的概率降为(1/4)loop for(long i=0; i loop; i+) if(!RabinMillerKnl(n) return 0; return 1;/*随机生成一个bits位(二进制位)的素数,最多32位*/unsigned _int64 RandomPrime(char bits) unsigned _int64 base; do base= (unsigned long)1 q ? p : q; unsigned _int64 b=p q ? p : q; unsigned _int64 b=p q ? p : q; unsigned _int64 t, r=1; if(p = q) return p; /两数相等,最大公约数就是本身 else while(!(a & 1) & (!(b & 1) r=1; b=1; if(!(a & 1) t=a; /如果a为偶数,交换a,b a=b; b=t; do while(!(b & 1) b=1; /b为偶数,a为奇数时,gcd(b,a)=gcd(b/2,a) if(b 1; /b、a都是奇数,gcd(b,a)=gcd(b-a)/2,a) while(b); return r * a; /*已知a、b,求x,满足a*x =1 (mod b)相当于求解a*x-b*y=1的最小整数解*/unsigned _int64 Euclid(unsigned _int64 &a, unsigned _int64 &b) unsigned _int64 m, e, i, j, x, y; long xx, yy; m=b; e=a; x=0; y=1; xx=1; yy=1; while(e) i=m / e; j=m % e; m=e; e=j; j=y; y*=i; if(xx = yy) if(x y) y=x - y; else y-=x; yy=0; else y+=x; xx=1 - xx; yy=1 - yy; x=j; if(xx = 0) x=b - x; return x;/*随机产生一个RSA加密参数*/RSA_PARAM RsaGetParam(void) RSA_PARAM Rsa= 0 ; unsigned _int64 t; Rsa.p=RandomPrime(16); /随机生成两个素数 Rsa.q=RandomPrime(16); Rsa.n=Rsa.p * Rsa.q; Rsa.f=(Rsa.p - 1) * (Rsa.q - 1); do Rsa.e=g_Rnd.Random(65536); /小于216,65536=216 Rsa.e|=1; /保证最低位是1,即保证是奇数,因f一定是偶数,要互素,只能是奇数 while(SteinGcd(Rsa.e, Rsa.f) != 1); Rsa.d=Euclid(Rsa.e, Rsa.f); Rsa.s=0; t=Rsa.n 1; while(t) Rsa.s+; /s=log2(n) t=1; return Rsa;/*拉宾米勒测试*/void TestRM(void) unsigned long k=0; cout - Rabin-Miller prime check.n endl; for(unsigned _int64 i=4197900001; i 4198000000; i+=2) if(RabinMiller(i, 30) k+; cout i endl; cout Total: k endl;/*RSA加密解密*/void TestRSA(void) RSA_PARAM r; char pSrc=abcdefghijklmnopqrstuvwxyz; const unsigned long n=sizeof(pSrc); unsigned char *q, pDecn; unsigned _int64 pEncn; r=RsaGetParam(); cout p= r.p endl; cout q= r.q endl; cout f=(p-1)*(q-1)= r.f endl; cout n=p*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:; for(unsigned long i=0; i n; i+) pEnci=PowMod(qi, r.e, r.n); cout hex pEnci ; cout endl; cout Decode:; for(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年珠宝销售顾问招聘面试参考题库及答案
- 高级财商会计考试题库及答案
- 2025年传媒营销专员招聘面试参考题库及答案
- 临床护士输血题库及答案
- 2025年自动化测试工程师招聘面试题库及参考答案
- 2025年战略投资经理招聘面试题库及参考答案
- 2025年厨房经理招聘面试题库及参考答案
- 2025年体验活动策划师招聘面试题库及参考答案
- 2025年消费者服务经理招聘面试题库及参考答案
- 2025年电气工程技术员招聘面试参考题库及答案
- 医院科研诚信培训课件
- 数学模型-第06章(第五版)
- 2025年四川省高考生物试卷真题(含答案解析)
- 放射性肺炎治疗
- 京东物流管理制度
- GB/T 19348.2-2025无损检测工业射线照相胶片第2部分:用参考值方法控制胶片处理
- 医疗器械生锈问题
- 仪器仪表维修的安全管理措施
- 2025-2030中国瘢痕疙瘩治疗行业市场发展趋势与前景展望战略研究报告
- 门面出售合同协议
- 康复科考试试题及答案
评论
0/150
提交评论