| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2659 人关注过本帖
标题:关于RSA加密算法的实现.
只看楼主 加入收藏
fxzmodel
Rank: 2
等 级:新手上路
威 望:4
帖 子:50
专家分:0
注 册:2006-2-20
收藏
 问题点数:0 回复次数:15 
关于RSA加密算法的实现.
各位老大,最近我在研究RSA加密技术,在加密c=m^e mod n和解密 m=c^d mod n中涉及到大整数的指数运算.从理论上讲在加密过程中应该先求出明文(M)的E次幂然后在与N进行模数运算算出密文C.(解密过程与此类似)但是在实用化的过程中E一般选择费马数中的65537,要对一个数字进行如此大的指数运算,速度非常之慢.在解密过程中基于安全考虑密匙中的D长度更是高达128位以上.要对其进行指数运算几乎不可能.后来翻到一些相关的资料,将c=m^e mod n变形为c=(m mod n)1*(m mod n)2*.........(m mod n)e.效率有所提高但速度仍然非常缓慢,但是我看到别人写的RSA加密程序速度却很快.那位老大能够赐教一下,在实用话的RSA加密程序中这一过程一般是如何实现的.
搜索更多相关主题的帖子: RSA 算法 
2006-09-21 21:32
cwande
Rank: 2
等 级:新手上路
威 望:3
帖 子:333
专家分:0
注 册:2006-8-18
收藏
得分:0 

c=m^e mod n变形为c=(m mod n)1*(m mod n)2*.........(m mod n)e
这个复杂度是O(E)的,E=65537,这应该不会慢啊


汗,都懒得写代码了.......... cheat了一个威望,哈.....
2006-09-21 21:36
fxzmodel
Rank: 2
等 级:新手上路
威 望:4
帖 子:50
专家分:0
注 册:2006-2-20
收藏
得分:0 
我也搞不清楚是为什么.由于RSA加密涉及到大整数的运算,所以在源程序的设计的时候为了避免溢出,不能直接使用程序中整数类型的四则运算.必须另外设计大整数四则运算的函数.我所采用的方式是将数字以字符串的形式存储,然后对其进行逐位运算.不知道是不是这种设计思想自身的缺陷导致了低下的效率..我都晕了,一周了毫无头绪,不知道如何解决这个问题.
2006-09-21 21:53
cwande
Rank: 2
等 级:新手上路
威 望:3
帖 子:333
专家分:0
注 册:2006-8-18
收藏
得分:0 

你的c,e,m,d的范围差不多是多少


汗,都懒得写代码了.......... cheat了一个威望,哈.....
2006-09-21 22:00
fxzmodel
Rank: 2
等 级:新手上路
威 望:4
帖 子:50
专家分:0
注 册:2006-2-20
收藏
得分:0 
M是将明文转换为ASCII的值数字长度不会大于4位,而C为加密后的密文取决与E和D的长度.E的长度为5位,而D的长度至少会有128位.
2006-09-21 22:12
cwande
Rank: 2
等 级:新手上路
威 望:3
帖 子:333
专家分:0
注 册:2006-8-18
收藏
得分:0 
那根本就不需要用字符数组,
用整形就可以了,很快的

汗,都懒得写代码了.......... cheat了一个威望,哈.....
2006-09-21 22:24
fxzmodel
Rank: 2
等 级:新手上路
威 望:4
帖 子:50
专家分:0
注 册:2006-2-20
收藏
得分:0 

?不是吧?N的值是两个长度在90位以上的大素数P,Q.作P*Q后的乘积.其长度高达180位左右.用常规的办法做MOD运算不要说运算就是存储也是一个问题呀.


PS:顺便说一下,如不特殊说明前面提到的数位长度均是指的10进值长度.

[此贴子已经被作者于2006-9-22 2:00:34编辑过]

2006-09-21 22:30
cwande
Rank: 2
等 级:新手上路
威 望:3
帖 子:333
专家分:0
注 册:2006-8-18
收藏
得分:0 
汗,我没想到N的整数这么大
不过求a^b mod c有log(b)的算法

汗,都懒得写代码了.......... cheat了一个威望,哈.....
2006-09-21 23:06
fxzmodel
Rank: 2
等 级:新手上路
威 望:4
帖 子:50
专家分:0
注 册:2006-2-20
收藏
得分:0 
呵呵,不好意思,前面关于N是我没有交代清楚.
2006-09-21 23:41
cwande
Rank: 2
等 级:新手上路
威 望:3
帖 子:333
专家分:0
注 册:2006-8-18
收藏
得分:0 

