RSA 可以做私钥加密,公钥解密吗?不是数字签名 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
GuguguguDa
V2EX    问与答

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

  •  
  •   GuguguguDa 2019-03-09 15:04:52 +08:00 5167 次点击
    这是一个创建于 2476 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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     Solana     5181 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 09:07 PVG 17:07 LAX 01:07 JFK 04:07
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86