666665443
V2EX  ›  问与答

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

  •  
  •   666665443 · Sep 7, 2020 · 8053 views
    This topic created in 2249 days ago, the information mentioned may be changed or developed.

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

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

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

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

    33 replies  •  2021-10-22 16:37:32 +08:00
    J55s5
    J55s5
    Sep 7, 2020❤️1
    1
    公钥的公就是公开的意思
    J55s5
    J55s5
    Sep 7, 2020
    2
    打完我就不认识公这个字了
    crystom
    crystom
    Sep 7, 2020❤️1
    3
    数学上的公私钥确实是对称的,但是工程应用中的私钥还包括了原始信息
    zhve2x4
    zhve2x4
    Sep 7, 2020
    4
    公钥和私钥本身就是可逆的?? 你确定???
    私钥---->公钥
    公钥--X-->私钥
    wangkun025
    wangkun025
    Sep 7, 2020
    5
    可逆?可逆?可逆?
    easonHHH
    easonHHH
    Sep 7, 2020❤️3
    6
    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,是不是安全性来说这个公钥更适合公布
    QingXuJiaZhi
    QingXuJiaZhi
    Sep 7, 2020❤️1
    7
    楼主 “公钥和私钥本身就是可逆的” 这个想法是从哪里来的?有来源吗
    maplememory
    maplememory
    Sep 7, 2020
    8
    公钥仅包含两个信息,模( n ),公共指数( e )
    私钥包含私有指数( d ),两个大质数( p,q ),还有额外的 dP,dQ 和 qInv (用于使用中国剩余定理加速运算的)。
    通过私钥可以算出公钥,反之不行。
    GM
    GM
    Sep 7, 2020
    9
    @cmdOptionKana 我估计他意思是这样:

    公钥加密可以私钥解密,私钥加密也可以公钥解密。

    这样一来初一看好像公钥私钥可以互相替换呢。
    linuxvalue
    linuxvalue
    Sep 7, 2020
    10
    公钥加密 私钥解密 基本知识,你给我来个私钥加密...
    churchmice
    churchmice
    Sep 7, 2020
    11
    既然如此,那跟对称加密还有何区别
    zxcslove
    zxcslove
    Sep 7, 2020❤️1
    12
    发布出去的叫公钥,就像去会所上班才叫公主
    dzdh
    dzdh
    Sep 7, 2020
    13
    貌似…… 公玥是包含在私钥里的吧
    d2D5Cc
    d2D5Cc
    Sep 7, 2020❤️10
    14
    楼上有一半都是一知半解的,数学意义上两个 rsa 秘钥的确是对等的,但是工程实现例如 OpenSSL 会将信息存在私钥里,使私钥能生成出公钥,这个时候就不能算是对等了
    lvybupt
    lvybupt
    Sep 7, 2020
    15
    刚在知乎上看到这个问题? 楼主提的?

    你的结论是对的。RSA 的密钥是成对出现的,任意给出的那个就叫公钥,留下的就是私钥。

    不过有两位一个问题,为了方便识别密钥,和更方便的排除弱密钥,公钥一般都是固定长度的,私钥是对应算法生成的,长度是有波动的。
    私钥长度不够就是弱密钥,废弃重新生成一对。
    Euporie
    Euporie
    Sep 7, 2020
    16
    @ZombieMisaka 说的是对的,另外 LZ 搞反了因果关系,两个密钥,你公开出去的就可以叫公钥
    khjian
    khjian
    Sep 7, 2020
    17
    你是不是对非对称加密有什么误解?
    felixlong
    felixlong
    Sep 7, 2020
    18
    数字签名就是私钥加密公钥解密的。数学理论上本来公钥和私钥就是对称的。只是工程实践上公钥的那个 e 都是选择固定的值。因为 e 的选择不当会降低 RSA 的安全强度。
    liujialongstar
    liujialongstar
    Sep 7, 2020
    19
    如果可逆, 那么非对称加密还有什么意义
    misaka19000
    misaka19000
    Sep 7, 2020❤️2
    20
    为什么陨石都落在坑里面?
    GuuJiang
    GuuJiang
    Sep 7, 2020❤️45
    21
    这个问题里 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
    cheng6563
    Sep 7, 2020 via Android
    22
    公私钥的确可以反着用的,但一般公钥短,私钥长。用公钥加密不太合适
    wnck
    wnck
    Sep 7, 2020
    23
    公私钥反着用的场景是数字签名,私钥持有者对 message 进行签名,其他人用公钥去验证签名。

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

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

    老哥, 你现在这个疑问解决了吗? 我最近也在思考这个问题,https://v2ex.com/t/809833#;
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2777 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 100ms · UTC 14:18 · PVG 22:18 · LAX 06:18 · JFK 09:18
    ♥ Do have faith in what you're doing.