在 RSA 加密中既然公钥和私钥是可逆的,为什么都是把公钥给别人,而不把私钥给别人,自己保存好公钥?

2020-09-07 10:24:26 +08:00
 666665443

RSA 在原理上,公钥和私钥本身就是可逆的。

但是为什么我们在网络验证身份的时候都是,以 GithubSSH 为例,为什么都是把公钥放在 Github 上面?而不是自己的私钥?我能不能把私钥放在上面,自己保存好公钥不被泄露?

通常情况下都是把所谓意义上的公钥随便传播,而自己保存好私钥的安全性,这种做法仅仅的习惯原因吗?

我是否可以把我的私钥任意传播,把自己的公钥保存完好,不被泄露?简言之,是否在使用 RSA 加密算法中,不管是私钥还是公钥,只要保存好其中之一,另一个就可以任意传播了?

5910 次点击
所在节点    问与答
33 条回复
GuuJiang
2020-09-07 11:24:49 +08:00
这个问题里 3/6/8/14/15 楼说的是对的(如有遗漏请见谅),其他人尤其是还带嘲讽语气的就真的是张口就来了,甚至思考的还没有楼主多
我来一点一点回答吧
1. 你说的这个“可逆”的在 RSA 的原理上是正确的,更严格的说法是叫“对称”的,注意这里说的是数学上的轮换对称那个对称,而不是对称 /非对称加密里的那个对称,以防杠精
2. 之所以实际使用中不能互换使用,原因是我们平时使用的叫作私钥的那个文件,除了包含私钥本身,还额外地包含了一些信息,细节详见 6 楼,注意加解密过程中真正需要用到的只有[n,d],这才是真正数学意义上的“私钥”,而实际的私钥文件里除了[n,d]以外还记录了 p/q 等用于产生私钥的原始值,利用这些值可以把公钥重新推导出来,也就是
(工程意义上的公钥) = (数学意义上的公钥)
(工程意义上的私钥) = (数学意义上的私钥) + (数学意义上的公钥)
所以如果你真的互换使用,程序直接就报错了,因为期待的私钥和公钥的文件格式是不一样的,但是如果你手动去解析真正的[n,e]和[n,d]值并喂给底层的 RSA 过程,使用完全没有问题
3. 那么假设我们统一工程上的私钥和公钥文件的格式,去掉私钥文件中的原始信息,都只包含数学密钥本身,是否就可以任意互换使用了呢?答案是仍然不能,原因是在原始的 RSA 原理定义里,质数 e 应该是随机选取的,但是实际工程应用中,固定为了 3 或者 65537,所以如果你把实际的私钥当成了公钥分发出去,有心人如果看到里面的 e 值不是 3 或 65537,就可以猜测你用反了,并且尝试用 3 或 65537 来生成对应的“私钥”
4. 一句话总结就是,在数学上,私钥和公钥是轮换对称的,可以互换使用,到底哪个是私钥哪个是公钥取决于哪个保密哪个任意分发,但是在实际工程上由于两点原因,不能互换使用,对于死记硬背“只能公钥加密私钥解密,私钥签名公钥验签”并以此为论据来嘲讽楼主的,你们好好去看看,在 RSA 里,加密和签名就是完全一模一样的过程(再次强调,仅限 RSA,不包括其他的非对称算法)
cheng6563
2020-09-07 11:27:51 +08:00
公私钥的确可以反着用的,但一般公钥短,私钥长。用公钥加密不太合适
wnck
2020-09-07 11:40:42 +08:00
公私钥反着用的场景是数字签名,私钥持有者对 message 进行签名,其他人用公钥去验证签名。

在数学推导上,公私钥确实是相互关联的,但通常按照标准规范的算法,公钥计算私钥的难度远大于私钥计算公钥,这个难度的差异大概可以类比成私钥计算公钥只需要 1s,公钥计算私钥你要算一辈子还不一定算得出来。
linvaux
2020-09-07 12:14:43 +08:00
@wzzzx 😂我特喵的也看懵了
594duck
2020-09-07 12:22:19 +08:00
@GuuJiang 老哥说话真的客观靠谱

V2 现在真的是张口喷的小年轻太多了
agegcn
2020-09-07 13:55:46 +08:00
lz“可逆”这个词用错了,才造成这么大误会
fffang
2020-09-07 14:00:10 +08:00
@misaka19000 为什么呢?
Nicoco
2020-09-07 17:58:36 +08:00
非对称加密、对称加密,这两个概念还需要深入了解一下~
EvilCult
2020-09-08 02:09:08 +08:00
v2 上应该多一些如 #6 和 #21 这样的“真·大佬”
666665443
2020-09-13 09:29:41 +08:00
@lvybupt 对,在知乎上也提问了
666665443
2020-09-13 09:36:52 +08:00
@GuuJiang 谢谢前辈
51fly
2021-08-23 12:05:28 +08:00
@GuuJiang 多谢大兄弟,我也有这个问题,就是不考虑复杂的 ssl 场景,只从最单纯地加解密场景出发,即 2 个公私钥的 base64 字符串,我随便公开一个,是不是保留的就可以当做私钥,也就是在这种场景,公私钥不是在数学公式层定义的,而是取决于怎么分发。。。看了你的解释算明白了。多谢。
find456789
2021-10-22 16:37:32 +08:00
@51fly

老哥, 你现在这个疑问解决了吗? 我最近也在思考这个问题,https://v2ex.com/t/809833#;

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/704756

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX