解决超长加密问题思路:分割分段加密
<?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