【PHP、RSA】php之RSA加密解密

文章介绍了如何在PHP中使用OpenSSL模块实现RSA非对称加密算法,包括公钥加密和私钥解密的过程,并提供了相应的代码示例。

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

介绍

RSA算法属于非对称加密算法,非对称加密算法需要两个秘钥:公开密钥(publickey)和私有秘钥(privatekey).公开密钥和私有秘钥是一对,如果公开密钥对数据进行加密,只有用对应的私有秘钥才能解密;如果私有秘钥对数据进行加密那么只有用对应的公开密钥才能解密.因为加密解密使用的是两个不同的秘钥,所以这种算法叫做非对称加密算法.简单的说就是公钥加密私钥解密,私钥加密公钥解密

准备

需要给PHP打开OpenSSL模块

代码

/**

 * RSA算法属于非对称加密算法,非对称加密算法需要两个秘钥:公开密钥(publickey)和私有秘钥(privatekey).公开密钥和私有秘钥是一对,如果公开密钥对数据进行加密,只有用对应的私有秘钥才能解密;如果私有秘钥对数据进行加密那么只有用对应的公开密钥才能解密.因为加密解密使用的是两个不同的秘钥,所以这种算法叫做非对称加密算法.简单的说就是公钥加密私钥解密,私钥加密公钥解密.

 * 需要给PHP打开OpenSSL模块

 * 生成公钥和私钥的链接:  http://web.chacuo.net/netrsakeypair

 * openssl_pkey_get_public //检查公钥是否可用

 * openssl_public_encrypt //公钥加密

 * openssl_pkey_get_private //检查私钥是否可用

 * openssl_private_decrypt //私钥解密

 *

 */

// $str = '封装测试';

$str = json_encode([ 'a'=>1, 'b'=>2, 'f'=>6,]);

$cdata = RSA_openssl($str);

var_dump($cdata);

echo "<hr>";

$ddata = RSA_openssl($cdata,'decode');

var_dump($ddata);

/**

 * RSA数据加密解密

 * @param type $data

 * @param type $type encode加密  decode解密

 */

function RSA_openssl($data,$type='encode'){

    if (empty($data)) {

        return 'data参数不能为空';

    }

    if (is_array($data)) {

        return 'data参数不能是数组形式';

    }

    $rsa_public = config('rsa_public');

    if(empty($rsa_public)){

        $rsa_public = '-----BEGIN PUBLIC KEY-----

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCmkANmC849IOntYQQdSgLvMMGm

8V/u838ATHaoZwvweoYyd+/7Wx+bx5bdktJb46YbqS1vz3VRdXsyJIWhpNcmtKhY

inwcl83aLtzJeKsznppqMyAIseaKIeAm6tT8uttNkr2zOymL/PbMpByTQeEFlyy1

poLBwrol0F4USc+owwIDAQAB

-----END PUBLIC KEY-----';

    }

    $rsa_private = config('rsa_private');

    if(empty($rsa_private)){

        $rsa_private = '-----BEGIN PRIVATE KEY-----

MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKaQA2YLzj0g6e1h

BB1KAu8wwabxX+7zfwBMdqhnC/B6hjJ37/tbH5vHlt2S0lvjphupLW/PdVF1ezIk

haGk1ya0qFiKfByXzdou3Ml4qzOemmozIAix5ooh4Cbq1Py6202SvbM7KYv89syk

HJNB4QWXLLWmgsHCuiXQXhRJz6jDAgMBAAECgYAIF5cSriAm+CJlVgFNKvtZg5Tk

93UhttLEwPJC3D7IQCuk6A7Qt2yhtOCvgyKVNEotrdp3RCz++CY0GXIkmE2bj7i0

fv5vT3kWvO9nImGhTBH6QlFDxc9+p3ukwsonnCshkSV9gmH5NB/yFoH1m8tck2Gm

BXDj+bBGUoKGWtQ7gQJBANR/jd5ZKf6unLsgpFUS/kNBgUa+EhVg2tfr9OMioWDv

MSqzG/sARQ2AbO00ytpkbAKxxKkObPYsn47MWsf5970CQQDIqRiGmCY5QDAaejW4

HbOcsSovoxTqu1scGc3Qd6GYvLHujKDoubZdXCVOYQUMEnCD5j7kdNxPbVzdzXll

9+p/AkEAu/34iXwCbgEWQWp4V5dNAD0kXGxs3SLpmNpztLn/YR1bNvZry5wKew5h

z1zEFX+AGsYgQJu1g/goVJGvwnj/VQJAOe6f9xPsTTEb8jkAU2S323BG1rQFsPNg

jY9hnWM8k2U/FbkiJ66eWPvmhWd7Vo3oUBxkYf7fMEtJuXu+JdNarwJAAwJK0YmO

LxP4U+gTrj7y/j/feArDqBukSngcDFnAKu1hsc68FJ/vT5iOC6S7YpRJkp8egj5o

pCcWaTO3GgC5Kg==

-----END PRIVATE KEY-----';

    }

    //私钥解密

    if ($type=='decode') {

        $private_key = openssl_pkey_get_private($rsa_private);

        if (!$private_key) {

            return('私钥不可用');

        }

        $return_de = openssl_private_decrypt(base64_decode($data), $decrypted, $private_key);

        if (!$return_de) {

            return('解密失败,请检查RSA秘钥');

        }

        return $decrypted;

    }

    //公钥加密

    $key = openssl_pkey_get_public($rsa_public);

    if (!$key) {

        return('公钥不可用');

    }

    //openssl_public_encrypt 第一个参数只能是string

    //openssl_public_encrypt 第二个参数是处理后的数据

    //openssl_public_encrypt 第三个参数是openssl_pkey_get_public返回的资源类型

    $return_en = openssl_public_encrypt($data, $crypted, $key);

    if (!$return_en) {

        return('加密失败,请检查RSA秘钥');

    }

    return base64_encode($crypted);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值