首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Coding
V2EX  ›  程序员

有一个密钥对,把私钥给别人,自己保留公钥,可行不?

  •  
  •   larkifly · 2014-11-07 12:23:03 +08:00 · 10198 次点击
    这是一个创建于 1863 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目前看到的应用场景都是把公钥给别人,自己保留私钥,
    但是理论上不是公钥加密,私钥解密,私钥加密,公钥解密,那这样的话,把私钥给别人,自己保留公钥也是可行的了???
    31 回复  |  直到 2018-01-05 01:01:39 +08:00
        1
    nopy   2014-11-07 12:30:56 +08:00
    当然不可以……
    a mod b=c
    知道a,b很容易可以求出c
    但是如果知道b,c 求a不是那么简单……
    可以看下加密算法
        2
    RemRain   2014-11-07 12:32:01 +08:00
    是的,不过问题在于有私钥就能生成公钥,所以你只能把私钥悄悄地给某一个人,不能给多个人哦~
        3
    SErHo   2014-11-07 12:33:00 +08:00
    自己保留公钥,那么不就成私钥了么? “称公开的密钥为公钥;不公开的密钥为私钥”--http://zh.wikipedia.org/wiki/%E5%85%AC%E5%BC%80%E5%AF%86%E9%92%A5%E5%8A%A0%E5%AF%86
        4
    LazyZhu   2014-11-07 12:33:58 +08:00
    楼主M向。。。
        5
    qping   2014-11-07 12:35:27 +08:00 via iPhone
    搜RSA 阮一峰
        6
    wy315700   2014-11-07 12:37:37 +08:00   ♥ 1
    公钥密码体系里,公私钥其实是对称的,公开的叫公钥,不公开的叫私钥。
    你给别人的永远叫公钥,而不是私钥。
        7
    Daniel65536   2014-11-07 12:38:35 +08:00 via iPhone
    这不就相当于对方把公钥给你,自己保留私钥,当然是可行的。

    私钥不能公开,公钥可以公开,在涉及多个人的时候就有区别了,两个人之间倒是无所谓。

    真实的使用场景是把公钥贴在blog、网站等等地方,自然就必须强调公钥了。(私钥可以直接反推出公钥)
        8
    xenme   2014-11-07 12:41:02 +08:00
    一般的SSL连接建立之前需要交换公钥,然后用私钥加密传输。
    如果你的的私钥交换,然后公钥保留。反过来。还不是一样,只是换了名字。
    你就改成交换私钥了,这相当于私钥变成公钥了。没有意义啊。
        9
    jsq2627   2014-11-07 12:42:57 +08:00
    ssh-keygen -f ~/.ssh/id_rsa -y > ~/.ssh/id_rsa.pub.test
    ssh-keygen -f ~/.ssh/id_rsa.pub -y > ~/.ssh/id_rsa.priv.test

    你可以试试这两条命令。
        10
    Daniel65536   2014-11-07 12:47:44 +08:00 via iPhone   ♥ 2
    *RSA的私钥可以算出公钥
    所以楼上的一些说公开的就叫公钥这个说法是可能会引起迷糊混淆的。

    你把RSA的私钥公开,别人立刻就能从私钥推算出公钥,OK,啥都泄漏了。
    把RSA的公钥公开,别人只能知道公钥,要反推私钥需要分解大素数算好久好久,安全了。

    RSA的公钥私钥是不能随意发布私钥然后把私钥叫做公钥的。

    两个人之间这么做只有一个安全隐患:私钥会经过一次网络传输,如果有人窃听了私钥,跪了,如果是传公钥,对方窃听无所谓。

    如果中间人攻击篡改传输的内容那完全无法防范,必须手动确认是否真实。
        11
    Cu635   2014-11-07 12:59:17 +08:00
    理论上可行,这样的话是要用“公”钥来加密的,而且只有你能够加密生生合法的可以解密的串。别人用“私”钥解密,可以验证你的身份。

    不过一方面,这么干的话一般就把只有你知道的加密密钥叫做私钥,把公开的解密密钥叫做公钥了。

    另一方面,在软件实现上要看软件相关的手册甚至是代码:万一这个软件没有实现这个功能怎么办?对吧。

    信息加密是用公开的加密密钥加密,只有你知道的解密密钥解密。
        12
    Cu635   2014-11-07 13:01:08 +08:00   ♥ 1
    哦,对了,加密密钥和解秘密密钥具有对称性,密钥对中的两个用那个加密都可以,相应的另一个就是解密密钥。

    尽量不要混淆这些概念。
        13
    9hills   2014-11-07 13:02:38 +08:00 via iPhone
    rsa是非对称的
        14
    jsq2627   2014-11-07 13:05:55 +08:00
    @Cu635 公私钥位置不是对等的。楼上有人已经解释了,可以通过私钥计算出公钥,但反过来是不行的。给别人私钥,相当于把公钥也泄漏了。
        15
    billlee   2014-11-07 13:08:47 +08:00   ♥ 1
    RSA 的两个密钥是对称的,公开那个叫公钥。用公钥加密的可以用私钥解密,这是 RSA 的加密功能,用私钥加密的可以用公钥解密,这是签名功能。
    知道 RSA 的公钥是推导不出私钥的。
        16
    wzxjohn   2014-11-07 13:15:11 +08:00   ♥ 1
    看来一堆人说“给别人的交公钥,自己留着的叫私钥”。
    我只想说,那好,请把你们的私钥给我,我给你们发加密邮件。
        18
    dorentus   2014-11-07 13:53:10 +08:00   ♥ 1
    关于 RSA,我的理解是:
    按定义的话,公私钥是可以互换的
    问题是常见的实现里面,保存“私钥”的那个数据结构或者文件,里面除了私钥所必需的那一对数之外,还有额外的信息(足以算出公钥来),所以绝对不能把这个“私钥”数据给其他人……
        19
    pright   2014-11-07 13:53:28 +08:00   ♥ 3
    工具生成的私钥信息一般是包含了公钥的,如果只提供私钥(N和d),公钥的计算难度其实也是因数分解。不过出于性能考虑,公钥指数e按标准(PKCS)一般都建议选择了3、65537之类的小数,这样的话会更容易破解。
        20
    xoxo   2014-11-07 13:59:39 +08:00
    方向搞错. 非对称加密, A不应该信任B, 也注是要么你把你的公钥给对方, 要么对方生成key pair, 然后把公钥给你.
        21
    xoxo   2014-11-07 14:00:21 +08:00
    如果是你生成的, 那么你就知道私钥了, 再让对方知道.....那就不叫非对称了
        22
    SharkIng   2014-11-07 15:03:09 +08:00
    如果你只是用于签名,或者配对连接的话,比如登录一个SSH,你拿公钥服务器上存私钥,或者服务器上存公钥你拿私钥好像是没有什么影响的

    但是如果你要加密解密,就不行,私钥能算出公钥,公钥无法算出私钥,具体的楼上已经说了很多了
    而且公钥加密私钥解密,好像不能私钥加密公钥解密吧?
        23
    harryyyt   2014-11-07 15:09:06 +08:00
    可以根据私钥算出公钥,反之无法从公钥算出私钥,所以我们公开的是公钥。你可以公钥加密,私钥解密,也可以私钥加密,公钥解密,这个是没关系的。
        24
    lingxi27   2014-11-07 15:28:34 +08:00   ♥ 1
    n=pq
    φ(n)=(p-1)(q-1)
    m^φ(n) ≡ 1 mod n


    ed ≡ 1 mod φ(n)

    cipher=m^e mod n
    plain = cipher ^ d mod n ≡ m^ed mod n = m

    理论上e与d是可以互换的,但是一般公钥指的是(e, n) 私钥指的是(d, p, q),因为知道p q d 容易算出e,所以这两者是不能互换的
        25
    xuan_lengyue   2014-11-07 15:36:58 +08:00
    你为啥不让人家随机一个私钥然后生成公钥给你呢…
        26
    ryd994   2014-11-07 22:06:22 +08:00 via Android
    你这样毫无意义
    RSA的基本思路
        27
    ryd994   2014-11-07 22:19:04 +08:00 via Android   ♥ 2
    你这样毫无意义
    RSA的基本思路是人人有公钥,只有一个人有私钥,然后就可以广播公钥加密的密文(如果传输可能被窃听就是广播无异),只有这个有私钥的人能解密。
    RSA签名就是拿私钥加密,公钥解密,因为只有一个人有私钥,所以就可以验明身份。
    这两种用法都是建立在只有一个人有私钥的基础上的。
    像你这样,全世界都有了私钥,同时也就有了公钥,不仅人人能解读密文,人人还都能伪造签名。RSA正反两种用法都没用了。变成了对称加密,密钥还公开了。对称加密不是不能用,但是要以密钥隐秘为前提。
    正在要安全交换信息是这样:首先双方通过可靠途径(某个可行可验证身份的途径)交换用于签名的公钥。然后就可以进入不安全信道了。双方再交换另一个用于加密数据的公钥(带签名),然后用这个加密用公钥加密
        28
    ryd994   2014-11-07 22:24:23 +08:00 via Android
    之所以加密和签名用的密钥分开是有意义的。签名用的公钥是整个安全信道的根基,必须保证安全。所以尽量不用与加密数据减少被破解的可能。同时为了不被破解,签名公钥位数都比较大,用于交换数据时性能比较差。尽管可以加密传输对称密钥然后传输对称加密,但是还是如第一条所说,少用才靠谱。
    加密数据用的密钥,不必太长,要时常更换。
        29
    Cu635   2014-11-09 20:59:17 +08:00
    @jsq2627 理论上可以计算,但是分解大素数太难,被认为是不可能问题。
        30
    bing1178   2018-01-05 00:57:26 +08:00
    p = 61
    q = 53

    n = p * q = 61 * 53 = 3233

    欧拉 n = (p-1) * (q-1) = 60 * 52 = 3120

    e 为任意一个; 1 < e < 欧拉 n 且 e 和 欧拉 n 互质,比如 17
    e = 17

    求 d ;要求 e * d % 欧拉 n = 1
    转化公式 x * e + 欧拉 n * y = 1 ; 17x + 3120y = 1 ; 算出 x = 2753,y = -15
    验证要求 7 * 2753 % 3120 = 1
    d = 2753

    钥匙 A 为:n 和 e
    钥匙 B 为:n 和 d

    用钥匙 A 加密 123
    123 ** e % n = 123 ** 17 % 3233 = 855
    用钥匙 B 解密 855
    855 ** d % n = 855 ** 2753 % 3233 = 123

    用钥匙 B 加密 99
    99 ** d % n = 99 ** 2753 % 3233 = 89
    用钥匙 A 解密 89
    89 ** e % n = 89 ** 17 % 3233 = 99

    [总结]
    不知道 pq 的情况下:
    钥匙 A 不 hen 能 nan 算出 钥匙 B
    钥匙 B 也不 hen 能 nan 算出 钥匙 A

    ! 工具生成的私钥应该是保存了 pq
        31
    bing1178   2018-01-05 01:01:39 +08:00
    我认为 楼主的答案是: 没有 pq 的情况下就可以
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2325 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 24ms · UTC 13:24 · PVG 21:24 · LAX 05:24 · JFK 08:24
    ♥ Do have faith in what you're doing.