PHP-RAS加解密示例

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xjb1023640257/article/details/51730953
  1. 生成密钥和公钥
    开始前需要准备openssl环境
    1.1 linux 需要安装openssl工具包,传送门http://www.openssl.org/source/
    1.2 window 下需要安装openssl的程序,传送门http://slproweb.com/products/Win32OpenSSL.html

1.3 密钥生成
openssl genrsa 用于生成rsa私钥文件,生成是可以指定私钥长度和密码保护,具体参数请参考文档。
openssl genrsa -out private_key.pem 1024

-out 指定生成的密钥的文件名,可以随意定义,但是最好为意义的名字,在此生成的密钥文件为 private_key.pem
在此生成一个1024长度的密钥,密钥长度越长越安全,但加解密所耗时间亦变长。
生成的密钥private_key.pem文件的内容为:

—–BEGIN RSA PRIVATE KEY—–
MIICXAIBAAKBgQCxLKt87Xxt+tjZqggwy5xBqd7hMrVNGWxDmEC8N02VLKjydwB8
fU4OooKgtGpSNHy2o4L1S0AAxyplPQbcoou4Aa4NaiqvSrbfotZHIgoMK3UnfxcD
xH9f9rJdiD3UTPrh+9sijhjusRc8lWLSOGvHio2/Xj4/yZAZVYQEnWcGfQIDAQAB
AoGANWU3/Xt5H5AU4Gxs8X+7hNKUGBx3JVg/F5QAFnk4SXffJsuUevAsoR567cHR
tRqaZ1SZ+CEIlfNwJHii48WdA4QkzoJp8leIHEnDcwlutM7zQBFTLI9keE2Fdi2n
ArNFu//R7wRk5NNscZst0DV/kksUbP//4TSRePqWiD6cKkECQQDXy7s+TDRrVkVt
kD4/3ae5H3ExoKcyBwwkhvBAzGjfiZYSfNDHX04Sv4zJf0BT1Gu48kO/AcfSzEKa
vxbW6ujtAkEA0i7qCXAQsyW1T9xZrFkhw8vXgI2NDaQ7RbKG8OxnzsA6TYjmTy79
YQF+Q1KQ52F7IABY5JtlIBBoT5XHC3+x0QJATCap6d8MdIBaOcK4JON8Z5iP4lp2
BfJ0t4Miz0sTCydLXTTMnD6ml3kfHpAYTDze0sIzY/kl4d6Q9njOf4MgNQJAeIQh
+etiB/bVMcd9O4+YBra5CKMhf/LtcZdePIKxOyGJzK90r26YJqk+hsevAp0ohj7s
uZhIscv2o7uT+AnuIQJBAKUDl8ZyOPz/75dCVVTMFKhhMQ/AR+uhqu2AEQCzOgU3
5/iNjbvKOzHLgXit78jNr7kCOYfb5G4OBTtzo0ZYYaQ=
—–END RSA PRIVATE KEY—–

1.4 公钥生成
Rsa命令用于处理RSA密钥、格式转换和打印信息
openssl rsa -in private_key.pem -pubout -out public_key.pem

-in filename:输入的RSA密钥文件,在此为上面生成的密钥 private_key.pem。
-pubout:设置此选项后,保存公钥值到输出文件中。
-out filename:输出文件,在此我们定义成public_key.pem
生成的公钥public_key.pem文件的内容为:
—–BEGIN PUBLIC KEY—–
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDt8lasjepyr1vq/Q87iNJCv7ge
QXI2rgAB7lVFS02FxLNwgtqQ1cf+NH6mP88ufxxDVI2oL1RcH48dZPG7MGS4c0YT
EDOpIeTCZ8fW+AiPYTaq1axtS51LNwXeYIak28L8mEZoQjmn+nb3vfmTAKTUKrzz
XIDT3R83+lX4xxxQXwIDAQAB
—–END PUBLIC KEY—–

  1. PHP用RSA加解密
    开始前需要准备php openssl环境,开启PHP openssl扩展,window将php的配置文件php.ini中的
    ;extension=php_openssl.dll
    改为
    extension=php_openssl.dll

  2. PHP-RAS加解密示例

class RSA 
{
    public function __construct()
    {
        // 判断openssl扩展存在
        extension_loaded('openssl') or die('openssl extension does not exist');
    }

    /**
     * rsa加密
     * @param string $str 原始明文
     * @param string $need_base64_encode 是否需要base64_encode
     * @return string
     */
    public static function encrypt($str, $need_base64_encode = TRUE)
    {
        // 公钥存放路径
        $public_key_path = SpringConstant::LIBRARY_PATH . "/rsa/public_key.pem";
        file_exists($public_key_path) or die('public key file path is not correct');
        // 生成Resource类型的公钥,如果公钥文件内容被破坏,openssl_pkey_get_public函数返回false
        $public_key = openssl_pkey_get_public(file_get_contents($public_key_path));
        $encrypt_data = '';
        if (@openssl_public_encrypt($str, $encrypt_data, $public_key)) 
        {
            // 加密后 可以base64_encode后方便在网址中传输 或者打印  否则打印为乱码
            if ($need_base64_encode) 
            {
                $encrypt_data = base64_encode($encrypt_data);
            }
        } 
        else 
        {
            die('encrypt failed');
        }
        return $encrypt_data;
    }

    /**
     * rsa解密
     * @param string $str rsa密文
     * @param string $need_base64_decode 是否需要base64_decode解密
     * @return string
     */
    public static function decrypt($str, $need_base64_decode = TRUE)
    {
        // 公钥存放路径
        $private_key_path = SpringConstant::LIBRARY_PATH . "/rsa/private_key.pem";
        file_exists($private_key_path) or die('private key file path is not correct');
        // 生成Resource类型的密钥,如果密钥文件内容被破坏,openssl_pkey_get_private函数返回false
        $private_key = openssl_pkey_get_private(file_get_contents($private_key_path));
        $decrypt_data = '';
        $encrypt_data = $str;
        if($need_base64_decode)
        {
            $encrypt_data = base64_decode($encrypt_data);
        }
        //解密
        @openssl_private_decrypt($encrypt_data, $decrypt_data, $private_key, OPENSSL_PKCS1_PADDING) or die('decrypt failed'); 
        return $decrypt_data;
    }
}

4.使用PHP-RAS加解密

       $str = 'niky';
       $encrypt_str = RSA::encrypt($str,true);
       $decrypt_str = RSA::decrypt($encrypt_str,true);
       var_dump($str,$encrypt_str,$decrypt_str);exit;

猜你喜欢

转载自blog.csdn.net/xjb1023640257/article/details/51730953
今日推荐