php rsa加密解密完整实例

<?php
/**
 * RSA加密
 * env:(PHP 4 >= 4.0.4, PHP 5, PHP 7)
 * 密钥对生成
 * 工具:OpenSSL
 * 生成私钥:genrsa -out rsa_private_key.pem 1024
 * 生成公钥:rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
 * Author:luchanglong
 * Date:2017-12-14
 * **********************************************
 * * 私钥丢失将导致数据永久无法解密
 * *********************************************
 */

header("Content-type: text/html; charset=utf-8");

class RsaTools
{
    //私钥文件路径
    private $rsaPrivateKeyFilePath;

    //私钥值
    private $rsaPrivateKey;

    //公钥文件路径
    private $rsaPublicKeyFilePath;

    //公钥值
    private $rsaPublicKey;

    function __construct()
    {
        $this->rsaPrivateKeyFilePath=dirname(__FILE__).DIRECTORY_SEPARATOR.'key'.DIRECTORY_SEPARATOR.'rsa_private_key.pem';
        $this->rsaPublicKeyFilePath=dirname(__FILE__).DIRECTORY_SEPARATOR.'key'.DIRECTORY_SEPARATOR.'rsa_public_key.pem';
    }

    /**
     *  rsa公钥加密
     **/
    public function rsaEncrypt($data) {
        if($this->checkEmpty($this->rsaPublicKeyFilePath)){
            //读取字符串
            $pubKey= $this->rsaPublicKey;
            $res = "-----BEGIN PUBLIC KEY-----\n" .
                wordwrap($pubKey, 64, "\n", true) .
                "\n-----END PUBLIC KEY-----";
        }else {
            //读取公钥文件
            $pubKey = file_get_contents($this->rsaPublicKeyFilePath);
            //转换为openssl格式密钥
            $res = openssl_get_publickey($pubKey);
        }

        ($res) or die('RSA公钥错误。请检查公钥文件格式是否正确');
        $data=trim($data);
        openssl_public_encrypt($data,$encrypted,$pubKey);//公钥加密
        $encrypted = base64_encode($encrypted);
        return $encrypted;
    }
    /**
     * rsa私钥解密
     **/
    public function rsaDecrypt($data) {

        if($this->checkEmpty($this->rsaPrivateKeyFilePath)){
            //读字符串
            $priKey=$this->rsaPrivateKey;
            $res = "-----BEGIN RSA PRIVATE KEY-----\n" .
                wordwrap($priKey, 64, "\n", true) .
                "\n-----END RSA PRIVATE KEY-----";
        }else {
            $priKey = file_get_contents($this->rsaPrivateKeyFilePath);
            $res = openssl_get_privatekey($priKey);
        }
        ($res) or die('您使用的私钥格式错误,请检查RSA私钥配置');
        $data=base64_decode($data);
        openssl_private_decrypt($data, $dcyCont, $res);
        return $dcyCont;
    }

    /**
     * 校验$value是否非空
     *  if not set ,return true;
     *    if is null , return true;
     **/
    protected function checkEmpty($value) {
        if (!isset($value))
            return true;
        if ($value === null)
            return true;
        if (trim($value) === "")
            return true;

        return false;
    }

}


$r=new RsaTools();
$str="0123456789?><~!@#$%^&*()_+qwertyuiopasdfghjklzxcvbnm";
echo '待加密:'.$str."<br>";
$en=$r->rsaEncrypt($str);
echo '加密后:'.$en.'<br>';
$de=$r->rsaDecrypt($en);
echo '解密后:'.$de;

 

发表评论