RSA的公钥和私钥到底哪个才是用来加密和哪个用来解密?

来自知乎提问 https://www.zhihu.com/question/25912483

不要去硬记。
你只要想:既然是加密,那肯定是不希望别人知道我的消息,所以只有我才能解密,所以可得出公钥负责加密,私钥负责解密;同理,既然是签名,那肯定是不希望有人冒充我发消息,只有我才能发布这个签名,所以可得出私钥负责签名,公钥负责验证。
 

RSA 加密方案和 RSA 签名方案是不同的,具体的不同点在 

@刘巍然-学酥
 的回答里讲得很清楚。我在这里主要是想谈一下加密方案里的情况。

 

在 RSA 加密方案中,选定了  计算出  ,再在小于  的正整数中选一个和它互素的  作为公钥,它模  的乘法逆元  则为私钥。公开  ,保留  。

结论:公钥  用来加密,私钥  用来解密。

想要反驳的是这个说法

私钥加密公钥可以解密
公钥加密私钥可以解密
两个大质数(p,q)乘积(n)难以逆向求解,所以pq是对等的,公钥和私钥也是对等的。
匿名用户:RSA的公钥和私钥到底哪个才是用来加密和哪个用来解密?

这样说的话就有三种情形。我们一一分析:

一、公钥和私钥都保密

也就是说,Alice 和 Bob 同时分享一组密钥  ,然后约定  或  为加密密钥,另一个为解密密钥。这样做固然是可以的,但违背了公钥加密方案的初衷。公钥加密的设计就是为了公开加密密钥,让所有人都可以给某个人发送消息。

这种场景完全应该使用对称加密算法,加解密的效率和安全性都更高。

二、公钥公开,私钥保密

在这种情况下,用私钥加密公钥解密是不可能的。因为密码学的假设是:一个合格的加密方案,敌手拿到密文  不能恢复出明文  。这样做的结果是,所有人都可以解密信息,毫无意义。与之对应的有意义的是签名方案,具体参考开头我提到的刘巍然的答案。

三、公钥保密,私钥公开

这其实才是那个答案的意思:生成的公钥  和私钥  是对等的,只是两个数而已。把它们哪个公开出去用于加密,哪个保留起来用于解密,都是一样的。

但严格地讲,这种说法是错误的。

对于最基本的 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
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2016.04.25更新。

感谢
@SDKany
@THEKOC
等人的指正。刚刚才注意到有笔误,群中的模运算都应该是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中的加密与签字结合的方案。我想提醒题主的是,加密与签字结合时,两套公私钥是不同的。


如果题主还有进一步的问题,欢迎留言。我个人是衷心希望大家都了解一点密码学的知识,以便了解庞大的计算机网络系统到底是如何保护数据安全性的。希望我的回答能对题主有所帮助。


以上

编辑于 2016-04-25

转载于:https://www.cnblogs.com/makai/p/11132262.html

你可能感兴趣的:(RSA的公钥和私钥到底哪个才是用来加密和哪个用来解密?)