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协议开发的电子商务系统是绝对安全的。
另MD5加密算法:
1、MD5算法是对输入的数据进行补位,使得如果数据位长度LEN对512求余的结果
是448。
即数据扩展至K512+448位。即K64+56个字节,K为整数。
具体补位 *** 作:补一个1,然后补0至满足上述要求
2、补数据长度:
用一个64位的数字表示数据的原始长度B,把B用两个32位数表示。这时,数据
就被填
补成长度为512位的倍数。
3初始化MD5参数
四个32位整数(A,B,C,D)用来计算信息摘要,初始化使用的是十六进制表示
的数字
A=0X01234567
B=0X89abcdef
C=0Xfedcba98
D=0X76543210
4、处理位 *** 作函数
X,Y,Z为32位整数。
F(X,Y,Z)=X&Y|NOT(X)&Z
G(X,Y,Z)=X&Z|Y¬(Z)
H(X,Y,Z)=XxorYxorZ
I(X,Y,Z)=Yxor(X|not(Z))
5、主要变换过程:
使用常数组T[164],T[i]为32位整数用16进制表示,数据用16个32位的
整
数数组M[]表示。
具体过程如下:
/处理数据原文/
Fori=0toN/16-1do
/每一次,把数据原文存放在16个元素的数组X中/
Forj=0to15do
SetX[j]toM[i16+j]
end /结束对J的循环
/SaveAasAA,BasBB,CasCC,andDasDD/
AA=A
BB=B
CC=C
DD=D
/第1轮/
/以[abcdksi]表示如下 *** 作
a=b+((a+F(b,c,d)+X[k]+T[i])<<<s)/
/Dothefollowing16operations/
[ABCD071][DABC1122][CDAB2173][BCDA3224]
[ABCD475][DABC5126][CDAB6177][BCDA7228]
[ABCD879][DABC91210][CDAB101711][BCDA112212]
[ABCD12713][DABC131214][CDAB141715][BCDA152216]
/第2轮/
/以[abcdksi]表示如下 *** 作
a=b+((a+G(b,c,d)+X[k]+T[i])<<<s)/
/Dothefollowing16operations/
[ABCD1517][DABC6918][CDAB111419][BCDA02020]
[ABCD5521][DABC10922][CDAB151423][BCDA42024]
[ABCD9525][DABC14926][CDAB31427][BCDA82028]
[ABCD13529][DABC2930][CDAB71431][BCDA122032]
/第3轮/
/以[abcdksi]表示如下 *** 作
a=b+((a+H(b,c,d)+X[k]+T[i])<<<s)/
/Dothefollowing16operations/
[ABCD5433][DABC81134][CDAB111635][BCDA142336]
[ABCD1437][DABC41138][CDAB71639][BCDA102340]
[ABCD13441][DABC01142][CDAB31643][BCDA62344]
[ABCD9445][DABC121146][CDAB151647][BCDA22348]
/第4轮/
/以[abcdksi]表示如下 *** 作
a=b+((a+I(b,c,d)+X[k]+T[i])<<<s)/
/Dothefollowing16operations/
[ABCD0649][DABC71050][CDAB141551][BCDA52152]
[ABCD12653][DABC31054][CDAB101555][BCDA12156]
[ABCD8657][DABC151058][CDAB61559][BCDA132160]
[ABCD4661][DABC111062][CDAB21563][BCDA92164]
/然后进行如下 *** 作/
A=A+AA
B=B+BB
C=C+CC
D=D+DD
end/结束对I的循环/
6、输出结果。
C#作为一门适合微软平台上的程序开发语言,其难度高于Java而低于C++。
总体来说难度不是很大,但是对于初学者而言,难点就是所有面向对象语言的共性,即面向对象的思想,如果掌握了这个,C#就不觉得难了。
学C#就先慢慢学吧,多看看书,编编程。多看例子,理解思想。
算法和数据结构作为学程序的,那是必修,不求太深的话,学学常用算法如排序啊,查找啊之类的就行,数据结构学学链表,栈,队列之类的经典结构,然后能够使用语言提供的集合,字典等数据结构。
另外,学习面向对象编程有一定实力以后就可以学设计模式了,了解经典的设计模式也是很有帮助的。
对项目难度的计算,通常有两种方法:
1、用通过率计算难度,当项目以二分法计分(答对得分、答错不得分)时,难度一般用正确回答项目的人数与参加测验总人数的比值为指标。
2、用项目得分的平均值计算难度。当项目是用连续分数计分时,难度一般用参加测验的全体学生在该项目的平均分与该项目的满分的比值为指标。
对项目区分度的计算,通常有三种方法:
1、积差相关法。当项目和试题总分都采用连续分数计分时,可用积差相关法来计算项目的区分度。用变量X表示学生在某项目上的得分,用变量Y表示学生的测验总分,其积差相关系数即可代表该项目的区分度值。
2、点二列相关。当项目以二分法计分、测验成绩以连续分数表示时,可用点二列相关公式计算区分度。
3、用极端分组法计算区分度。是通过比较两个极端效标组(高分组和低分组)在同一项目上反应的差异来估计项目区分度。
数学建模编程算法难度取决于您的数学和编程能力,以及您要解决的问题的复杂程度。如果您对数学和编程有所了解,并且您要解决的问题不太复杂,那么您可以尝试自己解决问题。但是,如果您的数学和编程能力有限,或者您要解决的问题比较复杂,那么您可能需要寻求专业的帮助来完成数学建模编程算法。
学好C语言首先要学好他的语法,就比如说英语和语文,你必须要学好他的语法啊,并且要会用他的”单词”,然后就是算法了,这其中要有数学的计算和思想,但是你可以学好的,如果你学好VB那就更好了,因为VB和C语言、很都语法都是共通的.C重要的是思想和算法..
如果要成为高手的话,那就必须数学基础扎实,因为要到高级的话会用到很多的函数问题,编程也要逻辑性好,而且C就是一种模式,找到了很容易学的。
说实在的,有些东西当初我拿到书的时候是天天琢磨,月月思考,还真别说,有些当初我以为超级老难的问题就愣是这么给琢磨出来了。不过前提是我的数学和逻辑思维真的不错。
慢慢来啊,呵呵,就像当初我以为我自己也学不会,结果还是让我给征服了。其实入门比较困难一些,这都是过程,保持好的心态,如果真的想学就不要放弃,经过时间的积累我想一切都会晴朗的。
推荐题目:简单中等,经典TSP问题中等,状态压缩DP中等中等,树形DP。可参考《算法艺术与信息学竞赛》动态规划一节的树状模型中等,《算法艺术与信息学竞赛》中的习题中等,《算法艺术与信息学竞赛》中的习题中等,《算法艺术与信息学竞赛》中的习题中等,递推中等,需要减少冗余计算中等,四边形不等式的简单应用较难,状态压缩DP,《算法艺术与信息学竞赛》中有解答较难,《算法艺术与信息学竞赛》中有解答较难,需要配合数据结构优化(我的题目^_^)较难,写起来比较麻烦较难难,树形DP难,状态压缩DP,题目很有意思难非常难二搜索
参考资料:
参考资料:
参考资料:
以上就是关于行测难度5.1怎么算的全部的内容,包括:行测难度5.1怎么算的、md5 算法程序+详细注释,高分求教!、有没有加密算法提供,最好是复杂的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)