RSA算法设计与实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
武汉大学密码学课程设计报告题目名称:RSA加密解密的设计与实现姓名:学号:专业:
设计原理(算法工作原理)一、RSA 原理:RSA 密钥的选取和加解密过程都非常简洁,在算法上主要要实现四个问题:1、如何处理大数运算2、如何求解同余方程 XY % M = 1 3、如何快速进行模幂运算 4、如何获取大素数 (一) 大数存储 RSA 依赖大数运算,目前主流RSA 算法都建立在1024位的大数运算之上。而大多数的编译器只能支持到64位的整数运算,即我们在运算中所使用的整数必须小于等于64位,即:0xffffffffffffffff,也就是18446744073709551615,这远远达不到RSA 的需要,于是需要专门建立大数运算库来解决这一问题。一个有效的改进方法是将大数表示为一个n 进制数组,对于目前的32位系统而言n 可以取值为2 的32次方,即0x100000000,假如将一个二进制为1024位的大数转化成0x10000000进制,就变成了32位,而每一位的取值范围不再是二进制的0—1或十进制
的0—9,而是0-0xffffffff,我们正好可以用一个32位的DWORD (如:无符号长整数,unsigned long)类型来表示该值。所以1024位的大数就变成一个含有32个元素的DWORD数组,而针对DWORD数组进行各种运算所需的循环规模至多32次而已。而且0x100000000 进制与二进制,对于计算机来说,几乎是一回事,转换非常容易。例如:大数18446744073709551615,等于0xffffffff ffffffff,就相当于十进制的99:有两位,每位都是0xffffffff。而18446744073709551616等于0x00000001;00000000 00000000,就相当于十进制的100:有三位,第一位是1 ,其它两位都是0 ,如此等等。在实际应用中,“数字数组”的排列顺序采用低位在前高位在后的方式,这样,大数 A 就可以方便地用数学表达式来表示其值:A=Sum[i=0 to n](A*r**i),r=0x100000000,0<=A 大数A、B和C,其中A>=B: A=Sum[i=0 to p](A*r**i) B=Sum[i=0 to q](B*r**i) C=Sum[i=0 to n](C*r**i) r=0x100000000,0<=A,B,C FOR i FROM 0 TO p result=A+B+carry C=result%0x100000000 carry=result/0x100000000 IF carry=0 n=p ELSE n=p+1 C=A-B,同理C不总是等于A-B,因为A-B可能<0,而C必须>=0,这时就需要借位,同样在计算C[i-1]时也可能产生了借位,所以计算C 时还要减去上次的借位值: carry=0 FOR i FROM 0 TO p IF A-B-carry>=0 C=A-B-carry carry=0 ELSE C=0x100000000+A-B-carry carry=1 n=p WHILE C[n]=0 n=n-1 C=A*B,首先我们需要观察日常做乘法所用的“竖式计算”过程: A3 A2 A1 A0 * B2 B1 B0 ------------------------------- = A3B0 A2B0 A1B0 A0B0 + A3B1 A2B1 A1B1 A0B1 + A3B2 A2B2 A1B2 A0B2 ------------------------- ------ = C5 C4 C3 C2 C1 C0 可以归纳出:C=Sum[j=0 to q](A[i-j]*B[j]),其中i-j必须>=0且<=p。当然这一结论没有考虑进位,虽然计算A[i-j]*B[j]和Sum的时候都可能发生进位,但显然这两种原因产生的进位可以累加成一个进位值。最终可用如下算法完成乘法: n=p+q-1 carry=0 For i FROM 0 TO n result=carry For j FROM 0 TO q IF 0<=i-j<=p result=result+A[i-j]*B[j] C=result%0x100000000 carry=result/0x100000000 IF carry!=0 n=n+1 C[n]=carry 对于C=A/B,由于无法将B 对A“试商”,我们只能转换成B[q]对A[p]的试商来得到一个近似值,所以无法直接通过计算C来获得C,只能一步步逼近C。由于:B*(A[p]/B[q]-1)*0x100000000**(p-q) X=0,重复A=A-X*B,X=X+(A[p]/B[q]-1)*0x100000000**(p-q),直到A