RSA运算原理介绍.docVIP

  1. 1、本文档共6页,可阅读全部内容。
  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运算原理 RSA 依赖大数运算,目前主流RSA 算法都建立在512 到1024位的大数运算之上。 而大多数的编译器只能支持到64位的整数运算,即我们在运算中所使用的整数必须小 于等于64位,即:0xffffffffffffffff,也就是18446744073709551615,这远远达不 到RSA 的需要,于是需要专门建立大数运算库来解决这一问题。 ??? 最简单的办法是将大数当作数组进行处理,也就是将大数用0—9这十个数字组成 的数组进行表示,然后模拟人们手工进行“竖式计算”的过程编写其加减乘除函数。 但是这样做效率很低,因为二进制为1024位的大数其十进制也有三百多位,对于任何 一种运算,都需要在两个有数百个元素的数组空间上做多重循环,还需要许多额外的 空间存放计算的进退位标志及中间结果。另外,对于某些特殊的运算而言,采用二进 制会使计算过程大大简化,这种大数表示方法转化成二进制显然非常麻烦,所以在某 些实例中则干脆采用了二进制数组的方法来记录大数,这样效率就更低了。 ??? 一个有效的改进方法是将大数表示为一个n 进制数组,对于目前的32位系统而言 n 可以取值为2 的32次方,即0假如将一个二进制为1024位的大数转化成 0制,它就变成了32位,而每一位的取值范围就不是二进制的0—1或十进 制的0—9,而是0-0xffffffff,我们正好可以用一个无符号长整数来表示这一数值。 所以1024位的大数就是一个有32个元素的unsigned long数组,针对unsigned long数 组进行各种运算所需的循环规模至多32次而已。而且0x100000000 进制与二进制,对 于计算机来说,几乎是一回事,转换非常容易。 ??? 例如大数18446744073709551615,等于 ffffffff ffffffff,就相当于十进制的 99:有两位,每位都是ffffffff。而18446744073709551616 等00000000就相当于十进制的100:有三位,第一位是1 ,其它两位是0,如此等等。 在实际应用中,“数字”数组的排列顺序采用低位在前高位在后的方式,这样,大数 A 就可以方便地用数学表达式来表示其值:A=Sum[i=0 to n](A[i]*0x100000000**i) (其中Sum 表示求和,A[i]表示用以记录A 的数组的第i 个元素,**表示乘方)。 ??? 任何整数运算最终都能分解成数字与数字之间的运算,在0x100000000 进制下其 “数字”最大达到0xffffffff,其数字与数字之间的运算,结果也必然超出了目前32 系统的字长。在VC++中,存在一个__int64 类型可以处理64位的整数,所以不用担心 这一问题,而在其它编译系统中如果不存在64位整形,就需要采用更小的进制方式来 存储大数,例如WORD类型(16位)可以用来表示0x10000 进制,但效率更高的办法还 是采用32位的DWORD 类型,只不过将0x100000000 进制改成0制,这样两 个数字进行四则运算的最大结果为 0x3fffffff * 0x3fffffff,小于0xffffffff,只 是不能简单地用高位低位来将运算结果拆分成两个“数字”。 加法 设: ? A=Sum[i=0 to p](A[i]*0x100000000**i) ? B=Sum[i=0 to q](B[i]*0x100000000**i),p=q ? C=Sum[i=0 to n](C[i]*0x100000000**i)=A+B 显然: ? C[i]不是简单地等于A[i]+B[i],因为如果C[i]0xffffffff就需要进位,当然计算 ? C[i-1]时也可能产生了进位,所以计算C[i]时还要加上上次的进位值。 如果用carry[i]记录每次的进位则有: ? C[i]=A[i]+B[i]+carry[i-1]-carry[i]*0x100000000 ? 其中carry[-1]=0 ? 若A[i]+B[i]+carry[i-1]0xffffffff,则carry[i]=1;反之则carry[i]=0 ? 若carry[p]=0,则n=p;反之则n=p+1 减法 设: ? A=Sum[i=0 to p](A[i]*0x100000000**i) ? B=Sum[i=0 to q](B[i]*0x100000000**i),p=q ? C=Sum[i=0 to n](C[i]*0x100000000**i)=A-B 显然: ? C[i]不是简单地等于A[i]-B[i],因为如果A[i]B[i]就需要借位,当然计算 ? C[i-1]时也

文档评论(0)

000 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档