rsa2加解密及签名校验

非对称加解密:

第一种用法:私钥签名,公钥验签。---用于签名

第二种用法:公钥加密,私钥解密。---用于加解密

class Rsa2Controller extends Controller
{
    /****
     * 第一种应用:验签(私钥加密,公钥验签)
     * @return string
     */
    public function verifySign()
    {
        $rsa2 = new Rsa2();
        $data = [
            'app_id' => 1,
            'content' => '我的就是你的',
            'from_uid' => 10024,
        ];
        ksort($data);
        $dataStr = http_build_query($data);

        //生成签名
        $signature = $rsa2->createSign($dataStr);

        echo "数据{$dataStr}签名后数据:{$signature}";

        //公钥验签
        $res = $rsa2->verifySign($dataStr, $signature);
        echo $res ? '验签成功' : '验签失败';
    }

    /****
     * 第二种应用:加解密(公钥加密,私钥解密)
     * @return array
     */
    public function decryptData()
    {
        $rsa2 = new Rsa2();
        $data = [
            'app_id' => 1,
            'content' => '我的就是你的',
            'from_uid' => 10024,
        ];
        $dataStr = json_encode($data);

        //公钥加密
        $encryptStr = $rsa2->encryptData($dataStr);

        echo "数据{$dataStr}加密后数据:{$encryptStr}";

        //私钥解密
        $originalData = $rsa2->decryptData($encryptStr);
        dd($originalData);
    }
}

下面是已经封装好的rsa2工具类:

class Rsa2
{
    //私钥和公钥直接去生成密码类网站上获取即可,也可以自己使用命令生成
    //私钥
    private $privateKey = '-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQBsyuPhUCfUPVI4zF0A6OA6tc8N35W89KNND0KcNbPLaEhNjo0z
IZjOP+D3TfJislc2o1939hs6qk1vNYA0oGPHoyV3HDhecxMh7XDXTg7WF1IZEjhJ
2JVgFe/oqFDOcCiJZUg4ixLV/NFnnayA4f2rLK8ZdO7276rZLHPIlQcbwecA7sKA
IWrvt6LbjCV/a7E7CEhLzDjC0Jaa/n//5WrtJmKlrG0TMF+S65vjz/HkxUO53JDQ
lZoDuj+FSjP0PTauZmz4ksqA4vHCqRi4ExNQ7eztH70DHEyAPeMqqsBa1Oz9hkWr
F94DMSmM9DOu5pPHfmF/6wOraKf6mUtpkRuDAgMBAAECggEARpy1peNpxpb6jAUR
BGsiRtkEiCOrw9YhO/4ApPUyOn74FubEfQB8drn9YWbFQQwyETOe3nTtnXk2A019
ZisIOGaLBbFaYOtd6rJ7gDOY65p9Xep2gG/EHHaAncjJkgQ4O11yr8iMtDmBDTjI
42pLRFQfXm2IQNy0TntMt08LKxcmqLFuMCnp4HUpkk5QVXZnhNwSHul+O2kormnd
WnTi0YvLzKqDiL4GhpD2zBzcxYgBKplKsmjcnipSU4oacA6RTGkNfLXuo4ocMjq0
z/AcNl9cwEPdvgb1ilmQEKxXTweiHRvE/SQ47k+9Nk7veN0SokctYLBCsP57QAsx
xKDR8QKBgQDHfEV+r+li/UU4stuxOxRUWbkZ3V7k9kQck/XD1UO6OxKA8iZQEL0W
eeUxDBu+E4mr/Rn79vsyzrs8lCaIq5j3lzyYGuXdMyFVnzFcSpmALvPfKxXZcevb
B1upEhKk2z6JTnqI6Ijy78C+FXSTmcbMlKBuutinAI3DhMPJaWr0mQKBgQCLnRhM
CvTu0YbSkUOGeT/nVEwWjQbAMGJAdYbR0YLmJDX5Ijp68pCQGp97/oeq8m5XPFbM
UP2YsHGUJu8qaDm9FuupxsFc7BAaH5Ylbk5O78NBp+pgiykjwAmN0Kk/Y6UXWW4s
AjTZHTiJbPEKk85MrR4eDd14kRDNg/G5AkIGewKBgFq8yheQCIbAUWYy5P8+skaT
8UA0k19uLRkarCWBsibZi9cfThIJKxk4JOokadIRrQOQQut7MlOv+Tba5JQyCYhF
QIinY3s0MKtzl841GJFXyhHu1SdtTCz6sdS7pcNa/p0SF2aC7xghufg8ZiRlRCn2
SOtVDgsYk2Ml1rCcxMuxAoGAQHInwRJdtc/qWFDNxsk5gmMbLF20/ApZkD+wGDKK
JgoZEAOI0zAdIyfm7qmznmmCHaqwtme8aDsqcqT2SbEK1go6hohEwcwGMsjZ2jVs
2Gs8ypXkTuRt/R6sSlZDigtJLdoOTSpHkuE2M9mh+qv30tUmzeDAluL/yp5Zenlc
WPkCgYEAnMxZRmDjfyAPqbBTgKXnhESNgj6mUPm1UfhjdvmorXs+AtULfC1dBW4n
WHgtyU3POihHd2swy7o0AXPqU0z4i1mETT42E+QA6OOfRpbfnamBVRlY1Fp8a09Q
nI1hhvAVabj7EKo3Rtti7iV+fwtfLPiNQ3SwjGNLKIofIyb8Huc=
-----END RSA PRIVATE KEY-----';
    //注意:-----靠最左,不然获取私钥资源会错误
    //公钥
    private $publicKey = '-----BEGIN PUBLIC KEY-----
MIIBITANBgkqhkiG9w0BAQEFAAOCAQ4AMIIBCQKCAQBsyuPhUCfUPVI4zF0A6OA6
tc8N35W89KNND0KcNbPLaEhNjo0zIZjOP+D3TfJislc2o1939hs6qk1vNYA0oGPH
oyV3HDhecxMh7XDXTg7WF1IZEjhJ2JVgFe/oqFDOcCiJZUg4ixLV/NFnnayA4f2r
LK8ZdO7276rZLHPIlQcbwecA7sKAIWrvt6LbjCV/a7E7CEhLzDjC0Jaa/n//5Wrt
JmKlrG0TMF+S65vjz/HkxUO53JDQlZoDuj+FSjP0PTauZmz4ksqA4vHCqRi4ExNQ
7eztH70DHEyAPeMqqsBa1Oz9hkWrF94DMSmM9DOu5pPHfmF/6wOraKf6mUtpkRuD
AgMBAAE=
-----END PUBLIC KEY-----';

    /***
     * 获取私钥
     * @return bool|resource
     */
    private function getPrivateKey()
    {
        $privateKey = $this->privateKey;
        //秘钥格式处理(以下多种处理方式,根据自己情况处理)
        //1,读取私钥文件
        //$res = file_get_contents(__DIR__.'/private.pem');
        //2,对秘钥进行折行处理
        //$res = "-----BEGIN RSA PRIVATE KEY-----\n" . wordwrap($keyPem, 64, "\n", true) . "\n-----END RSA PRIVATE KEY-----";
        // 请注意密钥 是不是有带   -----BEGIN RSA PRIVATE KEY-----   -----END RSA PRIVATE KEY-----
        //3,去除字符串中的空格
        //$res = str_replace("\r",'',$privateKey);
        //获取私钥资源标识符(此处返回false则说明秘钥文件格式不对,需要处理格式)

        return openssl_get_privatekey($privateKey);
    }

    /***
     * 获取公钥
     * @return bool|resource
     */
    private function getPublicKey()
    {
        $publicKey = $this->publicKey;
        return openssl_get_publickey($publicKey);
    }

    /***
     * 创建签名
     * @param string $dataStr 数据
     * @return null|string
     */
    public function createSign($dataStr = '')
    {
        if (!is_string($dataStr)) {
            return null;
        }
        $privateKey = $this->getPrivateKey();
        openssl_sign($dataStr, $sign, $this->getPrivateKey(), 'SHA256');
        //释放私钥资源标识符
        openssl_free_key($privateKey);
        return $sign ? base64_encode($sign) : null;
    }

    /**
     * 验证签名
     * @param string $dataStr 数据
     * @param string $sign 签名
     * @return bool
     */
    public function verifySign($dataStr = '', $sign = '')
    {
        if (!is_string($dataStr) || !is_string($sign)) {
            return false;
        }
        return (bool)openssl_verify($dataStr, base64_decode($sign), $this->getPublicKey(), 'SHA256');
    }

    /****
     * 公钥加密
     * @param string $dataStr 数据
     * @return string
     **/
    public function encryptData($dataStr = '')
    {
        $publicKey = $this->getPublicKey();
        return openssl_public_encrypt($dataStr, $encrypted, $publicKey)
            ? base64_encode($encrypted) : null;
    }

    /****
     * 私钥解密
     * @param string $dataStr 数据
     * @return string
     **/
    public function decryptData($encryptStr = '')
    {
        $privateKey = $this->getPrivateKey();
        $encrypted = base64_decode($encryptStr);
        $myData = openssl_private_decrypt($encrypted, $decrypted, $privateKey)
            ? json_decode($decrypted, true) : null;
        return $myData;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值