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

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

  •  
  •   GuguguguDa · 280 天前 · 2512 次点击
    这是一个创建于 280 天前的主题,其中的信息可能已经有所发展或是发生改变。
    45 回复  |  直到 2019-03-10 20:19:23 +08:00
        1
    luchenqun   280 天前 via iPhone
    公钥可以解密的话,你加密的意义何在?
        2
    h123123h   280 天前 via iPhone
    私钥加密是签名吧
        3
    lululau   280 天前 via iPhone
    可以,签名就是对摘要做四月加密
        4
    lululau   280 天前 via iPhone
    私钥
        5
    GuguguguDa   280 天前
    @luchenqun 先不论意义何在吧,只是想问问能不能这样做,因为看了下面那个博文有些疑惑,私钥加密之后,公钥还能正常解密出来
    https://blog.csdn.net/wangqiuyun/article/details/42143957
        6
    GuguguguDa   280 天前
    @lululau 签名是签名 加密是加密 不一样吧
        7
    GuguguguDa   280 天前
    @h123123h 看了上面那个博客,我觉得很疑惑,签名是签名,加密是加密
        8
    Kilerd   280 天前 via iPhone
    可以,
        9
    t6attack   280 天前   ♥ 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;
    ?>

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


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

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

    你提到的数字签名就是私钥加密的一种应用。
        28
    lvybupt   280 天前
    RSA 的公钥和私钥是用扩展的欧几里德算法(辗转相除法)求出来的,选出来就是成对的。
    然后你随便选一个当公钥,另外一个当私钥。

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

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

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

    用于加密的话就是用 RSA 加密明文了+用于解密的密钥应当只让需要知晓秘密的人知道。
        44
    honeycomb   280 天前 via Android
    有一个区别是用于数字签名的时候,RSA 的 e 参数一般会取一些很简单的固定值,但用于自定义的加密时,e 的取值没有什么限制
        45
    p1gd0g   279 天前
    @Mutoo Emm,俺是在问 lz 原命题的意义,俺自己硕士就是密码学方向的。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2245 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 29ms · UTC 05:38 · PVG 13:38 · LAX 21:38 · JFK 00:38
    ♥ Do have faith in what you're doing.