IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    unvs发表于 2022-07-20 02:36:26
    love 0

    在数据传输的过程中,使用最广的安全加密方法大多数用的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—–”;

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



沪ICP备19023445号-2号
友情链接