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

有关于 PHP RSA 公钥加密的实现

  •  
  •   sjlleo ·
    sjlleo · 2020-02-27 18:50:23 +08:00 · 2541 次点击
    这是一个创建于 1732 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近想用 PHP 模拟登陆一个网站练手,但在Javascript中发现了如下RSA 公钥加密function

    function userLogin() {
    	var password = $("#password").val(); 	
        if(password.length != 256){
        setMaxDigits(131);
        var key = new RSAKeyPair("010001", '', "00b15fdee0d7ed06c21067d59e65031becca4c3eafe52d891725c75c37dac7ca2d");
        var enpwd = encodeURIComponent(password);
        var result = encryptedString(key, password);
    	$("#password").val(result);
    }
    

    Google 了一下,都用到了 OpenSSL,我试着用 PHP 写了

    function rsa_encode($content)
    {
    	$public_key = "-----BEGIN PUBLIC KEY-----\n00b15fdee0d7ed06c21067d59e65031becca4c3eafe52d891725c75c37dac7ca2d\n-----END PUBLIC KEY-----"; 
    	$openssl_public_encrypt = openssl_public_encrypt($str, $content, $public_key);
        if (!$openssl_public_encrypt)
            throw new \Exception('openssl_public_encrypt failed! ');
        return $content;
    }
    

    提示“RSA 公钥不正确”,后来又去搜了一下,这样合成的 public_key 不符合 PKCS 标准,不知道下一步应该如何操作,感谢!

    10 条回复    2020-02-27 21:09:02 +08:00
    areless
        1
    areless  
       2020-02-27 19:00:34 +08:00 via Android
    先得用公钥创建资源句柄~ openssl_pkey_get_public
    sjlleo
        2
    sjlleo  
    OP
       2020-02-27 19:16:56 +08:00
    @areless
    感谢,我刚刚尝试这么做了
    ```PHP
    function rsa_encode($data)
    {

    $public_key = "-----BEGIN PUBLIC KEY-----\n00b15fdee0d7ed06c21067d59e65031becca4c3eafe52d891725c75c37dac7ca2d\n-----END PUBLIC KEY-----";
    $key = openssl_pkey_get_public ($rsa_public);
    $result = str_split ($data , 117);

    $str = '';
    foreach ($result as $v) {
    openssl_public_encrypt ($v , $crypted , $key);
    $str .= $crypted;
    }


    if (! $str) {
    throw new \Exception ('Failded RSA Check');
    }
    }
    ```
    但是它提示
    ```
    Warning: openssl_public_encrypt(): key parameter is not a valid public key in /demo/rsa.php on line 12

    Fatal error: Uncaught Exception: Failded RSA Check in /demo/rsa.php:16 Stack trace: #0 /demo/rsa.php(38): rsa_encode() #1 {main} thrown in /demo/rsa.php on line 16
    ```
    RickyC
        3
    RickyC  
       2020-02-27 19:29:50 +08:00
    https://blog.class4ever.com/1740.html

    加密解密, 我找到这种写法. 这个可以运行
    areless
        4
    areless  
       2020-02-27 19:32:00 +08:00 via Android   ❤️ 1
    @sjlleo 这个是 16 进制转过的公钥,先把公钥还原出来。好像用的是这个 http://www.ohdave.com/rsa/
    RickyC
        5
    RickyC  
       2020-02-27 19:33:43 +08:00
    你这个 公钥放在函数里, 换行的时候, 会不会默认添加了一些空格, 以至于格式不正确?
    areless
        6
    areless  
       2020-02-27 19:51:05 +08:00 via Android
    @sjlleo 公钥 16 进制转字符串,然后填充方式一致便可以了。
    sjlleo
        7
    sjlleo  
    OP
       2020-02-27 20:18:13 +08:00
    @areless
    00b15fdee0d7ed06c21067d59e65031becca4c3eafe52d891725c75c37dac7ca2d 解密后是 skhN61Jj6UYfdPlzh0a9EareSj8viurcHR8CgKxl3coFds1B6+tShOFHvduTcJVMlE38ToF0e1ZoxnmGYhm4uNKyB5sr6vpQsl61/TERMydYmV0PHFYbvLxQCx//OenJWNYyh+H8gT+eQX1+gUTH6CBNUSqdRQKtHhr15ZUQxnQDttmS0Da8fNfBjZ9GGejl12x3zYHstfG3Djz8Z4Iir1FVMEKzMn9GJRhSeTGtVW8u/3NbPXIhM29Z7QVrTQK6f2/H+uF/rpH1bZRn86mzEM/7qwD1+NEN0jm3h+uS7hMmQ/qA5egIebFVe9EsUkXuDwl8CBR2M4utroxz+E6shA==,但是放入后依旧提示公钥不可用诶。
    sjlleo
        8
    sjlleo  
    OP
       2020-02-27 20:19:34 +08:00
    @RickyC 不会,换行我都是使用了“\n”的,空格我也仔细检查过了。
    RickyC
        9
    RickyC  
       2020-02-27 20:29:36 +08:00
    @sjlleo 你这个公钥哪里来的? 怎么这么短, 其中还不包含大写字母?
    areless
        10
    areless  
       2020-02-27 21:09:02 +08:00
    @sjlleo 指数 模数还原公钥。这次肯定行。=___=
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1390 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 17:14 · PVG 01:14 · LAX 09:14 · JFK 12:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.