java rsa内容超长_RSA 非对称加密&解密,超长字符串分块处理

class RsaServer

{

/**

* @var false|resource

*/

protected $key;

/**

* 分隔符

* @var string

*/

protected $mark = '.';

/**

* 分片长度

* @var int

*/

protected $length = 245;

/**

* 获取秘钥

* RsaServer constructor.

* @param string $key_file

* @param bool $is_pub

* @throws FileNotFoundException

*/

public function __construct(string $key_file, $is_pub = false)

{

if (!is_file($key_file)) {

throw new \Exception('key path is invalid');

}

$content = file_get_contents($key_file);

if ($is_pub) {

$this->key = openssl_pkey_get_public($content);

} else {

$this->key = openssl_pkey_get_private($content);

}

return $this;

}

/**

* 私钥加密

* @param string $data

* @return null|string

*/

public function privEncrypt($data = '')

{

$result = [];

if (!is_string($data)) {

return null;

} else if (strlen($data) > $this->length) {

foreach (str_split($data, $this->length) as $chunk) {

if (openssl_private_encrypt($chunk, $encrypted, $this->key)) {

$result[] = base64_encode($encrypted);

} else {

return null;

}

}

$result = implode($this->mark, $result);

} else {

$result = openssl_private_encrypt($data, $encrypted, $this->key) ? base64_encode($encrypted) : null;

}

return $result;

}

/**

* 公钥加密

* @param string $data

* @return null|string

*/

public function publicEncrypt($data = '')

{

$result = [];

if (!is_string($data)) {

return null;

} else if (strlen($data) > $this->length) {

foreach (str_split($data, $this->length) as $chunk) {

if (openssl_public_encrypt($chunk, $encrypted, $this->key)) {

$result[] = base64_encode($encrypted);

} else {

return null;

}

}

$result = implode($this->mark, $result);

} else {

$result = openssl_public_encrypt($data, $encrypted, $this->key) ? base64_encode($encrypted) : null;

}

return $result;

}

/**

* 私钥解密

* @param string $encrypted

* @return null

*/

public function privDecrypt($encrypted = '')

{

$result = '';

$encrypted_chunk = explode($this->mark, $encrypted);

if (!is_string($encrypted)) {

return null;

} else if (count($encrypted_chunk) > 1) {

foreach ($encrypted_chunk as $chunk) {

if (openssl_private_decrypt(base64_decode($chunk), $decrypted, $this->key)) {

$result .= $decrypted;

} else {

return null;

}

}

} else {

$result = openssl_private_decrypt(base64_decode($encrypted), $decrypted, $this->key) ? $decrypted : null;

}

return $result;

}

/**

* 公钥解密

* @param string $encrypted

* @return null

*/

public function publicDecrypt($encrypted = '')

{

$result = '';

$encrypted_chunk = explode($this->mark, $encrypted);

if (!is_string($encrypted)) {

return null;

} else if (count($encrypted_chunk) > 1) {

foreach ($encrypted_chunk as $chunk) {

if (openssl_public_decrypt(base64_decode($chunk), $decrypted, $this->key)) {

$result .= $decrypted;

} else {

return null;

}

}

} else {

$result = openssl_public_decrypt(base64_decode($encrypted), $decrypted, $this->key) ? $decrypted : null;

}

return $result;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值