没有合适的资源?快使用搜索试试~ 我知道了~
RSA算法设计与实现.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 147 浏览量
2022-05-16
21:45:36
上传
评论
收藏 254KB PDF 举报
温馨提示
试读
19页
RSA算法设计与实现.pdf
资源详情
资源评论
资源推荐
.....
word 格式 .整理版
题目名称: RSA加密解密的设计与实现
姓 名:
学 号:
专 业:
武汉大学密码学课程设计报告
.....
word 格式 .整理版
一、 设计原理(算法工作原理)
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<r其中 Sum 表示求和, A表
示用以记录 A 的数组的第 i 个元素, ** 表示乘方。任何整数运算最终都能分解
成数字与数字之间的运算,在 0x100000000 进制下其“数字”最大达到
0xffffffff ,其数字与数字之间的运算,结果也必然超出了目前 32 位系统的字
长。在 VC++中,存在一个 __int64 类型可以处理 64 位的整数,所以不用担心这
一问题。
( 二) 加减乘除
设有大数 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<r,p>=q
则当 C=A+B、C=A-B、C=A*B时,我们都可以通过计算出 C来获得 C:C=A+B,显
然 C不总是等于 A+B,因为 A+B可能 >0xffffffff ,而 C必须 <=0xffffffff ,这
时就需要进位,当然在计算 C[i-1] 时也可能产生了进位,所以计算 C时还要加
上上次的进位值。如果用一个 64位变量 result 来记录和,另一个 32位变量 carry
来记录进位,则有:
carry=0
.....
word 格式 .整理版
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
.....
word 格式 .整理版
对于 C=A/B,由于无法将 B 对 A“试商”,我们只能转换成 B[q] 对 A[p] 的试商
来得到一个近似值,所以无法直接通过计算 C来获得 C,只能一步步逼近 C。由
于: B*(A[p]/B[q]-1)*0x100000000**(p-q)<C ,令: X=0,重复 A=A-X*B,
X=X+(A[p]/B[q]-1)*0x100000000**(p-q) ,直到 A<B则:X=A/B,且此时的 A=A%B,
注意对于任意大数 A*0x100000000**k ,都等价于将 A 的数组中的各元素左移 k
位,不必计算;同样, A/0x100000000**k 则等价于右移。
( 三) 欧几里得方程
在 RSA 算法中,往往要在已知 A、N的情况下,求 B ,使得 (A*B)%N=1。即
相当于求解 B、M都是未知数的二元一次不定方程 A*B-N*M=1 的最小整数解。 而
针对不定方程 ax-by=c 的最小整数解,有著名的欧几里德算法,即辗转相除法。
事实上二元一次不定方程有整数解的充要条件是 c 为 a、b 的最大公约数。即当
c=1 时,a、b 必须互质。而在 RSA算法里由于公钥 d 为素数,素数与任何正整数
互质,所以可以通过欧几里德方程来求解私钥 e。
欧几里德算法是一种递归算法,比较容易理解:
例如: 11x-49y=1,求 x
(a) 11 x - 49 y = 1 49%11=5 ->
(b) 11 x - 5 y = 1 11%5 =1 ->
(c) x - 5 y = 1
令 y=0 代入( c)得 x=1
令 x=1 代入( b)得 y=2
令 y=2 代入( a)得 x=9
同理可使用递归算法求得任意 ax-by=1 (a、b 互质)的解。实际上通过分
析归
纳将递归算法转换成非递归算法就变成了大衍求一术:
x=0,y=1
WHILE a!=0
i=y
y=x-y*a/b
x=i
i=a
a=b%a
b=i
IF x<0 x=x+b
RETURN x
( 四) 模幂运算
模幂运算是 RSA 的核心算法,最直接地决定了 RSA 算法的性能。针对快速
模幂运算这一课题, 西方现代数学家提出了大量的解决方案, 通常都是先将幂模
运算转化为乘模运算。例如求 D=C**15 % N,由于: a*b % n = (a % n)*(b % n) %
n,所以:
C1 =C*C % N =C**2 % N
C2 =C1*C % N =C**3 % N
C3 =C2*C2 % N =C**6 % N
C4 =C3*C % N =C**7 % N
C5 =C4*C4 % N =C**14 % N
剩余18页未读,继续阅读
weixin_40895192
- 粉丝: 17
- 资源: 21万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 下载安装这个软件.apk
- 【数据集详细解释及案例分析】数据集详细解释及案例分析
- 基于SHT71温湿度传感器、STM32F103C8T6、LCD1602温湿度采集显示系统proteus仿真设计
- 基于TH02温湿度传感器、STM32F103C8T6、LCD1602、FREERTOS的温湿度采集系统proteus仿真设计
- 【TCP-IP协议详细解释及案例分析】TCP-IP协议详细解释及案例分析
- 一文搞懂 LSTM(长短期记忆网络).rar
- 【autosar简介及基本案例解析】autosar简介及基本案例解析
- java模拟斗地主洗牌发牌
- springboot+vue登录系统 vue部分
- 常用常见 SQL语句语法
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0