PHP RSA加解密工具,超长加密问题处理(二)

解决超长加密问题思路:分割分段加密
<?php
/**
 * RSA加解密超长处理
 */
namespace leyangjun\Lib;
class CryptRsa
{
    use InstanceTrait;

    const  RSA_ENCRYPT_BLOCK_SIZE = 117;
    const  RSA_DECRYPT_BLOCK_SIZE = 128;

    /**
     * 转成标格式(有时你会发现别人给你的秘钥不是标准格式,可以用此方法将其转成标注格式)
     * @Add 乐杨俊 leyangjun
     * @param $key
     * @return string
     */
    public function setSPhptandardFormat($key)
    {
        $pem = chunk_split($key, 64, "\n");
        $pem = "-----BEGIN PUBLIC KEY-----\n" . $pem . "-----END PUBLIC KEY-----\n";
        //$publicKey = openssl_pkey_get_public($pem);

        return $pem;
    }


    /**
     * 超长加密(由于秘钥有长度限制比如1024,2048约长表示接受的加密数据越多,否则会有超长加密不成功的问题)
     * 117表示长度,加密的时候可以从这开始分割加密(解密的时候从128开始解密即可)
     * @Add 乐杨俊 leyangjun
     * @param String $content 待加密内容
     * @param String $path_rsa_public_key RSA公钥路径(绝对)
     */
    public function superLongPublicKeyEncrypt($content, $rsaPublicKey, $choicePath = true, $withBase64 = false)
    {
        if ($choicePath) {
            $pubKeyId = openssl_pkey_get_public($rsaPublicKey);//绝对路径读取
        } else {
            $pubKeyId = $rsaPublicKey;//公钥
        }

        $result = '';
        $data = str_split($content, self::RSA_ENCRYPT_BLOCK_SIZE);
        foreach ($data as $block) {
            openssl_public_encrypt($block, $dataEncrypt, $pubKeyId, OPENSSL_PKCS1_PADDING);
            $result .= $dataEncrypt;
        }

        if ($withBase64) {
            return base64_encode($result);
        } else {
            return $result;
        }
    }


    /**
     * 超长私钥解密(128开始截取解密)
     * @param $content 待解密串
     * @param $rsaPrivateKey 私钥|绝对路径
     * @param bool|true $choicePath
     * @param bool|false $withBase64
     * @return bool|string
     */
    public static function superLongPrivateKeyEncrypt($content, $rsaPrivateKey, $choicePath = true, $withBase64 = false)
    {
        if ($choicePath) {
            $priKeyId = openssl_pkey_get_private($rsaPrivateKey);//绝对路径
        } else {
            $priKeyId = $rsaPrivateKey;//私钥
        }

        if ($withBase64) {
            $data = base64_decode($content);
        }

        $result = '';
        $data = str_split($data, self::RSA_DECRYPT_BLOCK_SIZE);
        foreach ($data as $block) {
            openssl_private_decrypt($block, $dataDecrypt, $priKeyId, OPENSSL_PKCS1_PADDING);
            $result .= $dataDecrypt;
        }

        if ($result) {
            return $result;
        } else {
            return false;
        }
    }
}

非常超长加密处理:https://blog.csdn.net/leyangjun/article/details/82791046

猜你喜欢

转载自blog.csdn.net/leyangjun/article/details/83146120