PHP sha256WithRSA签名验签 rsa2加密解密 分段加密解密函数

作者: unvs 分类: PHP 发布时间: 2022-07-20 10:36 ė17,017 views 62条评论

在数据传输的过程中,使用最广的安全加密方法大多数用的rsa2,本文说说在php中RSA2的加密、解密、分段加密、分段解密以及sha256WithRSA签名和验签的方法。

RSA加密算法又称为非对称加密,是利用两个密钥来进行加密和解密,这两个秘钥分别是公钥(public key)和私钥(private key),非对称加密适合于对安全性要求很高的场景,适合加密少量数据,比如支付数据、CA数字证书等。

常见的非对称加密算法分为 RSA RSA2

非对称加密的优点:需要两组不同的密钥,安全性高,并且两个密钥可以互相解密

非对称加密的缺点:速度慢,只适合对少量的数据进行加密.

rsa2 所使用的公钥和私钥可以利用一些在线工具生成,也可以在liunx系统中通过命令生成。
在使用rsa2之前,需要服务器支持php_openssl组件

RSA2 公钥私钥命令生成代码:
openssl genrsa -out rsa_private_key.pem 1024//生成原始 RSA私钥文件 rsa_private_key.pem //将原始RSA私钥转换为 pkcs8格式
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem //生成RSA公钥rsa_public_key.pem
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

//生成 sha256WithRSA 签名
function RsaGetSign($content, $privateKey){
/*$privateKey = “—–BEGIN RSA PRIVATE KEY—–\n” .
wordwrap($privateKey, 64, “\n”, true) .
“\n—–END RSA PRIVATE KEY—–”;*/

$key = openssl_get_privatekey($privateKey);
openssl_sign($content, $signature, $key, “SHA256″);
openssl_free_key($key);
$sign = base64_encode($signature);
return $sign;
}

//验证 sha256WithRSA 签名
function RsaVerify($content, $sign, $publicKey){
$publicKey = “—–BEGIN PUBLIC KEY—–\n” .
wordwrap($publicKey, 64, “\n”, true) .
“\n—–END PUBLIC KEY—–”;

$key = openssl_get_publickey($publicKey);
$ok = openssl_verify($content,base64_decode($sign), $key, ‘SHA256′);
openssl_free_key($key);
return $ok;
}

//rsa2公钥加密
function RsaPubDecrypt($data,$pub_key){
if (!is_string($data)) {
return null;
}
$r = openssl_public_encrypt($data, $encrypted, $pub_key);
if ($r) {
return base64_encode($encrypted);
}
return null;
}

//rsa2私钥解密
function RsaPriDecrypt($encrypted,$pri_key){
if (!is_string($encrypted)) {
return null;
}
$encrypted = base64_decode($encrypted);
$r = openssl_private_decrypt($encrypted, $decrypted, $pri_key);
if ($r) {
return $decrypted;
}
return null;
}

//rsa2私钥分段加密
function RsaSplitEncrypt($method, $key, $data, $rsa_bit = 2048){
$inputLen = strlen($data);
$offSet = 0;
$i = 0;

$maxDecryptBlock = $rsa_bit / 8 – 11;

$en = ”;

//对数据分段加密
while($inputLen – $offSet > 0){
if($inputLen – $offSet > $maxDecryptBlock){
$cache = $method($key, substr($data, $offSet, $maxDecryptBlock));
}else{
$cache = $method($key, substr($data, $offSet, $inputLen – $offSet));
}

$en = $en . $cache;

$i++;
$offSet = $i * $maxDecryptBlock;
}

return $en;
}

//rsa2私钥分段解密
function RsaSplitDecrypt($encrypted,$pri_key, $rsa_bit = 2048){
$one = $rsa_bit / 8;
$encrypted = base64_decode($encrypted);
$decrypted =”;
$num= ceil(strlen( $encrypted) / $one);
//$num = (strlen($encrypted) – strlen($encrypted) % $one)/ $one + 1;
for ($i = 0; $i < $num; $i++){
$data_part =substr($encrypted, $i * $one, $one);
$de = ”;
openssl_private_decrypt($data_part, $de, $pri_key);
$decrypted .= $de;
}
return $decrypted;
}

//rsa2私钥加密
function RsaEncrypt($str,$pri_key){
$pi_key =openssl_pkey_get_private($pri_key);
if(!$pi_key)return false;//秘钥不可用
openssl_private_encrypt($str,$encrypted,$pi_key);
$encrypted =base64_encode($encrypted);
return $encrypted;
}

//rsa2公钥解密
function RsaDecrypt($str,$pub_key){
$pu_key =openssl_pkey_get_public($pub_key);
if(!$pu_key)return false;//秘钥不可用
openssl_public_decrypt(base64_decode($str),$decrypted,$pu_key);
return $decrypted;
}

对于有些报错,下面做了些汇总:
1、如果在使用openssl_pkey_get_private、openssl_pkey_get_public函数后,返回空值
原因一:可能公钥密钥文件里的格式不正确,比方
私钥头尾缺少
—–BEGIN RSA PRIVATE KEY—–
—–END RSA PRIVATE KEY—–
公钥头尾缺少
—–BEGIN PUBLIC KEY—–
—–END PUBLIC KEY—–

在函数内第一行添加/或文件里添加对应的代码
$privateKey = “—–BEGIN RSA PRIVATE KEY—–\n” .
wordwrap($privateKey, 64, “\n”, true) .
“\n—–END RSA PRIVATE KEY—–”;

$publicKey = “—–BEGIN PUBLIC KEY—–\n” .
wordwrap($publicKey, 64, “\n”, true) .
“\n—–END PUBLIC KEY—–”;

原因二:私钥密钥格式不正确,内容主体部分应该是要换行即会有很多对称一样长度的多行代码

本博文章基本上属于原创或收集整理,都是心血结晶。
欢迎转载分享,转载请注明出处,谢谢!
本文地址:PHP sha256WithRSA签名验签 rsa2加密解密 分段加密解密函数

2 条评论

  1. 秦川 2022 年 12 月 14 日 下午 5:18 回复

    RsaSplitEncrypt传入的method是什么函授?

    1. unvs 2022 年 12 月 14 日 下午 10:48 回复

      rsa2私钥加密的方法名称

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Ɣ回顶部