RSA加密解密网络课程设计.doc

  1. 1、本文档共23页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
RSA加密解密网络课程设计.doc

计算机与信息学院 《计算机网络系统实践》报告 2007 年 7 月 一、设计要求 随机搜索大素数,随机生成公钥和私钥。 用公钥对任意长度的明文(字符)加密。 用私钥对密文解密。 界面简洁、友好便于操作。 二、开发环境与工具 硬件环境:PC机一台 软件环境:Windos 2000/XP, VC++6.0 三、设计原理 (一)RSA算法原理 首先,找出两个大素数key_P,key_Q,令key_N = key_P * key_Q。根据欧拉(Euler)数((key_N)的定义为小于key_N且与key_N互素的正整数个数,如果key_P和key_Q的最大公约数GCD(key_P,key_Q)=1,则((key_N)=((key_P) *((key_Q),特别地,如果若key_P != key_Q且都是素数,则((key_N)=(key_P-1)*(key_Q-1)。这时,我们令key_Z = ((key_N) = (key_P-1)*(key_Q-1)。并且,key_N公开,key_Z要保密。 然后,选择一个与key_Z互素的整数key_D,作为解密密钥。Key_D公开。 解同余方程key_E * key_D mod key_Z = 1。得到的key_E就是加密密钥。Key_E需要保密。 这个时候key_E一定存在。因为key_D和key_Z互素,根据欧几里德算法,GCD(key_D,key_Z) = 1,而扩展欧几里德算法key_D存在模key_Z乘法逆元的充分必要条件是GCD(key_D,key_Z) = 1。至于key_E怎么得到,用辗转相除法即可得到,下面还会就模key_Z的扩展欧几里德算法予以祥述。 接着做加密和解密信息处理。发送端将要发送信息为key_P,通过key_C = key_P^key_E mod key_N 进行处理,然后将密文key_C 发到接受端。这时即使中途有人窃取信息,也只能得到密文,而且,窃取者很难通过公钥(key_N,key_E)对密文进行解密。这时接受端接受到密文。并通过密钥(key_N,key_D)进行解密处理:key_P = key_C^key_D mod key_N。 (二)大数储存及运算原理 1.RSA?依赖大数运算,目前主流RSA?算法都建立在1024位的大数运算之上。 而大多数的编译器只能支持到64位的整数运算,即我们在运算中所使用的整数必须小于等于64位,即:0xffffffffffffffff,也就是18446744073709551615,这远远达不到RSA?的需要,于是需要专门建立大数运算库来解决这一问题。最简单的办法是将大数当作数组进行处理,也就是将大数用0—9这十个数字组成的数组进行表示,然后模拟人们手工进行“竖式计算”的过程编写其加减乘除函数但是这样做效率很低,因为二进制为1024位的大数其十进制也有三百多位,对于任何一种运算,都需要在两个有数百个元素的数组空间上做多重循环,还需要许多额外的空间存放计算的进退位标志及中间结果。另外,对于某些特殊的运算而言,采用二进制会使计算过程大大简化,这种大数表示方法转化成二进制显然非常麻烦,所以在某些实例中则干脆采用了二进制数组的方法来记录大数,这样效率就更低了。一个有效的改进方法是将大数表示为一个n?进制数组, n?可以取值为2?的次方,即0x1000,假如将一个二进制为1024位的大数转化成0x1000进制,它就变成了位,而每一位的取值范围就不是二进制的0—1或十进制的0—9,而是0-0xffff,我们正好可以用一个无符号整数来表示这一数值。所以1024位的大数就是一个有个元素的unsigned?数组,针对unsigned?数组进行各种运算所需的循环规模至多次而已。而且0x10000?进制与二进制,对于计算机来说,几乎是一回事,转换非常容易。A=Sum[i=0?to?p](A[i]*0x10000**i) ; B=Sum[i=0?to?q](B[i]*0x10000**i),p=qC=Sum[i=0?to?n](C[i]*0x10000**i)=A+B。如果用carry[i]记录每次的进位则有:C[i]=A[i]+B[i]+carry[i-1]-carry[i]*0x10000其中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]*0x10000**i) ; ?B=Sum[i=0?to?q](B[i]*0x10000**i),p=qC=Sum[i=0?to?n](C[i]*0x10000**i)=A*B。显然, C=Sum[i=0?to?n](

文档评论(0)

juhui05 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档