php加解密(aes+rsa)
首页->学习资料->编程语言->php教程->php技巧 关键词: 发布时间:2019-12-10 02:10:33 浏览次数:1701

本例为app与接口之间的双向加解密demo

<?php
require_once 'Aes.php';
$origin = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : '';
$config = require_once 'site.php';
$allowDomain = $config['origin'];
if (in_array($origin, $allowDomain) || empty($origin)) {
    header("Access-Control-Allow-Origin:" . $origin);
    header("Access-Control-Allow-Credentials: true");
}

$rsaPrivateKey = $config['rsa_private_key'];
$rsaPrivateKey = "-----BEGIN RSA PRIVATE KEY-----\n" .
    wordwrap($rsaPrivateKey, 64, "\n", true) .
    "\n-----END RSA PRIVATE KEY-----";

$rsaPublicKey = $config['rsa_public_key'];
$rsaPublicKey = "-----BEGIN PUBLIC KEY-----\n" .
    wordwrap($rsaPublicKey, 64, "\n", true) .
    "\n-----END PUBLIC KEY-----";
//$post=file_get_contents("php://input");
//print_r(json_decode($post,true));
//die();
$type = !empty($_POST['type']) ? trim($_POST['type']) : '';
$data = !empty($_POST['data']) ? trim($_POST['data']) : '';//app传递的数据(原文或密文)
//app端的参数要做urlencode处理,不然+号传过来就转成空格了;

switch ($type) {
    case 0://原样返回
        echo $data;
        break;
    case 1://app传base64_encode(aes(hello))密文,先解密再加密
        $post = json_decode($data, true);
        $message = ($post['message']);
        $aes = new Aes($config['aes_key'], $config['aes_iv'], $config['aes_method']);
        //echo base64_encode($aes->encrypt('P@ssw0rd!@#$%^&*()_-+=ចំនួនទទួលអទិថិជនក្នុងពេលតែមួយ'));die();
        //SzYzYUJubU5DZTZ0UUdCclh0UzhrN1pzU1lhKzVLTVBjQWFOZWdQZm51ZUwxYW9nVGlNNzJac1l4SDgxZFMyWGdScTZ4NG85SU05SWttaklmV3FDcmNpajZDMDNzSVN3QVlhRTVWK2JuRE82TmxJZUpMU2NZNndJeGFlNEdKazRSSXhFTzlWekltbFAvSDFWWlFtbjhBPT0=
        $jiemi = $aes->decrypt($message);
        if (!$jiemi) {
            echo json_encode([
                'message' => '',
                'key' => ''
            ]);
            die();
        }
        //echo $jiemi;die();
        $secretStr = ($aes->encrypt('success$$' . $jiemi));
        echo json_encode([
            'message' => $secretStr,
            'key' => ''
        ]);
        break;
    case 2://app传aes+rsa(公钥)加密
        /**
         * {
         * "message": "SzYzYUJubU5DZTZ0UUdCclh0UzhrN1pzU1lhKzVLTVBjQWFOZWdQZm51ZUwxYW9nVGlNNzJac1l4SDgxZFMyWGdScTZ4NG85SU05SWttaklmV3FDcmNpajZDMDNzSVN3QVlhRTVWK2JuRE82TmxJZUpMU2NZNndJeGFlNEdKazRSSXhFTzlWekltbFAvSDFWWlFtbjhBPT0=",
         * "key": "hVYlNNbDJleZkhWbqy3L5k1nzTNW4LP8CdrI/WFxC9Xye9miRB/Qzp4jJ3b3vrVtlFcTzR0mFefNiuSVjQJoV2khQB4YsSI0Q33q48PP2ZpHhvRErjYXOgkilIr54tJq66n9909UB59A+iD1Ky06UcR3g8kPJTwnIufyZA2PRWiBueIXE5Ou78Sf4rN/wy9jKApO16ThN1KYnIMP4SVDZ4PKbDMROd7UCzXxGpmKdm8jIFNFcgBrojroaEL2SPqT0Z9cnIQyH+cvyDlZsY0YyCpmx62o285A7tT9hhGZ+aakk0NwslWzQiW0dcRdN6aZ4buWmbv7vlbY8Ed4G1j0ug=="
         * }
         */
        $post = json_decode($data, true);
        //数据:app用aes加密生成的
        $message = $post['message'];
        //aes的key,由app用rsa_public_key生成,用base64_encode转码
        $rsaJiamiAesKey = base64_decode($post['key']);
        //$rsaJiamiAesKey
        openssl_private_decrypt($rsaJiamiAesKey, $aesKey, openssl_pkey_get_private($rsaPrivateKey));
        //echo $aesKey;die();
//        $aes = new Aes($config['aes_key'], $config['aes_iv'], $config['aes_method']);
//        echo base64_encode($aes->encrypt('P@ssw0rd!@#$%^&*()_-+=ចំនួនទទួលអទិថិជនក្នុងពេលតែមួយ'));die();
        //SzYzYUJubU5DZTZ0UUdCclh0UzhrN1pzU1lhKzVLTVBjQWFOZWdQZm51ZUwxYW9nVGlNNzJac1l4SDgxZFMyWGdScTZ4NG85SU05SWttaklmV3FDcmNpajZDMDNzSVN3QVlhRTVWK2JuRE82TmxJZUpMU2NZNndJeGFlNEdKazRSSXhFTzlWekltbFAvSDFWWlFtbjhBPT0=
        //openssl_public_encrypt($config['aes_key'],$aaa,openssl_pkey_get_public($rsaPublicKey));
        //echo base64_encode($aaa);die();
        //hVYlNNbDJleZkhWbqy3L5k1nzTNW4LP8CdrI/WFxC9Xye9miRB/Qzp4jJ3b3vrVtlFcTzR0mFefNiuSVjQJoV2khQB4YsSI0Q33q48PP2ZpHhvRErjYXOgkilIr54tJq66n9909UB59A+iD1Ky06UcR3g8kPJTwnIufyZA2PRWiBueIXE5Ou78Sf4rN/wy9jKApO16ThN1KYnIMP4SVDZ4PKbDMROd7UCzXxGpmKdm8jIFNFcgBrojroaEL2SPqT0Z9cnIQyH+cvyDlZsY0YyCpmx62o285A7tT9hhGZ+aakk0NwslWzQiW0dcRdN6aZ4buWmbv7vlbY8Ed4G1j0ug==
        //用解出来的key解数据
        $aes = new Aes($aesKey, $config['aes_iv'], $config['aes_method']);
        $message = $aes->decrypt($message);
        if (!$aesKey || !$message) {
            echo json_encode([
                'message' => '',
                'key' => ''
            ]);
            die();
        }
        //echo $message;die();
        //私钥加密
        //@todo $config['aes_key']这个可以随机一下,提高安全性
        $newKey=str_random(32);//$config['aes_key']
        $aesNew = new Aes($newKey, $config['aes_iv'], $config['aes_method']);
        openssl_private_encrypt($newKey, $aesKeySecret, $rsaPrivateKey);
        $data = [
            'message' => ($aesNew->encrypt('success$$' . $message)),
            'key' => base64_encode($aesKeySecret)
        ];
        echo json_encode($data);
        break;
    default:
        break;
}

function str_random($len){
    $str='abcdefghijklmnopqrstuvwxya1234567890';
    $str=str_shuffle($str);
    return substr($str,0,$len);
}
/**
 * hello hello
 *
 * base64_encode(aes(hello)) ->hello->success$$hello->base64_encode(aes(success$$hello))
 *
 * key: base64_encode(rsa_public(key))    base64_encode(rsa_private(key))
 *
 * @param $config
 * @param $type
 * @param $data
 * @return array|string
 */
function jiajiemi($config, $type, $data)
{
    $rsaPrivateKey = $config['rsa_private_key'];
    $rsaPrivateKey = "-----BEGIN RSA PRIVATE KEY-----\n" .
        wordwrap($rsaPrivateKey, 64, "\n", true) .
        "\n-----END RSA PRIVATE KEY-----";

    $rsaPublicKey = $config['rsa_public_key'];
    $rsaPublicKey = "-----BEGIN PUBLIC KEY-----\n" .
        wordwrap($rsaPublicKey, 64, "\n", true) .
        "\n-----END PUBLIC KEY-----";

    switch ($type) {
        case 1://aes加密
            //P@ssw0rd!@#$%^&*()_-+=ចំនួនទទួលអទិថិជនក្នុងពេលតែមួយ
            //l7ZRPfQk0mcFHBHtu4FPWDUc6cpNXpDjL6gntDO9tC4DgfaJtmwE2FTLYlrFn7OIURiJ09MrcxYR2PCQ3IG9oVnRS0iylj5rjT0pkRqT5j6LBcC+uIhTAuOXRvSCyeWTQrlN2FcgwwwtDZHpKv65Jw==
            $aes = new Aes($config['aes_key'], $config['aes_iv'], $config['aes_method']);
            $secretStr = $aes->encrypt($data);
            return base64_encode($secretStr);
            break;
        case 2://aes解密
            $data = base64_decode($data);
            $aes = new Aes($config['aes_key'], $config['aes_iv'], $config['aes_method']);
            $secretStr = $aes->decrypt($data);
            return $secretStr;
            break;
        case 3://aes+rsa(私钥)加密
            //aes加密数据data
            $aes = new Aes($config['aes_key'], $config['aes_iv'], $config['aes_method']);
            $data = $aes->encrypt($data);
            //rsa加密aes_public_key

            //KzKthoiCV4Zfy02aJt6iHhN06alBQAp3oYWrN/nOQj7CW/eYwu3ccf9BNUXix+7fzkjKj52jfFrs2dBBc9+ANVi/LlwKZRIm1kfAfe/jHFWEoMiRwA+1x3NZXyCzIMlluaC+edZisBbfEJIDvJR6ST19rVXKF7ma/ZAcRrl+2pQ90pJaph3X9E29TO8m9LULbDorhr9UeqWuBr97zDXtyjN2yxGMMbOgUpFUZSAMxAKaaDZ5KnEfi9JbQsW81ryP4kYEY+cnkmVbL59w9mA+CAD1wDDNvZn5RFopj5gYQYys2WeDaZFhaIq0GFEfLmehu3nA6TuAW/iIv+9PMv8kZA==
            openssl_private_encrypt($config['aes_key'], $aesKeySecret, $rsaPrivateKey);//私钥加密
            $aesKeySecret = base64_encode($aesKeySecret);//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的
            $data = [
                'message' => 'success$$' . $data,
                'key' => 'success$$' . $aesKeySecret
            ];
            return $data;
            break;
        case 4://aes+rsa(公钥)解密
            $post = json_decode($data, true);
            $message = $post['message'];
            $key = base64_decode($post['key']);

            $aes = new Aes($config['aes_key'], $config['aes_iv'], $config['aes_method']);
            $message = $aes->decrypt($message);
            openssl_public_decrypt($key, $decrypted, openssl_pkey_get_public($rsaPublicKey));//私钥加密的由公钥解密
            $data = [
                'message' => $message,
                'key' => $decrypted
            ];
            return $data;
            break;
        case 5://aes+rsa(公钥)加密
            //aes加密数据data
            $aes = new Aes($config['aes_key'], $config['aes_iv'], $config['aes_method']);
            $data = $aes->encrypt($data);
            //rsa加密aes_public_key

            //KzKthoiCV4Zfy02aJt6iHhN06alBQAp3oYWrN/nOQj7CW/eYwu3ccf9BNUXix+7fzkjKj52jfFrs2dBBc9+ANVi/LlwKZRIm1kfAfe/jHFWEoMiRwA+1x3NZXyCzIMlluaC+edZisBbfEJIDvJR6ST19rVXKF7ma/ZAcRrl+2pQ90pJaph3X9E29TO8m9LULbDorhr9UeqWuBr97zDXtyjN2yxGMMbOgUpFUZSAMxAKaaDZ5KnEfi9JbQsW81ryP4kYEY+cnkmVbL59w9mA+CAD1wDDNvZn5RFopj5gYQYys2WeDaZFhaIq0GFEfLmehu3nA6TuAW/iIv+9PMv8kZA==
            openssl_public_encrypt($config['aes_key'], $aesKeySecret, $rsaPublicKey);//私钥加密
            $aesKeySecret = base64_encode($aesKeySecret);//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的
            $data = [
                'message' => 'success$$' . $data,
                'key' => 'success$$' . $aesKeySecret
            ];
            return $data;
            break;
        case 6://aes+rsa(私钥)解密
            $post = json_decode($data, true);
            $message = $post['message'];
            $key = base64_decode($post['key']);

            $aes = new Aes($config['aes_key'], $config['aes_iv'], $config['aes_method']);
            $message = $aes->decrypt($message);
            openssl_private_decrypt($key, $decrypted, openssl_pkey_get_private($rsaPrivateKey));//私钥加密的由公钥解密
            $data = [
                'message' => $message,
                'key' => $decrypted
            ];
            return $data;
            break;
        default:
            echo '未知类型';//|success
            break;
    }
}


