ImageVerifierCode 换一换
格式:DOCX , 页数:26 ,大小:23.86KB ,
资源ID:5902227      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5902227.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Rsa 算法分析.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Rsa 算法分析.docx

1、Rsa 算法分析 RSA 算法分析姓名: 学号: 班级:1、算法简介:RSA公钥加密算法是1977年由罗纳德李维斯特(Ron Rivest)、阿迪萨莫尔(Adi Shamir)和伦纳德阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。RSA公开密钥密码体制。所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。

2、虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK。RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA是被研究得最广泛的公钥算法,从提出到现今的三十多年里,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。二、源码分析:/*-RSA.cpp-*/#include rsa.h/引入rsa.h/*-以下为prime_factory类定义与实现-*/prime_factory:用于产生质数class prime_factory/类 unsigned np;/无符号 unsigned *pl;/无符号 public:/公共 prime_f

3、actory();/构造函数 prime_factory();/构造函数 vlong find_prime( vlong & start );/寻找质数; /判定是否有很大概率为质数static int is_probable_prime( const vlong &p )/静态 /基于费马小定理:若p是任一质数, a 是任一整数, 则 ap = 1 mod p 。换句话说, /如果 a 和 p 互质, 则 a(p-1) = 1 mod p。2,3,5,7值分别代入a,若上式均成立 /则p为质数的概率极大 const rep = 4;/测试底数a的个数 const unsigned anyre

4、p = 2,3,5,7 ;/测试底数a数组为2,3,5,7 for ( unsigned i=0; irep; i+=1 )/循环,判断是否p有很大概率为质数, if ( modexp( anyi, p-(vlong)1, p ) != (vlong)1 )/判断是否a(p-1) = 1 mod p return 0;/返回0 return 1;/返回1/构造小质数表prime_factory:prime_factory() np = 0; /初始化为0 unsigned NP = 200;/小质数表个数上限 pl = new unsignedNP;/pl指向小质数表 /初始化质数表 unsi

5、gned SS = 8*NP; /质数表上限 char * b = new charSS+1;/指针指向字符数组 for (unsigned i=0;i=SS;i+=1) /for循环对b数组赋值 bi = 1;/数组初始化为1 unsigned p = 2;/从2开始构造质数 while (1) / skip composites while ( bp = 0 ) p += 1;/如果p为0,p递增1 if ( p = SS ) break;/若p等于SS,退出循环 plnp = p;/将找到的质数写入小质数表中 np += 1;/质数个数递增1 if ( np = NP ) break;/

6、如果质数个数达到小质数表的上限个数,退出循环 / cross off multiples unsigned c = p*2;/记录2*p while ( c SS )/当c =start的质数vlong prime_factory:find_prime( vlong & start ) unsigned SS = 1000; /1000为上限 char * b = new charSS; /后备,如果SSi=0,就不需要用/费马小定理(is_probable_prime)检验start+i,因为它必非质数 unsigned tested = 0; /使用is_probable_prime函数检

7、验过的后备质数次数 while (1) unsigned i;/循环变量i for (i=0;iSS;i+=1)/for循环 bi = 1;/赋初值为1 for (i=0;inp;i+=1)/for循环 unsigned p = pli;/p记录循环所指向的质数 unsigned r = start % (vlong)p;/ if (r)/ r = p - r;/将p-r赋值给r / 去除所有能被p除尽的后备质数 while ( r SS )/当r SS时, br = 0;/将后备质数检验位置为0 r += p;/r递增p / 检验后备质数 for (i=0;i q ) /若p q,则交换两数

8、 vlong tmp = p; p = q; q = tmp; / 计算公钥 /从0,(p-1)(q-1)-1中随机选取加密密钥e,使得e和(p-1)(q-1)互质。此处 /为使e较大,直接从一较大数开始选取(50001) m = p*q;/模m=p*q e = 50001; /必须为奇数 while ( gcd(p-(vlong)1,e) != (vlong)1 | gcd(q-(vlong)1,e) != (vlong)1 )/? e += 2;/e只能每次递增2 /加密明文vlong public_key:encrypt( const vlong& plain ) return mode

9、xp( plain, e, m );/返回/解密秘文vlong private_key:decrypt( const vlong& cipher ) / Calculate values for performing decryption / These could be cached, but the calculation is quite fast vlong d = modinv( e, (p-(vlong)1)*(q-(vlong)1) ); vlong u = modinv( p, q ); vlong dp = d % (p-(vlong)1);/计算d mod (p-1) vl

