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

RSA 可以做私钥加密,公钥解密吗?不是数字签名

  •  
  •   GuguguguDa · 2019-03-09 15:04:52 +08:00 · 4539 次点击
    这是一个创建于 2093 天前的主题,其中的信息可能已经有所发展或是发生改变。
    45 条回复    2019-03-10 20:19:23 +08:00
    luchenqun
        1
    luchenqun  
       2019-03-09 15:27:34 +08:00 via iPhone
    公钥可以解密的话,你加密的意义何在?
    h123123h
        2
    h123123h  
       2019-03-09 15:27:48 +08:00 via iPhone
    私钥加密是签名吧
    lululau
        3
    lululau  
       2019-03-09 15:29:05 +08:00 via iPhone
    可以,签名就是对摘要做四月加密
    lululau
        4
    lululau  
       2019-03-09 15:29:26 +08:00 via iPhone
    私钥
    GuguguguDa
        5
    GuguguguDa  
    OP
       2019-03-09 15:41:29 +08:00
    @luchenqun 先不论意义何在吧,只是想问问能不能这样做,因为看了下面那个博文有些疑惑,私钥加密之后,公钥还能正常解密出来
    https://blog.csdn.net/wangqiuyun/article/details/42143957
    GuguguguDa
        6
    GuguguguDa  
    OP
       2019-03-09 15:42:32 +08:00
    @lululau 签名是签名 加密是加密 不一样吧
    GuguguguDa
        7
    GuguguguDa  
    OP
       2019-03-09 15:44:03 +08:00
    @h123123h 看了上面那个博客,我觉得很疑惑,签名是签名,加密是加密
    Kilerd
        8
    Kilerd  
       2019-03-09 16:03:40 +08:00 via iPhone
    可以,
    t6attack
        9
    t6attack  
       2019-03-09 16:05:07 +08:00   ❤️ 2
    <?php
    //测试密钥-公钥
    $pubKey="-----BEGIN PUBLIC KEY-----
    MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANSlDRoxEXWQrbIbFig3SuT/YH/K0q5/
    OLBVloeXSr+dc+PWvXsRnwkxIkX5KznPCG9zLGe/Ga9XRyp+k2YrnrsCAwEAAQ==
    -----END PUBLIC KEY-----";
    //私钥
    $privKey="-----BEGIN RSA PRIVATE KEY-----
    MIIBOQIBAAJBANSlDRoxEXWQrbIbFig3SuT/YH/K0q5/OLBVloeXSr+dc+PWvXsR
    nwkxIkX5KznPCG9zLGe/Ga9XRyp+k2YrnrsCAwEAAQJACg70m7SOet0pGi+l0Kks
    5cAetGzHonFqIQ0rXaaOZpnZ7VeBTjklFVlVv/6UGr0h7jLclU+0UcEZ1lxwQUBx
    wQIhAPoD6k+WOJld9D0p6ECLlS0ii4spj/T5o5ODdI+pkS2JAiEA2bwhZICOwb8w
    FjfJOoKFcfuUfTk0n8y1DokfRQBC/SMCIBoZ8opgioQodOk1yNOEPwy5QIxEyIyw
    y00JOlANSeTRAiBm+oeAlRzvnZEMsQ3HUnvy0N4F68xr19G6MjhL1jfYqQIgGiYa
    RlI1jeOWFLKyxOFcNim8HUhfqIebm8Mccc0/3kQ=
    -----END RSA PRIVATE KEY-----";

    function pubEncrypt($data,$pubKey){ //公钥加密
    $pubKey = openssl_pkey_get_public($pubKey);
    openssl_public_encrypt($data, $encrypted, $pubKey);
    return base64_encode($encrypted);
    }
    function privDecrypt($data,$privKey){ //私钥解密
    $privKey=openssl_pkey_get_private($privKey);
    $encrypted = base64_decode($data);
    openssl_private_decrypt($encrypted, $decrypted, $privKey);
    return $decrypted;
    }

    function privEncrypt($data,$privKey){ //私钥加密
    $privKey=openssl_pkey_get_private($privKey);
    openssl_private_encrypt($data, $encrypted, $privKey);
    return base64_encode($encrypted);
    }
    function pubDecrypt($data,$pubKey){ //公钥解密
    $pubKey = openssl_pkey_get_public($pubKey);
    $encrypted = base64_decode($data);
    openssl_public_decrypt($encrypted, $decrypted, $pubKey);
    return $decrypted;
    }

    $string='一二三四五六七八九十';
    echo '公钥加密:';
    $en = pubEncrypt($string,$pubKey);
    echo $en . '<br /> 私钥解密:';
    $de = privDecrypt($en,$privKey);
    echo $de;

    echo "<br>";

    $string='一二三四五六七八九十';
    echo '私钥加密:';
    $en = privEncrypt($string,$privKey);
    echo $en . '<br /> 公钥解密:';
    $de = pubDecrypt($en,$pubKey);
    echo $de;
    ?>

    有何疑问?
    ayase252
        10
    ayase252  
       2019-03-09 16:06:01 +08:00   ❤️ 1
    可以,数字签名就是这么搞的
    GuuJiang
        11
    GuuJiang  
       2019-03-09 16:06:29 +08:00   ❤️ 1
    取决于你怎么理解“加密”,如果“加密”指的是 RSA 里的“明文+密钥=密文”这个过程的话,用公钥和私钥都是可以的,公钥加密就对应的私钥解密,私钥公钥就对应的公钥解密,而如果放到实际的应用场景里,只有“公钥加密、私钥解密”才能起到保密信息的作用,这整个流程合起来称为“加密”,反之,“私钥加密、公钥解密”并不能让信息保密,但是却能起到验证发送者身份的作用,于是这整个流程称为“签名”
    GuguguguDa
        12
    GuguguguDa  
    OP
       2019-03-09 16:08:10 +08:00
    GuguguguDa
        13
    GuguguguDa  
    OP
       2019-03-09 16:09:05 +08:00
    @GuuJiang 签名我可以理解,那么私钥加密之后的密文,可以用公钥还原的吗?
    jssyxzy
        14
    jssyxzy  
       2019-03-09 16:10:49 +08:00
    私钥加密,公钥解密,
    那么问题就来了,
    为啥要加密啊,这个需求很奇葩啊。
    jssyxzy
        15
    jssyxzy  
       2019-03-09 16:12:26 +08:00
    @GuguguguDa
    “@luchenqun 先不论意义何在吧,只是想问问能不能这样做,因为看了下面那个博文有些疑惑,私钥加密之后,公钥还能正常解密出来
    https://blog.csdn.net/wangqiuyun/article/details/42143957


    做可以做,数字签名里面就有。
    其实私钥加密公钥解密的一个作用是表明自己的身份。
    GuguguguDa
        16
    GuguguguDa  
    OP
       2019-03-09 16:15:57 +08:00
    @jssyxzy 唔 数字签名我理解
    换个问题 私钥加密后的密文 能用公钥还原成明文吗?
    jssyxzy
        17
    jssyxzy  
       2019-03-09 16:19:02 +08:00   ❤️ 1
    看第三章
    ![]( )
    jssyxzy
        18
    jssyxzy  
       2019-03-09 16:19:23 +08:00
    @GuguguguDa
    看上面那本书第三章
    jssyxzy
        19
    jssyxzy  
       2019-03-09 16:20:28 +08:00   ❤️ 1
    @GuguguguDa
    可以,
    不对称加密的原理了解下。
    h3lica
        20
    h3lica  
       2019-03-09 16:23:22 +08:00   ❤️ 1
    如果公钥指的是 RSA 里的 e 而私钥指的是 RSA 里的 d 的话。
    加密函数表示为 C = M ^ d mod n
    解密函数表示为 M = C ^ e = M ^ (e * d) = M mod n
    从数学上看是可行的。
    liwufan
        21
    liwufan  
       2019-03-09 16:24:13 +08:00
    简单来说,私钥不能反推出自己加密的内容,公钥也不能反推出自己加密的内容.类比就是锁(公钥)和钥匙(只能有一把的私钥),私钥加密,公钥解密的行为相当与做一把全世界人都能开的锁,但是这把锁你自己无论如何都打不开.
    GuuJiang
        22
    GuuJiang  
       2019-03-09 16:25:35 +08:00   ❤️ 1
    @GuguguguDa 肯定是可以还原的,否则怎么验证签名,验证签名的过程就是用公钥解密啊,至于你贴的那个链接,你再好好看看,那个问题问的是为什么公钥加密的消息无法用公钥还原,跟你这里问的不是一回事
    GuguguguDa
        23
    GuguguguDa  
    OP
       2019-03-09 16:41:57 +08:00
    @GuuJiang 哈哈哈 对对对 我看错了
    sherlockwhite
        24
    sherlockwhite  
       2019-03-09 18:37:50 +08:00
    我理解的公钥私钥是相对的,公钥加密私钥解密,但是你这里的问题是问定义的私钥加密,公钥能不能解密,应该是可以的。公钥私钥应该是相对的在数学意义上,你用定义的私钥加密,这里的定义的私钥就是公钥了,你要保证原本定义的公钥的唯一性,就保证了这对密钥的安全性。
    580a388da131
        25
    580a388da131  
       2019-03-09 18:58:17 +08:00 via iPhone
    生成公钥一般用的是常数 所以安全性来说 公私不对互换
    数学上没问题
    hhhsuan
        26
    hhhsuan  
       2019-03-09 19:02:33 +08:00 via Android
    当然可以,RSA 不就是干这事的吗
    Xbluer
        27
    Xbluer  
       2019-03-09 19:04:26 +08:00
    私钥是可以加密的。

    非对称加密,需要一对密钥,两者技术层面是一样的。只是挑了其中一个公开,叫做公钥;另一个不公开 /私有,所以叫做私钥。

    你提到的数字签名就是私钥加密的一种应用。
    lvybupt
        28
    lvybupt  
       2019-03-09 19:25:57 +08:00
    RSA 的公钥和私钥是用扩展的欧几里德算法(辗转相除法)求出来的,选出来就是成对的。
    然后你随便选一个当公钥,另外一个当私钥。

    其他的非对称加密并不一定具有这个特性,但是 RSA 肯定是没问题。
    Mutoo
        29
    Mutoo  
       2019-03-09 20:29:09 +08:00   ❤️ 1
    RSA 非对称加密使用一对密钥协相互加密解密。
    对外公开的叫公钥,自己保留的叫私钥。
    在端到端加密的场景中,别人向你发信息的时候:
    使用你的公钥加密,用他自己的私钥签名。
    这样的话只有你的私钥能解开这个信息,别人无法读取。
    用对方的公钥可以验证签名,确定信息确实是由对方发起的,第三方无法伪造。
    Mutoo
        30
    Mutoo  
       2019-03-09 20:31:20 +08:00
    @Mutoo 用公钥验证签名的方法就是解密对方用私钥加密的签名串
    hoiyd
        31
    hoiyd  
       2019-03-09 20:42:22 +08:00 via Android
    可以,但是非对称加解密算法( RSA )的性能不如对称加密( AES 之类)算法,所以一般加解密大量内容的时候一般用对称加密算法,然后用非对称加密签个名。
    cjw1115
        32
    cjw1115  
       2019-03-09 20:54:57 +08:00
    这种一般不叫加密了,使用私钥叫做签名,使用公钥叫做验签。 公钥可以从私钥中获取,要保证私钥的绝对安全
    BinRelay
        33
    BinRelay  
       2019-03-09 21:51:45 +08:00
    从数学角度,私钥和公钥并没什么区别。只选选择公开的叫公钥。选择保留的是私钥。
    而且公钥私钥不能互推。所以公钥加密私钥解,私钥加密公钥解没有本质区别。

    不过,从应用角度,例如 9 楼的那一对公钥私钥,采用的 PKCS#1 格式的私钥,并不是真正
    数学意义上的私钥,里面包含了 rsa 推导过程的信息( p、q ),所以得到私钥可以直接推导得到公钥。
    jimages
        34
    jimages  
       2019-03-09 22:19:21 +08:00
    @BinRelay 公钥是可以从私钥算出来的.......
    BinRelay
        35
    BinRelay  
       2019-03-09 22:22:47 +08:00
    @jimages 建议你仔细读我的回复。或者去复习下 rsa 的数学公式。
    jimages
        36
    jimages  
       2019-03-09 22:37:51 +08:00
    @BinRelay
    “而且公钥私钥不能互推 ”
    https://zh.wikipedia.org/wiki/RSA 加密演算法#密钥生成
    p q 相乘不就可以得到了吗?
    jimages
        37
    jimages  
       2019-03-09 22:43:57 +08:00
    @BinRelay 不好意思,撤回以上回复。
    YenvY
        38
    YenvY  
       2019-03-10 01:29:24 +08:00
    本坛有过相关的讨论
    /t/519617
    msg7086
        39
    msg7086  
       2019-03-10 01:57:38 +08:00
    本坛其实有过很多很多相关的讨论,多到我已经回复过好多贴了,而且 38 楼的链接里没有我回复的内容。
    tomczhen
        40
    tomczhen  
       2019-03-10 07:19:58 +08:00 via Android
    数学上讲是可以的,并且代码也能实现,但是实际很多加密库并没有实现。
    p1gd0g
        41
    p1gd0g  
       2019-03-10 09:16:34 +08:00
    在公钥密码学中,公钥( public key )默认是公开的,所以这么做的意义是什么呢。
    Mutoo
        42
    Mutoo  
       2019-03-10 11:13:10 +08:00
    @p1gd0g 例如中本聪一开始就公开了公钥,这样当他对外发布信息,并用他自己的私钥签名。大家都可以用他的公钥去验证签名。从而确定这个信息确实是他发出的,而不是别人伪造的。
    honeycomb
        43
    honeycomb  
       2019-03-10 11:15:12 +08:00 via Android
    @GuguguguDa 当然可以啊。

    数字签名无非就是给原文的摘要做 RSA 的加密解密+用于解密的密钥( public certificate 角色)公开。

    用于加密的话就是用 RSA 加密明文了+用于解密的密钥应当只让需要知晓秘密的人知道。
    honeycomb
        44
    honeycomb  
       2019-03-10 11:16:55 +08:00 via Android
    有一个区别是用于数字签名的时候,RSA 的 e 参数一般会取一些很简单的固定值,但用于自定义的加密时,e 的取值没有什么限制
    p1gd0g
        45
    p1gd0g  
       2019-03-10 20:19:23 +08:00
    @Mutoo Emm,俺是在问 lz 原命题的意义,俺自己硕士就是密码学方向的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2617 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 10:46 · PVG 18:46 · LAX 02:46 · JFK 05:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.