?>


赞:(0)
踩:(0)
相关文章
phpexcel设置行高及列宽,背景颜色,
单点登录sso原理及php实现方式及de
在php中用curl请求java接口无法获
免费ip地址查询接口
php,java,android, aes加解密-加密
地图上计算两点间的距离
关于百度地图的一些技巧
php中empty,is_null,isset的区别
windows及linux下composer安装教程
一种精妙的数据查询与存储方式
热门文章
win7中将文件拷贝到虚拟机linux下
phpexcel设置行高及列宽,背景颜色,
rabbitmq无法启动
intellij idea不显示git push按钮
php7中使用mongodb的aggregate进行
centos7.4 64位下swoole安装及配置
laravel页面静态化的方法
navicate连接mycat报1184错误
单点登录sso原理及php实现方式及de
devops-jenkins容器为pending状态
好评文章
phpexcel设置行高及列宽,背景颜色,
php7中使用mongodb的aggregate进行
intellij idea打开文件所在文件夹
windows下使用MongoDB Compass Com
win7中将文件拷贝到虚拟机linux下
laravel 中悲观锁 & 乐观锁的使用
单点登录sso原理及php实现方式及de
navicate连接mycat报1184错误
rabbitmq无法启动
laravel整合dingo/api方法步骤:jwt
标签
rabbitmq mysql备份 elasticsearch golang swoole
我的项目
【github】www.github.com/hurong241
【码云】gitee.com/hu_rong/projects
【docker hub】hub.docker.com/repositories/hurong241
【packagist】packagist.org/users/hurong241/packages
站点信息
建站时间:2011年
文章数:607篇
浏览数:940840
粤ICP备18028092号-1  微信:hurong241