V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
666665443
V2EX  ›  问与答

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

  •  
  •   666665443 · 2020-09-07 10:24:26 +08:00 · 5815 次点击
    这是一个创建于 1299 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

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

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

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

    老哥, 你现在这个疑问解决了吗? 我最近也在思考这个问题,https://v2ex.com/t/809833#;
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5782 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 06:13 · PVG 14:13 · LAX 23:13 · JFK 02:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.