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

为啥 rsa 这种算法扩展 php/python 不自带。而且跨平台也不是处理的很好

  •  
  •   cevincheung ·
    cevin · 2014-03-28 16:42:09 +08:00 · 4021 次点击
    这是一个创建于 3892 天前的主题,其中的信息可能已经有所发展或是发生改变。
    11 条回复    1970-01-01 08:00:00 +08:00
    zhouzm
        1
    zhouzm  
       2014-03-28 16:47:55 +08:00
    前半个问题估计是涉及到法律方面
    cevincheung
        2
    cevincheung  
    OP
       2014-03-28 17:16:31 +08:00
    @zhouzm 呃,rsa是商业算法么?
    dorentus
        3
    dorentus  
       2014-03-28 19:45:47 +08:00
    这么复杂的东西难度拿出来不是挺正常的么
    cevincheung
        4
    cevincheung  
    OP
       2014-03-28 20:15:18 +08:00
    @dorentus 呃,那有没有一个可自由安装卸载的系统化扩展?php比如ext?没有啊 - -#。python是啥?
    wy315700
        5
    wy315700  
       2014-03-28 20:19:48 +08:00
    RSA是商业算法

    虽然算法和原理是开放的
    dorentus
        6
    dorentus  
       2014-03-28 20:27:14 +08:00
    python 我不熟,不过可以搜到这个: https://pypi.python.org/pypi/rsa
    pip install rsa 就能用了吧。

    PHP 是有的吧,用的 openssl。http://www.php.net/manual/en/function.openssl-pkey-new.php
    wwqgtxx
        7
    wwqgtxx  
       2014-03-28 20:59:47 +08:00 via Android
    pycrypto/m2crypto都可以试试pypi上有
    大概是因为授权协议的问题吧
    反正java自带了
    xierch
        8
    xierch  
       2014-03-28 22:25:29 +08:00
    010blue
        9
    010blue  
       2014-03-28 22:49:12 +08:00
    RSA是比较耗时的,如果仅用php或python在语言层实现效率太慢,尤其是生成公/私钥的时候,所以一般都是使用系统的openssl来生成key,然后代码来实现加/解密,这个通常也是要依赖扩展(比如php需要高精度函数扩展bcmath,python的没使用过)。
    @cevincheung
    sneezry
        10
    sneezry  
       2014-03-28 23:17:50 +08:00
    rsa有专利。
    txlty
        11
    txlty  
       2014-03-29 22:30:36 +08:00   ❤️ 1
    五年前,从php 4开始就自带了。而且跨平台没问题。
    linux下默认支持。win下,编辑php.ini把extension=php_openssl.dll 打开。

    测试代码:
    <?php
    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;
    }

    $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-----"; //私钥

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

    毫无问题~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2797 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:49 · PVG 21:49 · LAX 05:49 · JFK 08:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.