RSA加解密、签名、验签,对接java可用

本文记录了与Java接口交互时使用RSA加解密和签名验证的方法,旨在方便日后查阅与实施。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

经常要跟java对接口用到RSA加解密及签名验签,现把方法记录下来方便用时查看:

class Rsa
{
     const MAX_ENCRYPT_BLOCK = 117;
     const MAX_DECRYPT_BLOCK = 128;
     
    /**
     * 私钥加密
     * @param $plainString
     * @param $privateKey
     * @return string
     */
    public static function priEncrypt($plainString, $privateKey)
    {
        $encryptedString = "";
        $strlen = strlen($plainString);
        if ($strlen < 118) {
            openssl_private_encrypt($plainString, $encryptedString, self::conertKey($privateKey,"pri"));//私钥加密
        } else {
            foreach (str_split($plainString, self::MAX_ENCRYPT_BLOCK) as $chunk) {
                openssl_private_encrypt($chunk, $chunkString, self::conertKey($privateKey,"pri"));
                $encryptedString .= $chunkString;
            }
        }
        return $encryptedString;
    }

    /**
     * 私钥解密
     * @param $encryptedString
     * @param $privateKey
     * @return string
     */
    public static function priDecrypt($encryptedString, $privateKey)
    {
        $plainString = "";
        $strlen = strlen($encryptedString);
        if ($strlen < 129) {
            openssl_private_decrypt($encryptedString,$plainString,self::conertKey($privateKey,"pri"));//私钥解密
        } else {
            foreach (str_split($encryptedString, self::MAX_DECRYPT_BLOCK) as $chunk) {
                openssl_private_decrypt($encryptedString,$chunkString,self::conertKey($privateKey,"pri"));//私钥解密
                $plainString .= $chunkString;
            }
        }
        return $plainString;
    }

    /**
     * 公钥加密
     * @param $plainString
     * @param $publicKey
     * @return string
     */
    public static function pubEncrypt($plainString, $publicKey)
    {
        $encryptedString = "";
        $strlen = strlen($plainString);
        if ($strlen < 118) {
            openssl_public_encrypt($plainString,$encryptedString,self::conertKey($publicKey,"pub"));//公钥加密
        } else {
            foreach (str_split($plainString, self::MAX_ENCRYPT_BLOCK) as $chunk) {
                openssl_public_encrypt($chunk,$chunkString,self::conertKey($publicKey,"pub"));//公钥加密
                $encryptedString .= $chunkString;
            }
        }
        return $encryptedString;
    }

    /**
     * 公钥解密
     * @param $encryptedString
     * @param $publicKey
     * @return string
     */
    public static function pubDecrypt($encryptedString, $publicKey)
    {
        $plainString = "";
        $strlen = strlen($encryptedString);
        if ($strlen < 129) {
            openssl_public_decrypt($encryptedString,$plainString,self::conertKey($publicKey,"pub"),OPENSSL_PKCS1_PADDING);//公钥解密
        } else {
            foreach (str_split($encryptedString, self::MAX_DECRYPT_BLOCK) as $chunk) {
                openssl_public_decrypt($chunk, $chunkString, self::conertKey($publicKey,"pub"),OPENSSL_PKCS1_PADDING);
                $plainString .= $chunkString;
            }
        }
        return $plainString;
    }
  
    /**
     * 私钥签名
     * @param $alg 加密方式选择双方约定好的方式
     */
    public static function sign($data, $key, $alg = OPENSSL_ALGO_SHA256)
    {
        $encSign = "";
        openssl_sign($data, $encSign, self::conertKey($key,"pri"), $alg);
        return $encSign;
    }
 
    //公钥验签
    public static function verify($data, $sign, $key, $alg = OPENSSL_ALGO_SHA256)
    {
        return openssl_verify($data, base64_decode($sign), self::conertKey($key,"pub"), $alg);
    }

    // 将java公私钥格式转化为PHP可识别的pem格式 
     public static function conertKey($key,$type){
     {
            if($type == 'pri'){
                $begin = "-----BEGIN PRIVATE KEY-----\n";
                $end = "\n-----END PRIVATE KEY-----";
            }else{
                $begin = "-----BEGIN PUBLIC KEY-----\n";
                $end = "\n-----END PUBLIC KEY-----";
            }
            $key_string = $begin . wordwrap($key, 64, "\n", true) . $end;
            return $key_string;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值