**RSA非对称加密**
结合**AES对称加密**
对app端与服务端数据交互进行处理
一、准备工作
先通过工具生成RSA密钥对(私钥保存服务端用于加密,公钥给客户端解密使用)
二、加密过程
(一)先使用RSA密钥与16位随机字符加密=>生成AES密钥
(二)用AES密钥加密数据内容
三、解密过程
(一)截取数据内容前128位,再用RSA公钥一起解密=>获取AES密钥
(二)使用AES密钥解密数据内容
//加密
public function enCodeEcho($arr)
{
$iv = '1234567890123456';
$private_key = "-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMtBHv+yQ7IiqjhR
flkX3Fkr/gD9nkNE3gaJBS1IMDEOluT5n0pxA9vlEbhGiRZnQAOBx23wDGB28iSm
dKLeJrYXppCV1f/rTxpEi7UI7l/eoRwGTCKJCBz2u6IRMxPknGV+wVr6Zs7Qm1Kq
sU4HQLVTb2NH9x4iHHvw1JADdt27AgMBAAECgYB1FgF+eLmoj3GRWdi4CBfGQqJi
/bbCt5RTHXGfATvJtsbUBrxtTKdVcCMCDZgBEN9+Za91tFfc5ghddoowHFsdearQ
dICt9nVlSGxSr8vh2IQlW0t3xCFpNX+eWfd2MCg+RV0yYp5XQuU8B92l7j/N3RM4
jpQPOZ+hzs5RSi6FIQJBAOjZXXCIiDU3CQ8mMkkS2SRvg/wBWvQOowsbzforqk2m
hUThmikIG1BWxRVR37+Xwf+HW3O+axGShByvb2vuNdECQQDfdn3JtH5ld2pbyTW3
p9FCrhsh+OZNXef38kkTwUo5R3YDLslXvFU5blLyvc1c1qxoLkUTWrv2nBO1d6FN
zmHLAkEAg9BpIQdpdBaPvk+1L8DHw+SNJt/tiTOwAN3goLqPUh3uW6wLBSddrwEv
2H3c2C0k2W7ayo8FNZFn0IVP4h2bwQJAHyF4wKLegPAz5vmO/Djq1ClBKmhsXRbZ
/BbKy2/AEV69OBBKiGh6TvfpoluCwo49kn3vrZSUXvS7Yip6VEaOJQJAZW4fr97L
stHH0JJmrou2CPQlR1nIBKbpLzjqZT/CatrQSSEb4fdLq9NC10T2HvMEBMl7MCl2
Pj07BdIgvJto9w==
-----END PRIVATE KEY-----
";
$pri_key = openssl_pkey_get_private($private_key);
$aesKey = $this->create_randomstr(16);
//加密aes密钥 $encrypted
openssl_private_encrypt($aesKey, $encrypted, $pri_key);
//用aes密钥加密数据内容
$enArr = openssl_encrypt(json_encode($arr), 'AES-128-ECB', $aesKey, OPENSSL_RAW_DATA);
$return = array('info' => base64_encode($encrypted . $enArr));
echo json_encode($return);
}
//解密
public function deCodeEcho($info)
{
$iv = '1234567890123456';
$public_key = "-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLQR7/skOyIqo4UX5ZF9xZK/4A
/Z5DRN4GiQUtSDAxDpbk+Z9KcQPb5RG4RokWZ0ADgcdt8AxgdvIkpnSi3ia2F6aQ
ldX/608aRIu1CO5f3qEcBkwiiQgc9ruiETMT5JxlfsFa+mbO0JtSqrFOB0C1U29j
R/ceIhx78NSQA3bduwIDAQAB
-----END PUBLIC KEY-----
";
$pri_key = openssl_pkey_get_public($public_key);
$info = base64_decode($info);
//获取加密的AES密钥
$aesKey = substr($info, 0, 128);
//解密得到AES密钥 $key
openssl_public_decrypt($aesKey, $key, $pri_key);
//获取待解密数据
$data = substr($info, 128);
//解密得到数据
$post_data = (openssl_decrypt($data, 'AES-128-ECB', $key, OPENSSL_RAW_DATA));
echo $post_data;
//dd(json_decode($post_data, true));
}
public function create_randomstr($lenth = 6)
{
return $this->random($lenth, '123456789abcdefghijklmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ');
}
public function random($length, $chars = '0123456789')
{
$hash = '';
$max = strlen($chars) - 1;
mt_srand();
for ($i = 0; $i < $length; $i++) {
$hash .= $chars[mt_rand(0, $max)];
}
return $hash;
}