**RSA非对称加密**结合**AES对称加密**对app端与服务端数据交互进行处理

一、准备工作

先通过工具生成RSA密钥对(私钥保存服务端用于加密,公钥给客户端解密使用)

二、加密过程

(一)先使用RSA密钥与16位随机字符加密=>生成AES密钥
(二)用AES密钥加密数据内容

三、解密过程

(一)截取数据内容前128位,再用RSA公钥一起解密=>获取AES密钥
(二)使用AES密钥解密数据内容

  1. //加密
  2. public function enCodeEcho($arr)
  3. {
  4. $iv = '1234567890123456';
  5. $private_key = "-----BEGIN PRIVATE KEY-----
  6. MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMtBHv+yQ7IiqjhR
  7. flkX3Fkr/gD9nkNE3gaJBS1IMDEOluT5n0pxA9vlEbhGiRZnQAOBx23wDGB28iSm
  8. dKLeJrYXppCV1f/rTxpEi7UI7l/eoRwGTCKJCBz2u6IRMxPknGV+wVr6Zs7Qm1Kq
  9. sU4HQLVTb2NH9x4iHHvw1JADdt27AgMBAAECgYB1FgF+eLmoj3GRWdi4CBfGQqJi
  10. /bbCt5RTHXGfATvJtsbUBrxtTKdVcCMCDZgBEN9+Za91tFfc5ghddoowHFsdearQ
  11. dICt9nVlSGxSr8vh2IQlW0t3xCFpNX+eWfd2MCg+RV0yYp5XQuU8B92l7j/N3RM4
  12. jpQPOZ+hzs5RSi6FIQJBAOjZXXCIiDU3CQ8mMkkS2SRvg/wBWvQOowsbzforqk2m
  13. hUThmikIG1BWxRVR37+Xwf+HW3O+axGShByvb2vuNdECQQDfdn3JtH5ld2pbyTW3
  14. p9FCrhsh+OZNXef38kkTwUo5R3YDLslXvFU5blLyvc1c1qxoLkUTWrv2nBO1d6FN
  15. zmHLAkEAg9BpIQdpdBaPvk+1L8DHw+SNJt/tiTOwAN3goLqPUh3uW6wLBSddrwEv
  16. 2H3c2C0k2W7ayo8FNZFn0IVP4h2bwQJAHyF4wKLegPAz5vmO/Djq1ClBKmhsXRbZ
  17. /BbKy2/AEV69OBBKiGh6TvfpoluCwo49kn3vrZSUXvS7Yip6VEaOJQJAZW4fr97L
  18. stHH0JJmrou2CPQlR1nIBKbpLzjqZT/CatrQSSEb4fdLq9NC10T2HvMEBMl7MCl2
  19. Pj07BdIgvJto9w==
  20. -----END PRIVATE KEY-----
  21. ";
  22. $pri_key = openssl_pkey_get_private($private_key);
  23. $aesKey = $this->create_randomstr(16);
  24. //加密aes密钥 $encrypted
  25. openssl_private_encrypt($aesKey, $encrypted, $pri_key);
  26. //用aes密钥加密数据内容
  27. $enArr = openssl_encrypt(json_encode($arr), 'AES-128-ECB', $aesKey, OPENSSL_RAW_DATA);
  28. $return = array('info' => base64_encode($encrypted . $enArr));
  29. echo json_encode($return);
  30. }
  31. //解密
  32. public function deCodeEcho($info)
  33. {
  34. $iv = '1234567890123456';
  35. $public_key = "-----BEGIN PUBLIC KEY-----
  36. MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLQR7/skOyIqo4UX5ZF9xZK/4A
  37. /Z5DRN4GiQUtSDAxDpbk+Z9KcQPb5RG4RokWZ0ADgcdt8AxgdvIkpnSi3ia2F6aQ
  38. ldX/608aRIu1CO5f3qEcBkwiiQgc9ruiETMT5JxlfsFa+mbO0JtSqrFOB0C1U29j
  39. R/ceIhx78NSQA3bduwIDAQAB
  40. -----END PUBLIC KEY-----
  41. ";
  42. $pri_key = openssl_pkey_get_public($public_key);
  43. $info = base64_decode($info);
  44. //获取加密的AES密钥
  45. $aesKey = substr($info, 0, 128);
  46. //解密得到AES密钥 $key
  47. openssl_public_decrypt($aesKey, $key, $pri_key);
  48. //获取待解密数据
  49. $data = substr($info, 128);
  50. //解密得到数据
  51. $post_data = (openssl_decrypt($data, 'AES-128-ECB', $key, OPENSSL_RAW_DATA));
  52. echo $post_data;
  53. //dd(json_decode($post_data, true));
  54. }
  55. public function create_randomstr($lenth = 6)
  56. {
  57. return $this->random($lenth, '123456789abcdefghijklmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ');
  58. }
  59. public function random($length, $chars = '0123456789')
  60. {
  61. $hash = '';
  62. $max = strlen($chars) - 1;
  63. mt_srand();
  64. for ($i = 0; $i < $length; $i++) {
  65. $hash .= $chars[mt_rand(0, $max)];
  66. }
  67. return $hash;
  68. }