网站大量收购闲置独家精品文档,联系QQ:2885784924

RSA 大数运算.docVIP

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
RSA 大数运算.doc

俺曾经查阅了网上找得到的各种用于实现RSA 的大数运算库,然而最终还是决定自己动手写一个。因为凡是效率高速度快的代码(crypto++、miracl、freelip、rsaref等),要么使用的数据结构过于复杂,要么编码风格杂乱无章,俺的水平和耐心都实在是有限,以至于无法读懂这些东西。而俺读得懂的一些代码,其实现方式却又过于幼稚,效率极低速度一塌糊涂。俺觉得像俺这样的人不在少数,于是决心写一个清晰易懂,效率也过得去的东西奉献给大家。 这个函数库刚做好的时候,生成1024位的随机密钥耗时大约5 分钟,俺认为是可以接受的。但后来找到一个叫tE! 的老外用miracl库写的RsaTools,发现其生成1024位的密钥耗时不超过三秒钟!于是俺针对俺的代码开始了艰苦的优化工作,希望能达到甚至超过这一水平?一周之后1024位密钥的平均生成时间已经降至5 秒左右,但是单单依靠优化代码来进一步提高速度也非常困难了。于是俺开始借助金山词霸来查阅能够通过google找到的一切与RSA 算法相关的论文,但是网上关于RSA算法的论述绝大多数都是用于硬件实现的,将其算法流程用软件设计语言来实现极其繁琐?而且俺发现这样做下去俺只会离自己的初衷越来越远: 俺的代码将不再清晰易懂?所以俺一度准备放弃? 准备放弃之后,心态平静了许多,再回头去看那些原来不太能够理解的RSA 算法原理,却发现其实也不是那么高深莫测,不急不躁地慢慢看,慢慢想,突然就一下子全明白了。一番改进之后,现在这个版本的函数库同样具有非常简单而清晰的结构,速度也不算慢,生成1024位的密钥在俺PIII 900的笔记本上平均耗时不超过两秒。程序使用C++ 编写,可在VC6.0 下直接编译通过,希望大家喜欢。如果发现Bug 或者有好的修改建议,俺将非常感谢您能够给俺一个Mail。 最后,感谢看雪论坛,感谢雪兄多次热心相助,俺在此学到了很多知识,当然 还要乘机拍拍马屁,感谢俺家甜甜的支持! afanty@ RSA 原理: 选取两个不同的大素数p、q,并计算N=p*q 选取小素数d,并计算e,使d*e % (p-1)(q-1)=1 对于任意AN: 若B=A**d % N 则A=B**e % N 可见d、e形成了非对称秘钥关系,加密者用公钥d加密,解密者可用私钥e解密,第三者即使拦截了密文B、公钥d和N,在不知道p、q的前提下,无法推算出e,从而无法获得明文A。当N取非常大的值时,将其因式分解成p、q是非常困难的,例如当N为1024 bit时,据分析,需动用价值数千万美金的大型计算机系统并耗费一年的时间? RSA 密钥的选取和加解密过程都非常简洁,在算法上主要要实现四个问题: 1 ?如何处理大数运算 2、如何求解同余方程 XY % M = 1 3 ?如何快速进行模幂运算 4 ?如何获取大素数 实际上,在实现RSA 算法的过程中大家会发现后三个问题不是各自独立的,它们互有关联,环环相套,相信届时你会意识到:RSA算法是一种“优美”的算法! RSA 依赖大数运算,目前主流RSA 算法都建立在1024位的大数运算之上。而大多数的编译器只能支持到64位的整数运算,即我们在运算中所使用的整数必须小于等于64位,即:0xffffffffffffffff,也就是18446744073709551615,这远远达不到RSA 的需要,于是需要专门建立大数运算库来解决这一问题。 最简单的办法是将大数当作数组进行处理,数组的各元素也就是大数每一位上的数字,通常采用最容易理解的十进制数字0—9。然后对“数字数组”编写加减乘除函数。但是这样做效率很低,因为二进制为1024位的大数在十进制下也有三百多位,对于任何一种运算,都需要在两个有数百个元素的数组空间上多次重循环,还需要许多额外的空间存放计算的进退位标志及中间结果。另外,对于某些特殊的运算而言,采用二进制会使计算过程大大简化,而这种大数表示方法转化成二进制显然非常麻烦,所以在某些实例中则干脆采用了二进制数组的方法来记录大数,当然这样效率就更低了? 一个有效的改进方法是将大数表示为一个n 进制数组,对于目前的32位系统而言n 可以取值为2 的32次方,即 0x100000000,假如将一个二进制为1024位的大数转化成0制,就变成了32位,而每一位的取值范围不再是二进制的0—1或十进制的0—9,而是0-0xffffffff,我们正好可以用一个32位的DWORD (如:无符号长整数,unsigned long) 类型来表示该值。所以1024位的大数就变成一个含有32个元素的 DWORD数组,而针对 DWORD数组进行各种运算所需的循环规模至多32次而已。而且0x100000000 进制与二进

文档评论(0)

克拉钻 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档