这简直不可能,
如果d是128位的整数的话,写出来的程序的复杂度那岂不是O(10^128)
根本不可能实现啊............
[QUOTE]RSA加密算法
该算法于1977年由美国麻省理工学院MIT(Massachusetts Institute of Technology)的Ronal Rivest,Adi Shamir和Len Adleman三位年轻教授提出,并以三人的姓氏Rivest,Shamir和Adlernan命名为RSA算法。该算法利用了数论领域的一个事实,那就是虽然把两个大质数相乘生成一个合数是件十分容易的事情,但要把一个合数分解为两个质数却十分困难。合数分解问题目前仍然是数学领域尚未解决的一大难题,至今没有任何高效的分解方法。与Diffie-Hellman算法相比,RSA算法具有明显的优越性,因为它无须收发双方同时参与加密过程,且非常适合于电子函件系统的加密。
RSA算法可以表述如下:
(1) 密钥配制。假设m是想要传送的报文,现任选两个很大的质数p与q,使得:
(12-1);
选择正整数e,使得e与(p-1)(q-1)互质;这里(p-1)(q-1)表示二者相乘。再利用辗转相除法,求得d,使得:
(12-2);
其中x mod y是整数求余运算,其结果是x整除以y后剩余的余数,如5 mod 3 = 2。
这样得:
(e,n),是用于加密的公共密钥,可以公开出去;以及
(d,n),是用于解密的专用钥匙,必须保密。
(2) 加密过程。使用(e,n)对明文m进行加密,算法为:
(12-3);
这里的c即是m加密后的密文。
(3) 解密过程。使用(d,n)对密文c进行解密,算法为:
(12-4);
求得的m即为对应于密文c的明文。
RSA算法实现起来十分简捷,据说英国的一位程序员只用了3行Perl程序便实现了加密和解密运算。
RSA算法建立在正整数求余运算基础之上,同时还保持了指数运算的性质,这一点我们不难证明。例如:
(12-5);
(12-6)。
RSA公共密钥加密算法的核心是欧拉(Euler)函数ψ。对于正整数n,ψ(n)定义为小于n且与n互质的正整数的个数。例如ψ(6) = 2,这是因为小于6且与6互质的数有1和5共两个数;再如ψ(7) = 6,这是因为互质数有1,2,3,5,6共6个。
欧拉在公元前300多年就发现了ψ函数的一个十分有趣的性质,那就是对于任意小于n且与n互质的正整数m,总有mψ(n) mod n = 1。例如,5ψ(6) mod 6 = 52 mod 6= 25 mod 6 =1。也就是说,在对n求余的运算下,ψ(n)指数具有周期性。
当n很小时,计算ψ(n)并不难,使用穷举法即可求出;但当n很大时,计算ψ(n)就十分困难了,其运算量与判断n是否为质数的情况相当。不过在特殊情况下,利用ψ函数的两个性质,可以极大地减少运算量。
性质1:如果p是质数,则ψ(p) = (p-1)。
性质2:如果p与q均为质数,则ψ(p·q) = ψ(p)·ψ(q) = (p-1)(q-1)。
RSA算法正是注意到这两条性质来设计公共密钥加密系统的,p与q的乘积n可以作为公共密钥公布出来,而n的因子p和q则包含在专用密钥中,可以用来解密。如果解密需要用到ψ(n),收信方由于知道因子p和q,可以方便地算出ψ(n) = (p-1)(q-1)。如果窃听者窃得了n,但由于不知道它的因子p与q,则很难求出ψ(n)。这时,窃听者要么强行算出ψ(n),要么对n进行因数分解求得p与q。然而,我们知道,在大数范围内作合数分解是十分困难的,因此窃密者很难成功。
有了关于ψ函数的认识,我们再来分析RSA算法的工作原理:
(1) 密钥配制。设m是要加密的信息,任选两个大质数p与q,使得 ;选择正整数e,使得e与ψ(n) = (p-1)(q-1)互质。
利用辗转相除法,计算d,使得ed mod ψ(n) = ,即ed = kψ(n) +1,其中k为某一正整数。
公共密钥为(e,n),其中没有包含任何有关n的因子p和q的信息。
专用密钥为(d,n),其中d隐含有因子p和q的信息。
(2) 加密过程。使用公式(12-3)对明文m进行加密,得密文c。
(3) 解密过程。使用(d,n)对密文c进行解密,计算过程为:
cd mod n = (me mod n)d mod n
= med mod n
= m(kψ(n) + 1) mod n
= (mkψ(n) mod n)·(m mod n)
= m
m即为从密文c中恢复出来的明文。
例如,假设我们需要加密的明文代码信息为m = 14,则:
选择e = 3,p = 5,q = 11;
计算出n = p·q = 55,(p-1)(q-1) = 40,d = 27;
可以验证:(e·d) mod (p-1)(q-1) = 81 mod 40 = 1;
加密:c = me mod n = 143 mod 55 = 49;
解密:m = cd mod n = 4927 mod 55 = 14。
关于RSA算法,还有几点需要进一步说明:
(1) 之所以要求e与(p-1)(q-1)互质,是为了保证 ed mod (p-1)(q-1)有解。
(2) 实际操作时,通常先选定e,再找出并确定质数p和q,使得计算出d后它们能满足公式(12-3)。常用的e有3和65537,这两个数都是费马序列中的数。费马序列是以17世纪法国数学家费马命名的序列。
(3) 破密者主要通过将n分解成p·q的办法来解密,不过目前还没有办法证明这是唯一的办法,也可能有更有效的方法,因为因数分解问题毕竟是一个不断发展的领域,自从RSA算法发明以来,人们已经发现了不少有效的因数分解方法,在一定程度上降低了破译RSA算法的难度,但至今还没有出现动摇RSA算法根基的方法。
(4) 在RSA算法中,n的长度是控制该算法可靠性的重要因素。目前129位、甚至155位的RSA加密勉强可解,但目前大多数加密程序均采用231、308甚至616位的RSA算法,因此RSA加密还是相当安全的。
据专家测算,攻破512位密钥RSA算法大约需要8个月时间;而一个768位密钥RSA算法在2004年之前无法攻破。现在,在技术上还无法预测攻破具有2048位密钥的RSA加密算法需要多少时间。美国Lotus公司悬赏1亿美元,奖励能破译其Domino产品中1024位密钥的RSA算法的人。从这个意义上说,遵照SET协议开发的电子商务系统是绝对安全的。[/QUOTE]
我搜了一下,d是要求出来,而不是固定的大整数啊......


汗,都懒得写代码了.......... cheat了一个威望,哈.....
2006-09-22 00:30
快速回复:关于RSA加密算法的实现.
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.035108 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved