V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
666665443
V2EX  ›  问与答

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

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

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

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

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

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

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

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

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

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

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

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

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

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