PHP下RSA对称加密超长字符串分段加密DEMO

<div style="word-wrap:break-word">
<?php
$private_key='-----BEGIN PRIVATE KEY-----
your private key here...
-----END PRIVATE KEY-----';
$private_key = openssl_pkey_get_private($private_key);

$public_key='-----BEGIN PUBLIC KEY-----
your public key here
-----END PUBLIC KEY-----';
$public_key = openssl_pkey_get_public($public_key);

$data_source = 'Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!';

echo "<br>源数据:<br>".$data_source."<hr>";

//私钥加密
$data_encode = rsa_encode_private($data_source,$private_key);
echo "私钥加密后:<br>".$data_encode."<hr>";
//公钥解密
$data_decode = rsa_decode_public($data_encode,$public_key);
echo "公钥解密后:<br>".$data_decode."<hr>";
//校验结果
if($data_source === $data_decode){
    echo "<h1>公钥解密成功</h1>";
}else{
    echo "<h1>公钥解密失败</h1>";
}

//公钥加密
$data_encode = rsa_encode_public($data_source,$public_key);
echo "公钥加密后:<br>".$data_encode."<hr>";
//私钥解密
$data_decode = rsa_decode_private($data_encode,$private_key);
echo "私钥解密后:<br>".$data_decode."<hr>";
//校验结果
if($data_source === $data_decode){
    echo "<h1>私钥解密成功</h1>";
}else{
    echo "<h1>私钥解密失败</h1>";
}

//私钥加密方法
function rsa_encode_private($data,$private_key,$length_break = 128){
    $index = 0;
    $result='';
    if($length_break > 1024){
        $length_break = 1024;
    }
    while(true){
        $temp = substr($data,$index,$length_break);
        if(strlen($temp)==0 || $index>=strlen($data)-1){
            break;
        }
        openssl_private_encrypt($temp, $temp, $private_key);
        $temp = base64_encode($temp);
        $result .= "\n". $temp;
        $index += $length_break;
    }
    return $result;
}
//公钥解密方法
function rsa_decode_public($data,$public_key,$line_key = "\n"){
    $index = 0;
    $result='';
    $arr = explode("\n",$data);
    foreach($arr as $temp){
        if(empty($temp)){
            continue;
        }
        openssl_public_decrypt(base64_decode($temp), $temp, $public_key);
        $result .= $temp;
    }
    return $result;
}
//公钥加密方法
function rsa_encode_public($data,$public_key,$length_break = 128){
    $index = 0;
    $result='';
    if($length_break > 1024){
        $length_break = 1024;
    }
    while(true){
        $temp = substr($data,$index,$length_break);
        if(strlen($temp)==0 || $index>=strlen($data)-1){
            break;
        }
        openssl_public_encrypt($temp, $temp, $public_key);
        $temp = base64_encode($temp);
        $result .= "\n". $temp;
        $index += $length_break;
    }
    return $result;
}
//私钥解密方法
function rsa_decode_private($data,$private_key,$line_key = "\n"){
    $index = 0;
    $result='';
    $arr = explode("\n",$data);
    foreach($arr as $temp){
        if(empty($temp)){
            continue;
        }
        openssl_private_decrypt(base64_decode($temp), $temp, $private_key);
        $result .= $temp;
    }
    return $result;
}
?>