10、ong dq = d % (q-(vlong)1);/计算d mod (q-1) / 应用同余定理 vlong a = modexp( cipher % p, dp, p );/计算 vlong b = modexp( cipher % q, dq, q );/计算 if ( b =( const vlong& x, const vlong& y ) return x.cf( y ) = 0; /友元内联函数实现对常用比较运算符operator =的重载 friend inline int operator =( const vlong& x, const vlong& y ) return

11、x.cf( y ) = 0; /友元内联函数实现对常用比较运算符operator ( const vlong& x, const vlong& y ) return x.cf( y ) 0; /友元内联函数实现对常用比较运算符operator 的重载 friend inline int operator ( const vlong& x, const vlong& y ) return x.cf( y ) 0; /友元内联函数实现对常用比较运算符operator = n ) return 0;/如果i超过n,则返回0 return ai;/否则,返回第i个单元数void flex_unit:c

12、lear()/清空 n = 0;/n为0flex_unit:flex_unit()/构造函数 z = 0;/z初始化为0 a = 0;/a初始化为0 n = 0;/n初始化为0flex_unit:flex_unit()/析构函数 unsigned i=z;/获取分配单元数 while (i) / i-=1; /i递减1 ai = 0; delete a;/删除void flex_unit:reserve( unsigned x )/扩展存储区 if (x z)/如果x大于z unsigned * na = new unsignedx;/生成新的na for (unsigned i=0;in;i

13、+=1) nai = ai;/for循环,将已使用的数据拷贝到na delete a;/删除a a = na;/na赋值给a z = x;/x赋值给z /根据索引设置元素值void flex_unit:set( unsigned i, unsigned x ) if ( i n )/如果索引位置i小于n ai = x;/第i个单元值置为x if (x=0) /如果x等于0 while (n & an-1=0) /去除高位0 n-=1; /n每次递减1 else if ( x )/否则? reserve(i+1);/扩展,i+1 for (unsigned j=n;ji;j+=1) aj = 0

14、;/for循环,全部置为0 ai = x;/第i个单元值置为x n = i+1;/n置为i+1 #define BPU ( 8*sizeof(unsigned) ) /unsigned int类型bit数#define lo(x) ( (x) & (1 (BPU/2) ) /unsigned int高半部分#define lh(x) ( (x) (BPU/2) ) /使低半部分左移至高半部分void flex_unit:fast_mul( flex_unit &x, flex_unit &y, unsigned keep )/快速乘法 / *this = (x*y) % (2*keep) un

15、signed i,limit = (keep+BPU-1)/BPU; /运算结果单元数 reserve(limit); /扩展为limit for (i=0; ilimit) /取较小者 min = limit; for (i=0; ilimit) min = limit;/取min与limit之间的较小者 for ( unsigned j=i; jmin; j+=1 ) /此处代码为运算关键,可使用机器或汇编代码以加快速度,c:aj = aj + c + m*y.aj-i; unsigned w, v = aj, p = y.aj-i;/? v += c; c = ( v c );/? w

16、= lo(p)*lo(m); v += w; c += ( v w );/? w = lo(p)*hi(m); c += hi(w); w = lh(w); v += w; c += ( v w );/? w = hi(p)*lo(m); c += hi(w); w = lh(w); v += w; c += ( v w );/? c += hi(p) * hi(m);/? aj = v;/? while ( c & jlimit ) aj += c; c = aj c; j += 1; keep %= BPU; /去除不必要的bit if (keep) alimit-1 &= (1keep)

17、-1; while (limit & alimit-1=0) /计算使用单元数 limit-=1; n = limit;/limit赋值给n;/*-以上为flex_unit类定义与实现-*/*-以下为vlong_value类定义与实现-*/class vlong_value : public flex_unit /继承自flex_unit,负责vlong类内存管理/共有数据成员及成员函数 public: unsigned share;/共有 int is_zero() const;/ 测试大数是否为0 int test( unsigned i ) const;/测试第i位(bit)值是否为0

18、unsigned bits() const;/获取大数位(bit)数 int cf( vlong_value& x ) const;/比较大小 void shl();/左移 void shr();/右移 void shr( unsigned n );/左移n位 void add( vlong_value& x );/加法 void subtract( vlong_value& x );/减法 void init( unsigned x );/初始化函数 void copy( vlong_value& x );/拷贝 operator unsigned(); /转换至unsigned int类型,不安全 vlong_value();/构造函数 void mul( vlong_value& x, vlong_value& y );/乘法 void di

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1