RSA 在原理上,公钥和私钥本身就是可逆的。
但是为什么我们在网络验证身份的时候都是,以 GithubSSH 为例,为什么都是把公钥放在 Github 上面?而不是自己的私钥?我能不能把私钥放在上面,自己保存好公钥不被泄露?
通常情况下都是把所谓意义上的公钥随便传播,而自己保存好私钥的安全性,这种做法仅仅的习惯原因吗?
我是否可以把我的私钥任意传播,把自己的公钥保存完好,不被泄露?简言之,是否在使用 RSA 加密算法中,不管是私钥还是公钥,只要保存好其中之一,另一个就可以任意传播了?
1
wzzzx 2020-09-07 10:28:14 +08:00 1
公钥的公就是公开的意思
|
2
wzzzx 2020-09-07 10:28:35 +08:00
|
3
crystom 2020-09-07 10:29:02 +08:00 1
数学上的公私钥确实是对称的,但是工程应用中的私钥还包括了原始信息
|
4
zhve2x4 2020-09-07 10:30:11 +08:00
公钥和私钥本身就是可逆的?? 你确定???
私钥---->公钥 公钥--X-->私钥 |
5
wangkun025 2020-09-07 10:32:43 +08:00
可逆?可逆?可逆?
|
6
easonHHH 2020-09-07 10:37:15 +08:00 3
1.随机两个不相等的质数 p,q
2.p,q 相乘等于 n 3.根据欧拉函数,φ(n)=(p-1)(q-1) 4.随机选一个质数 e 满足 1<e<φ(n),且 e 与φ(n)互质,实际应用多用(65537) 5.通过公式推导: ed ≡ 1 (mod φ(n)) ed - 1 = kφ(n) 存在一个 k ex + φ(n)y = 1 其中 y=1/k e 已知,根据扩展欧几里得算法,求出 x 即为 d 6.[n,e]为公钥,[n,d]为私钥 你看 e 是随机选一个质数 e 且多用于 65537,是不是安全性来说这个公钥更适合公布 |
7
cmdOptionKana 2020-09-07 10:38:50 +08:00 1
楼主 “公钥和私钥本身就是可逆的” 这个想法是从哪里来的?有来源吗
|
8
maplememory 2020-09-07 10:40:06 +08:00
公钥仅包含两个信息,模( n ),公共指数( e )
私钥包含私有指数( d ),两个大质数( p,q ),还有额外的 dP,dQ 和 qInv (用于使用中国剩余定理加速运算的)。 通过私钥可以算出公钥,反之不行。 |
9
GM 2020-09-07 10:42:55 +08:00
|
10
linuxvalue 2020-09-07 10:44:30 +08:00
公钥加密 私钥解密 基本知识,你给我来个私钥加密...
|
11
churchmice 2020-09-07 10:49:04 +08:00
既然如此,那跟对称加密还有何区别
|
12
zxcslove 2020-09-07 10:51:01 +08:00 1
发布出去的叫公钥,就像去会所上班才叫公主
|
13
dzdh 2020-09-07 10:51:18 +08:00
貌似…… 公玥是包含在私钥里的吧
|
14
ZombieMisaka 2020-09-07 10:52:41 +08:00 10
楼上有一半都是一知半解的,数学意义上两个 rsa 秘钥的确是对等的,但是工程实现例如 OpenSSL 会将信息存在私钥里,使私钥能生成出公钥,这个时候就不能算是对等了
|
15
lvybupt 2020-09-07 10:55:15 +08:00
刚在知乎上看到这个问题? 楼主提的?
你的结论是对的。RSA 的密钥是成对出现的,任意给出的那个就叫公钥,留下的就是私钥。 不过有两位一个问题,为了方便识别密钥,和更方便的排除弱密钥,公钥一般都是固定长度的,私钥是对应算法生成的,长度是有波动的。 私钥长度不够就是弱密钥,废弃重新生成一对。 |
16
Euporie 2020-09-07 10:59:31 +08:00
@ZombieMisaka 说的是对的,另外 LZ 搞反了因果关系,两个密钥,你公开出去的就可以叫公钥
|
17
khjian 2020-09-07 11:03:01 +08:00
你是不是对非对称加密有什么误解?
|
18
felixlong 2020-09-07 11:12:49 +08:00
数字签名就是私钥加密公钥解密的。数学理论上本来公钥和私钥就是对称的。只是工程实践上公钥的那个 e 都是选择固定的值。因为 e 的选择不当会降低 RSA 的安全强度。
|
19
liujialongstar 2020-09-07 11:12:58 +08:00
如果可逆, 那么非对称加密还有什么意义
|
20
misaka19000 2020-09-07 11:15:45 +08:00 2
为什么陨石都落在坑里面?
|
21
GuuJiang 2020-09-07 11:24:49 +08:00 45
这个问题里 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,不包括其他的非对称算法) |
22
cheng6563 2020-09-07 11:27:51 +08:00 via Android
公私钥的确可以反着用的,但一般公钥短,私钥长。用公钥加密不太合适
|
23
wnck 2020-09-07 11:40:42 +08:00
公私钥反着用的场景是数字签名,私钥持有者对 message 进行签名,其他人用公钥去验证签名。
在数学推导上,公私钥确实是相互关联的,但通常按照标准规范的算法,公钥计算私钥的难度远大于私钥计算公钥,这个难度的差异大概可以类比成私钥计算公钥只需要 1s,公钥计算私钥你要算一辈子还不一定算得出来。 |
26
agegcn 2020-09-07 13:55:46 +08:00
lz“可逆”这个词用错了,才造成这么大误会
|
27
fffang 2020-09-07 14:00:10 +08:00
@misaka19000 为什么呢?
|
28
Nicoco 2020-09-07 17:58:36 +08:00
非对称加密、对称加密,这两个概念还需要深入了解一下~
|
29
EvilCult 2020-09-08 02:09:08 +08:00
v2 上应该多一些如 #6 和 #21 这样的“真·大佬”
|
32
51fly 2021-08-23 12:05:28 +08:00
@GuuJiang 多谢大兄弟,我也有这个问题,就是不考虑复杂的 ssl 场景,只从最单纯地加解密场景出发,即 2 个公私钥的 base64 字符串,我随便公开一个,是不是保留的就可以当做私钥,也就是在这种场景,公私钥不是在数学公式层定义的,而是取决于怎么分发。。。看了你的解释算明白了。多谢。
|
33
find456789 2021-10-22 16:37:32 +08:00
|