RSA加密解密,分段处理(防止数据过长)

RSA加密解密,分段处理防止数据过长

代码如下

class Rsa {
    /**
     * private key
     */
    private $_privKey;
    /**
     * public key
     */
    private $_pubKey;
    /**
     * the keys saving path
     */
    private $_keyPath;
    public function __construct ($path) {
        //$path 是 存放 秘钥的目录
        
        if (empty($path) || !is_dir($path)) {
            throw new \Exception('Must set the keys save path');
        }
        //设置私钥
        $this->_keyPath = $path;
        $file = $this->_keyPath . DIRECTORY_SEPARATOR . 'rsa_private_key.pem';
        $prk = file_get_contents($file);
        $this->_privKey = openssl_pkey_get_private($prk);
        //设置公钥
        $file = $this->_keyPath . DIRECTORY_SEPARATOR . 'rsa_public_key.pem';

        $puk = file_get_contents($file);
        
        $this->_pubKey = openssl_pkey_get_public($puk);
        
    }
    /**
     * setup the private key 
     */
    public function setupPrivKey () {
        if (is_resource($this->_privKey)) {
            return true;
        }
        $file = $this->_keyPath . DIRECTORY_SEPARATOR . 'rsa_private_key.pem';
        $prk = file_get_contents($file);
        $this->_privKey = openssl_pkey_get_private($prk);
        return true;
    }
    /**
     * setup the public key
     */
    public function setupPubKey () {
        if (is_resource($this->_pubKey)) {
            return true;
        }
        $file = $this->_keyPath . DIRECTORY_SEPARATOR . 'rsa_public_key.pem';
        $puk = file_get_contents($file);
        $this->_pubKey = openssl_pkey_get_public($puk);
        return true;
    }
    /**
     * @function 私钥加密
     * @param $data
     * @return string|null
     */
    public function privEncrypt ($data) {

        $crypto = '';

        foreach (str_split($data, 117) as $chunk) {

            openssl_private_encrypt($chunk, $encryptData, $this->_privKey);

            $crypto .= $encryptData;
           
        }

        return base64_encode($crypto);
        // if (!is_string($data)) {
        //     return null;
        // }
        // $r = openssl_private_encrypt($data, $encrypted, $this->_privKey);
        // if ($r) {
        //     return base64_encode($encrypted);
        // }
        // return null;
    }
    /**
     * @function 私钥解密
     * @param $data
     * @return string|null
     */
    public function privDecrypt ($encrypted) {

        $crypto = '';

        foreach (str_split(base64_decode($encrypted), 128) as $chunk) {

            openssl_private_decrypt($chunk, $decryptData, $this->_privKey);

            $crypto .= $decryptData;
        }

        return $crypto;

        // if (!is_string($encrypted)) {
        //     return null;
        // }
        // $encrypted = base64_decode($encrypted);
        // $r = openssl_private_decrypt($encrypted, $decrypted, $this->_privKey);
        // if ($r) {
        //     return $decrypted;
        // }
        // return null;
    }
    /**
     * @function 公钥加密
     * @param $data
     * @return string|null
     */
    public function pubEncrypt ($data) {
        $crypto = '';

        foreach (str_split($data, 117) as $chunk) {

            openssl_public_encrypt($chunk, $encryptData, $this->_pubKey);

            $crypto .= $encryptData;
           
        }

        return base64_encode($crypto);

        // if (!is_string($data)) {
        //     return null;
        // }

        // $r = openssl_public_encrypt($data, $encrypted, $this->_pubKey);

        // if ($r) {
        //     return base64_encode($encrypted);
        // }

        return null;
    }
    /**
     * @function 公钥解密
     * @param $data
     * @return string|null
     */
    public function pubDecrypt ($crypted) {
        $crypto = '';

        foreach (str_split(base64_decode($crypted), 128) as $chunk) {

            openssl_public_decrypt($chunk, $decryptData, $this->_pubKey);

            $crypto .= $decryptData;
        }

        return $crypto;
        // if (!is_string($crypted)) {
        //     return null;
        // }
        // $crypted = base64_decode($crypted);
        // $r = openssl_public_decrypt($crypted, $decrypted, $this->_pubKey);
        // if ($r) {
        //     return $decrypted;
        // }
        // return null;
    }
    /**
     * @function 私钥加签
     * @param $data
     * @return string|null
     */
    public function sign ($data) {
        if (!is_string($data)) {
            return null;
        }
        openssl_sign($data, $sign, $this->_privKey);
        //base64编码
        $sign = base64_encode($sign);
        return $sign;
    }
    /**
     * @function 公钥验签
     * @param $data
     * @return string|null
     */
    public function verify($data, $sign) {
        if (!is_string($data)) {
            return null;
        }
        $result = (bool)openssl_verify($data, base64_decode($sign), $this->_pubKey);
        return $result;
    }
    public function __destruct () {
        empty($this->_privKey) ? '' : openssl_free_key($this->_privKey);
        empty($this->_pubKey) ? '' : openssl_free_key($this->_pubKey);
    }
   
}

类的使用

		$rsa = new Rsa(这里需要存放秘钥的路径);
		//设置一个300长度的字符串
		$aa = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc';
		
		//私钥加密,公钥解密  ---------------------看好这个
        echo 'source:我是wanlshop<br>';
        $pre = $rsa->privEncrypt($aa);
        echo '加密之后' . $pre . '<br>';

        $pud = $rsa->pubDecrypt($pre);
        echo '解密之后:' . $pud . '<br>';

        
        
        //公钥加密,私钥解密 ---------------------看好这个
        $pue = $rsa->pubEncrypt($aa);
        echo '加密:' . $pue . '<br>';
        
		//验签
        $sign = $rsa->sign($pue);
        $result = $rsa->verify($pue,$sign);
        var_dump($result);
        $prd = $rsa->privDecrypt($pue);
        echo '解密:' . $prd;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值