2023-05-12 开启多语言插件支持……

php中rsa加密及解密和签名及验签

php 苏 demo 2738℃

加密的内容长度限制为密钥长度少11位,如128位的密钥最多加密的内容为117个长度。

私钥加签:

/**
 *
 * @param $data 待签名数据
 * @return string 签名结果
 */
public function opensslPrivateEnsign($data)
{
    $private_key = ROOT_PATH . 'data/cert/rsa_private_key.pem';
    $priKey      = file_get_contents($private_key);
    $private_key = openssl_get_privatekey($priKey);
    $sign        = '';
    openssl_sign($data, $sign, $private_key);
    openssl_free_key($private_key);
    $sign = base64_encode($sign);//最终的签名   

    return $sign;
}

公钥验签:

/**
 * openssl 公钥验签
 * @param $original_str
 * @param $sign
 * @return string
 */
public function opensslPublicVerifySign($original_str, $sign)
{
    $public_key = ROOT_PATH . 'data/cert/rsa_public_key.pem';
    $pubKey     = file_get_contents($public_key);
    $public_key = openssl_get_publickey($pubKey);

    $sign   = base64_decode($sign);//得到的签名
    $result = (bool)openssl_verify($original_str, $sign, $public_key);
    openssl_free_key($public_key);

    return $result;
}

公钥加密:

/**
 * openssl根据公钥加密
 * @param $data 待签名数据
 * @return string 签名结果
 */
public function opensslPublicEncrypt($data)
{
    $public_key_path = ROOT_PATH . 'data/cert/rsa_public_key.pem';
    $pubKey          = file_get_contents($public_key_path);
    $public_key      = openssl_get_publickey($pubKey);

    $original_arr = str_split($data, 117);
    //折分
    foreach ($original_arr as $o) {
        $sub_enc = null;
        openssl_public_encrypt($o, $sub_enc, $public_key,OPENSSL_PKCS1_PADDING);
        $original_enc_arr[] = $sub_enc;
    }
    openssl_free_key($public_key);
    $original_enc_str = base64_encode(implode('', $original_enc_arr));//最终网络传的密文
    return $original_enc_str;
}

私钥解密:

/**
 * openssl根据私钥解密
 * @param $encryptData
 * @return string
 */
public function opensslPrivateDescrypt($encryptData)
{
    $private_key_path = ROOT_PATH . 'data/cert/rsa_private_key.pem';
    $priKey           = file_get_contents($private_key_path);
    $private_key      = openssl_get_privatekey($priKey);

    $original_enc_str = base64_decode($encryptData);
    $orig_dec_str     = '';
    for ($i = 0; $i < strlen($original_enc_str) / 128; $i++) {
        $data = substr($original_enc_str, $i * 128, 128);
        openssl_private_decrypt($data, $decrypt, $private_key,OPENSSL_PKCS1_PADDING);
        $orig_dec_str .= $decrypt;
    }
    return $orig_dec_str;
}

注:私钥加密及公钥解密同理。

 

打赏

转载请注明:苏demo的别样人生 » php中rsa加密及解密和签名及验签

   如果本篇文章对您有帮助,欢迎向博主进行赞助,赞助时请写上您的用户名。
支付宝直接捐助帐号oracle_lee@qq.com 感谢支持!
喜欢 (0)or分享 (0)