来自知乎提问 https://www.zhihu.com/question/25912483算法
RSA 加密方案和 RSA 签名方案是不一样的,具体的不一样点在 安全
的回答里讲得很清楚。我在这里主要是想谈一下加密方案里的状况。
在 RSA 加密方案中,选定了 计算出
,再在小于
的正整数中选一个和它互素的
做为公钥,它模
的乘法逆元
则为私钥。公开
,保留
。网络
结论:公钥 用来加密,私钥
用来解密。函数
想要反驳的是这个说法工具
私钥加密公钥能够解密
公钥加密私钥能够解密
两个大质数(p,q)乘积(n)难以逆向求解,因此pq是对等的,公钥和私钥也是对等的。
匿名用户:RSA的公钥和私钥到底哪一个才是用来加密和哪一个用来解密?
这样说的话就有三种情形。咱们一一分析:性能
1、公钥和私钥都保密
也就是说,Alice 和 Bob 同时分享一组密钥 ,而后约定
或
为加密密钥,另外一个为解密密钥。这样作当然是能够的,但违背了公钥加密方案的初衷。公钥加密的设计就是为了公开加密密钥,让全部人均可以给某我的发送消息。学习
这种场景彻底应该使用对称加密算法,加解密的效率和安全性都更高。加密
2、公钥公开,私钥保密
在这种状况下,用私钥加密公钥解密是不可能的。由于密码学的假设是:一个合格的加密方案,敌手拿到密文 不能恢复出明文
。这样作的结果是,全部人均可以解密信息,毫无心义。与之对应的有意义的是签名方案,具体参考开头我提到的刘巍然的答案。spa
3、公钥保密,私钥公开
这其实才是那个答案的意思:生成的公钥 和私钥
是对等的,只是两个数而已。把它们哪一个公开出去用于加密,哪一个保留起来用于解密,都是同样的。.net
但严格地讲,这种说法是错误的。
对于最基本的 RSA 方案(即“教科书式的 RSA 方案”),这么作是能够顺利地完成加解密的。可是仅仅是理论上成立。由于在实际中,敌手能够利用各类可能的方法去攻击咱们的密码方案。而为了不这些攻击,咱们对方案中每一个参数的选取都有很是严格的要求。很天然地,公钥 和私钥
的要求就是大相径庭的。好比说我按照密码标准生成了密钥,把公钥留下来解密,把私钥公布出去。在敌手眼中,个人公钥其实就是私钥,但这个公钥显然是不知足密码标准的要求的,因此敌手极可能能够破解个人密码方案。
好比说,咱们的私钥不能过小。由于若是 ,敌手就能够在
的线性时间内找到
。而公钥
也不能过小,但这里的不能过小只是为了抵挡广播攻击。对于 1024bit 的
,私钥
至少是 256bit 的(关于私钥
不能过小还有一个更 trivial 的缘由,敌手能够经过枚举在至多
的时间内获得
);而
取 65537 也是容许的,这里的
只有 17bit 。
若是取一个 17bit 的私钥,你还能期望你的密码方案是安全的吗?impossible。
固然你能够说,我让公钥和私钥都达到 的级别。且不说除此以外还会有别的要求,你要知道 RSA 的加解密都是要算不少大指数取模的,原本就很慢。
取 65537 就很好算(由于这数二进制就俩位置是 1),而解密的时候能够用中国剩余定理,因此省点时间(由于解密的人是容许知道
的分解的,他最后要计算的是
,能够分别计算
再用中国剩余定理获得结果)。你这样让加密的人也得用 256bit 且不知道有几位是 1 的密钥加密,得浪费多少计算力,并且毫无心义啊。
综上所述,仅仅从最基础的原理角度,RSA 的公私钥互换也能够成功加解密。但实际上,公钥和私钥有彻底不一样的要求,这些要求保证了 RSA 加密方案尽量地更安全高效。在这种状况下,公钥用来公开并加密,私钥用来保留解密,且不可互换。
取一对互质的数好比p, q
p = 61
q = 53
n = p * q = 61 * 53 = 3233
欧拉n = (p-1) * (q-1) = 60 * 52 = 3120
求e;要求 1 < e < 欧拉n 且 e 和 欧拉n 互质; 数有不少,好比17
e = 17
求d;要求 e * d % 欧拉n = 1
转化公式 x * e + 欧拉n * y = 1 ; 17x + 3120y = 1 ; 算出x = 2753,y = -15
验证要求 17 * 2753 % 3120 = 1
d = 2753
钥匙A为: n和e
钥匙B为: n和d
用钥匙A加密 123
123 ** e % n = 123 ** 17 % 3233 = 855
用钥匙B解密 855
855 ** d % n = 855 ** 2753 % 3233 = 123
用钥匙B加密 99
99 ** d % n = 99 ** 2753 % 3233 = 89
用钥匙A解密 89
89 ** e % n = 89 ** 17 % 3233 = 99
【总结】
不知道pq的状况下:
钥匙A 不hen能nan 算出 钥匙B
钥匙B 也不hen能nan 算出 钥匙A
! e和d 哪一个标记为公钥,在性能和安全性上 貌似有差异,一般e被标记为公钥
! 大多数工具生成的私钥是包含pq的
-------------------------------------------------------------------
连接:https://www.zhihu.com/question/25912483/answer/31653639
来源:知乎
著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。
感谢 、 等人的指正。刚刚才注意到有笔误,群中的模运算都应该是N下的。
另外,有评论说要求e和\phi(N)互素。我之因此没这么写,是由于咱们应该在Z_N群中选择元素,若是在这个群里面选,那么选出的e必定是和\phi(N)互素的。反过来讲,若是e和\phi(N)互素,才能是Z_N中的元素。
=====================
休息完毕,开始进入答题时间!
在回答以前我看了一下已经有的答案,我我的感受不太舒服… 首先,题主既然提出了问题,咱们仍是应该用心来答,而不是打击题主的信心… 其次,题主有这个问题的本质缘由是由于RSA体制自己的一个特色决定的。我相信题主在提问前已经进行了不少的资料搜索和查找工做,甚至有可能阅读了RSA那篇原始论文。所以,咱们应该更多地考虑:
- 为何题主会提出这个问题,这个问题的本质缘由来自于哪里?
- 咱们如何进行详细的解答,帮助题主解决这个问题。
最后,一些答案自己可能会误导你们,因此还请仔细斟酌后再进行回答。
=================分割线=================
咱们来回顾一下RSA的加密算法。咱们从公钥加密算法和签名算法的定义出发,用比较规范的语言来描述这一算法。
RSA公钥加密体制包含以下3个算法:KeyGen(密钥生成算法),Encrypt(加密算法)以及Decrypt(解密算法)。
。密钥生成算法以安全常数
做为输入,输出一个公钥PK,和一个私钥SK。安全常数用于肯定这个加密算法的安全性有多高,通常以加密算法使用的质数p的大小有关。
越大,质数p通常越大,保证体制有更高的安全性。在RSA中,密钥生成算法以下:算法首先随机产生两个不一样大质数p和q,计算N=pq。随后,算法计算欧拉函数
。接下来,算法随机选择一个小于
的整数e,并计算e关于
的模反元素d。最后,公钥为PK=(N, e),私钥为SK=(N, d)。
。加密算法以公钥PK和待加密的消息M做为输入,输出密文CT。在RSA中,加密算法以下:算法直接输出密文为
。解密算法以私钥SK和密文CT做为输入,输出消息M。在RSA中,解密算法以下:算法直接输出明文为
。因为e和d在
下互逆,所以咱们有:
因此,从算法描述中咱们也能够看出:公钥用于对数据进行加密,私钥用于对数据进行解密。固然了,这个也能够很直观的理解:公钥就是公开的密钥,其公开了你们才能用它来加密数据。私钥是私有的密钥,谁有这个密钥才可以解密密文。不然你们都能看到私钥,就都能解密,那不就乱套了。
=================分割线=================
咱们再来回顾一下RSA签名体制。签名体制一样包含3个算法:KeyGen(密钥生成算法),Sign(签名算法),Verify(验证算法)。
。密钥生成算法一样以安全常数
做为输入,输出一个公钥PK和一个私钥SK。在RSA签名中,密钥生成算法与加密算法彻底相同。
。签名算法以私钥SK和待签名的消息M做为输入,输出签名
。在RSA签名中,签名算法直接输出签名为
。注意,签名算法和RSA加密体制中的解密算法很是像。
。验证算法以公钥PK,签名
以及消息M做为输入,输出一个比特值b。b=1意味着验证经过。b=0意味着验证不经过。在RSA签名中,验证算法首先计算
,随后对比M'与M,若是相等,则输出b=1,不然输出b=0。注意:验证算法和RSA加密体制中的加密算法很是像。
因此,在签名算法中,私钥用于对数据进行签名,公钥用于对签名进行验证。这也能够直观地进行理解:对一个文件签名,固然要用私钥,由于咱们但愿只有本身才能完成签字。验证过程固然但愿全部人都可以执行,你们看到签名都能经过验证证实确实是我本身签的。
=================分割线=================
那么,为何题主问这么一个问题呢?咱们能够看到,RSA的加密/验证,解密/签字过程太像了。同时,RSA体制自己就是对称的:若是咱们反过来把e当作私钥,d当作公钥,这个体制也能很好的执行。我想正是因为这个缘由,题主在学习RSA体制的时候才会出现这种混乱。那么解决方法是什么呢?建议题主能够学习一下其余的公钥加密体制以及签名体制。其余的体制是没有这种对称性质的。举例来讲,公钥加密体制的话能够看一看ElGamal加密,以及更安全的Cramer-Shoup加密。签名体制的话能够进一步看看ElGamal签名,甚至是BLS签名,这些体制可能可以帮助题主更好的弄清加密和签名之间的区别和潜在的联系。
至于题主问的加密和签名是怎么结合的。这种体制叫作签密方案(SignCrypt),RSA中,这种签密方案看起来特别特别像,很容易引发混乱。在此我不太想详细介绍RSA中的加密与签字结合的方案。我想提醒题主的是,加密与签字结合时,两套公私钥是不一样的。
若是题主还有进一步的问题,欢迎留言。我我的是衷心但愿你们都了解一点密码学的知识,以便了解庞大的计算机网络系统究竟是如何保护数据安全性的。但愿个人回答能对题主有所帮助。
以上