预备知识
1)RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名。RSA以它的三个发明者Ron Rivest, Adi Shamir, Leonard Adleman的名字首字母命名,这个算法经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这恰恰说明该算法有一定的可信性,目前它已经成为最流行的公开密钥算法。
2) 什么是“素数”?
素数是这样的整数,它除了能表示为它自己和1的乘积以外,不能表示为任何其它两个整数的乘积。例如,15=3*5,所以15不是素数;又如,12=6*2=4*3,所以12也不是素数。另一方面,13除了等于13*1以外,不能表示为其它任何两个整数的乘积,所以13是一个素数。素数也称为“质数”。
3)什么是“互质数”(或“互素数”)?
数学教材对互质数是这样定义的:“公约数只有1的两个数,叫做互质数。”这里所说的“两个数”是指自然数。
-
判别方法主要有以下几种(不限于此):
(1)两个质数一定是互质数。例如,2与7、13与19。
(2)一个质数如果不能整除另一个合数,这两个数为互质数。例如,3与10、5与26。
(3)1不是质数也不是合数,它和任何一个自然数在一起都是互质数。如1和9908。
(4)相邻的两个自然数是互质数。如15与16。
(5)相邻的两个奇数是互质数。如49与51。
(6)大数是质数的两个数是互质数。如97与88。
(7)小数是质数,大数不是小数的倍数的两个数是互质数。如7和16。
(8)两个数都是合数(二数差又较大),小数所有的质因数,都不是大数的约数,这两个数是互质数。如357与715,357=3×7×17,而3、7和17都不是715的约数,这两个数为互质数。等等。
4)非对称加密算法(asymmetric cryptographic algorithm)又名“公开密钥加密算法”,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
5) 什么是模指数运算?
模运算是整数运算,有一个整数m,以n为模做模运算,即m mod n。怎样做呢?让m去被n整除,只取所得的余数作为结果,就叫做模运算。例如,10 mod 3=1;26 mod 6=2;28 mod 2 =0等等。模指数运算就是先做指数运算,取其结果再做模运算。如53 mod 7=125 mod 7=6。
6)RSA安全性分析
在公布RSA算法之后,在使用RSA密码体制和分析RSA算法发现了一系列的算法本身脆弱性及其存在的问题。
(1)RSA公钥密码体制在加密或解密变化中涉及大量的数值计算,其加密和解密的运算时间比较长,这比数据加密标准DES的计算量开销大,在一定程度上限制了它的应用范围,以致于实际使用RSA密码体制无法用软件产品,必须用超大规模集成电路的硬件产品。
(2)虽然提高N=P*Q的位数会大大提高RSA密码体制的安全性,但其计算量呈指数增长,以致使其实现的难度增大,实用性降低。
(3)RSA公钥密码体制的算法完整性(指密钥控制加密或解密变换的唯一性)和安全性(指密码算法除密钥本身外,不应该存在其它可破译密码体制的可能性)沿有等进一步完善。
(4)RSA算法面临着数学方法的进步和计算机技术飞跃发展带来的破译密码能力日趋增强的严重挑战。因子分解问题有了长跑的发展,1995年人类成功地分解了128位十进制数RSA密码算法,破译512位长的RSA指日可待。
尽管如此,自1978年RSA算法公布以来,公开密钥密码已从理论研究进入实际应用研究阶段。RSA公开密钥密码算法在信息交换过程中使用比较广泛,安全性比较高。以当前的计算机水平,如选择1024位长的密钥(相当于300位十进制数字)就认为是无法攻破的。
7)CAP(Cryptographic Analysis Program)是由DR. Richard Spillman专门为教学而研制的密码制作与分析工具,已经在美国的很多高校得到了广泛地使用,受到了密码学习者的普遍欢迎。
-
公钥和私钥的简单理解
初学的话对于公钥和私钥的理解是一个问题(我自己就是这样(*/ω\*),所以我们再来说一下对于公钥和私钥的一个简单的认识。我在网上找了一篇我理解了下面放出来让大家参考一下, 原文地址:https://blog.csdn.net/tabactivity/article/details/49685319
一、公钥加密
假设一下,我找了两个数字,一个是1,一个是2。我喜欢2这个数字,就保留起来,不告诉你们(私钥),然后我告诉大家,1是我的公钥。
我有一个文件,不能让别人看,我就用1加密了。别人找到了这个文件,但是他不知道2就是解密的私钥啊,所以他解不开,只有我可以用
数字2,就是我的私钥,来解密。这样我就可以保护数据了。
我的好朋友x用我的公钥1加密了字符a,加密后成了b,放在网上。别人偷到了这个文件,但是别人解不开,因为别人不知道2就是我的私钥,
只有我才能解密,解密后就得到a。这样,我们就可以传送加密的数据了。
二、私钥签名
如果我用私钥加密一段数据(当然只有我可以用私钥加密,因为只有我知道2是我的私钥),结果所有的人都看到我的内容了,因为他们都知
道我的公钥是1,那么这种加密有什么用处呢?
但是我的好朋友x说有人冒充我给他发信。怎么办呢?我把我要发的信,内容是c,用我的私钥2,加密,加密后的内容是d,发给x,再告诉他
解密看是不是c。他用我的公钥1解密,发现果然是c。
这个时候,他会想到,能够用我的公钥解密的数据,必然是用我的私钥加的密。只有我知道我得私钥,因此他就可以确认确实是我发的东西。
这样我们就能确认发送方身份了。这个过程叫做数字签名。当然具体的过程要稍微复杂一些。用私钥来加密数据,用途就是数字签名。
举例
比如有两个用户Alice和Bob,Alice想把一段明文通过双钥加密的技术发送给Bob,Bob有一对公钥和私钥,那么加密解密的过程如下:
- Bob将他的公开密钥传送给Alice。
- Alice用Bob的公开密钥加密她的消息,然后传送给Bob。
- Bob用他的私人密钥解密Alice的消息。
上面的过程可以用下图表示,Alice使用Bob的公钥进行加密,Bob用自己的私钥进行解密。
RSA加解密算法的原理
首先产生密钥,过程如下:
随机产生两个长度为K/2位的素数P 和 Q;
计算公钥 publicKey=P*Q;(publicKey 是k位的长度)
随机产生一个加密密钥 keyE, 2<=keyE<=Φ(n)-1其中GCD(keyE, Φ(n))=1;注:这是保证解密密钥keyE *keyD mod Φ(n)=1 有解的充要条件,Φ(n)称为n的欧拉函数,值为: Φ(n)=(P-1)*(Q-1)
求解解密密钥keyD=keyE-1 mod (n) ,keyE-1为解密密钥keyD的逆元 ,此公式原方程为(keyE*keyD mod (n)=1)
由此公钥,加密密钥,解密密钥全部产生。
其次,对明文加密或对密文进行解密,过程如下:
(1) 加密: C = MkeyE mod publicKey;其中M表示明文,C表示密文
(2) 解密: M = CkeyD mod publicKey. 其中M表示明文,C表示密文
RSA加密学习的简单例子(转载)
我在网上看到一篇文章如下,通过简单的举例,我更理解了RSA算法的神奇,作者的举例很棒。
在RSA中,最大值(称为max)由随机挑选的两个素数相乘而得。公钥和密钥在0和最大值之间挑选(称为pub和priv)。为了加密一个数字,让这个数字自己乘自己pub次,并确保当乘积大于最大值时能够回折(像时钟一样)。解密时,再用这个加密得到的结果自己乘自己priv次,便能退回到原始的数字。这是一件很神奇的事情!但是它确实被实现了。
为了创建RSA密钥对,首先得随机的挑选两个素数来计算出max。然后从0到max中再挑选出公钥pub,只要知道两个素数,那么就能够从pub中算出私钥。这就是为什么因式分解与破解RSA有关—对max的因式分解,可以得到两个素数,这样你便能够通过pub计算出某人的私钥,从而来解密消息。
让我们举一个更加具体的例子吧。挑选素数13和7。他们积为91,也就是max。从0到91中挑选5作为pub来加密。利用算法Extended Euclidean,输入参数:7,13,5,得到私钥是29。
三个参数(max:91,pub:5,priv:29)定义了RSA系统。这时,可以取一个数字,通过乘自己5次来加密自己,然后取这个结果乘自己29次来回到原来的数字。
让我们来加密“CLOUD”。为了能够用数学来表示一个消息,我们必须将字母转变为数字。一个常用的转换方法是UTF-8。每个字母对应一个数字,如下图:
经过编码后的“CLOUD”是67,76,79,85,68。每个数字都小于最大值91,所以我们能够各自对他们进行加密,为了简便,我们以第一个字母为例:
我们让67乘5次来加密自己:
67x67=4489=30(回折)
(回折:因为4489大于最大值max,所以我们必须回折它。我们将它除以91然后取余数,
4489=91x49+30)
30x67=2010=8
8x67=536=81
81x67=5427=58
这个结果说明67加密后为58。
为每个字母重复这个过程,我们可以加密CLOUD。
为了解密,我们需要让58乘自己29次。
58x58=3364=88
88x58=5104=8
…
9x58=522=67
神奇的事情发生了!我们变回了67。
RSA加密学习的简单例子 原文地址:https://blog.csdn.net/dianqu6970/article/details/76527572
两道简单的选择题如下:
1、在密码学中,对RSA的描述是正确的是?
- A:RSA是秘密密钥算法和对称密钥算法
- B:RSA是非对称密钥算法和公钥算法
- C:RSA是秘密密钥算法和非对称密钥算法
- D:RSA是公钥算法和对称密钥算法
RSA就是非对称的密钥算法 ,也是公钥算法啊
2、在RSA公钥密码系统中,若A想给B发送一封邮件,并且想让B知道邮件是A发出的,则A应选用的签名密钥是A的私钥,加密时用对方的公钥,这种做法正确吗?
![](http://www.hetianlab.com/img/expanipulator/right.png)
- A:正确
- B:错误
私钥用于数字签名,公钥用于验证,让B知道是A发出的当然得用A的私钥啊~
公钥和私钥是成对的,它们互相解密。
公钥加密,私钥解密。
私钥数字签名,公钥验证。