php-rsa 公钥和私钥加密测试

0x01 公钥和私钥

公钥:公开的密码
私钥:私有备份的密码
不对称的加解密算法,比较出名的就是RSA

0x02 主要用处

数据传输

公钥加密-> 私钥解密: 主要用于数据传输过程,不担心数据泄露的问题
私钥加密-> 公钥解密: 主要用于数字认证,加密后的数据无法伪造.

0x03 代码示例

主要的功能:
1: 生成公钥和私钥
2: 公钥加密->私钥解密
3: 私钥加密-> 公钥解密

<?php

    /**
     * 生成RSA的公钥和私钥
     * 正常情况,分开存储, 服务器只保存私钥即可
     * @return array
     */
    function generateRsaKey()
    {
        $config = array(
            'config'=>'D:\phpstudy_pro\Extensions\php\php7.1.9nts\extras\ssl\openssl.cnf',//安装PHP7会自带这个配置文件
            'digest_alg'=> 'sha256', //可以用openssl_get_md_methods() 查看支持的加密方法
            'private_key_bits' => 2048,
            'private_key_type' => OPENSSL_KEYTYPE_RSA,
        );
        $res = openssl_pkey_new($config);
        openssl_pkey_export($res, $private_key_pem,null,$config);

        $details = openssl_pkey_get_details($res);
        $public_key_pem = $details['key'];

        return [
            "public_key"=>$public_key_pem,
            "private_key"=>$private_key_pem
        ];
    }

    /**
     * 公钥-私钥配对验证
     * @param $private_key_pem
     * @param $public_key_pem
     * @return int 1 if the signature is correct, 0 if it is incorrect, and
     * -1 on error.
     */
    function checkRsa($private_key_pem,$public_key_pem)
    {
        $data = "PHP";
        openssl_sign($data, $signature, $private_key_pem, OPENSSL_ALGO_SHA256);
        $result = openssl_verify($data, $signature, $public_key_pem, OPENSSL_ALGO_SHA256);
        return $result;
    }

    /**
     * 公钥加密
     * @param $str  -> 要加密的字符串
     * @param $public_key -> 公钥
     * @return string -> base64编码后的字符串
     */
    function encrypt_by_public($str,$public_key)
    {
        //第一个参数是待加密的数据只能是string,第二个参数是加密后的数据,第三个参数是openssl_pkey_get_public返回的资源类型,第四个参数是填充方式
        $return_en = openssl_public_encrypt($str,$crypted, $public_key);
        if(!$return_en){
            return('加密失败,请检查RSA秘钥');
        }
        $str_encrypt_base64 = base64_encode($crypted);
        return $str_encrypt_base64;
    }

    /**
     * 私钥解密
     * @param $str  -> 要解密的字符串
     * @param $private_key  -> 私钥
     * @return string  -> 解密后的字符串
     */
    function decrypt_by_private($str,$private_key)
    {
        $return_de = openssl_private_decrypt(base64_decode($str), $decrypted, $private_key);
        if(!$return_de){
            return('解密失败,请检查RSA秘钥');
        }
        return $decrypted;
    }

    /**
     * 私钥加密
     * @param $str
     * @param $private_key
     * @return string
     */
    function encrypt_by_private($str,$private_key)
    {
        $return_en = openssl_private_encrypt($str, $crypted, $private_key);
        if(!$return_en){
            return('加密失败,请检查RSA秘钥');
        }
        $str_encrypt_base64 = base64_encode($crypted);
        return $str_encrypt_base64;
    }

    /**
     * 公钥解密
     * @param $str
     * @param $public_key
     * @return string
     */
    function decrypt_by_public($str,$public_key)
    {
        $return_de = openssl_public_decrypt(base64_decode($str), $decrypted, $public_key);
        if(!$return_de){
            return('解密失败,请检查RSA秘钥');
        }
        return $decrypted;
    }


    $key = generateRsaKey();
    if(checkRsa($key["private_key"],$key["public_key"])!=1){
        die("rsa秘钥验证无效!");
    }

    //待加密字符串
    $to_encrypt_string = "www.gyarmy.com——流沙";
    /*
    //加密
    $str_encrypt = encrypt_by_public($to_encrypt_string,$key["public_key"]);
    echo $str_encrypt;

    echo "<br/>";
    //解密
    $str_decrypt = decrypt_by_private($str_encrypt,$key["private_key"]);
    echo $str_decrypt;
    */

    $str_encrypt = encrypt_by_private($to_encrypt_string,$key["private_key"]);

    echo $str_encrypt;
    echo "<br/>";
    $str_decrypt = decrypt_by_public($str_encrypt,$key["public_key"]);
    echo $str_decrypt;

原文链接: php-rsa 公钥和私钥加密测试 版权所有,转载时请注明出处,违者必究。
注明出处格式:流沙团 ( http://www.gyarmy.com/post-665.html )

发表评论

0则评论给“php-rsa 公钥和私钥加密测试”