SignUtil.php 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. <?php
  2. namespace app\extra\dyLife;
  3. class SignUtil
  4. {
  5. private $secret;
  6. private $key;
  7. private $iv;
  8. public function init(string $secret = "") {
  9. $this->secret = $secret;
  10. $this->key = $this->parseSecret($secret);
  11. $this->iv = substr($this->key, 16);
  12. return $this;
  13. }
  14. /**
  15. * @Description AES解密
  16. * @param string $data base64后的密文
  17. * @return string 明文
  18. */
  19. public function decryptAES($data) {
  20. try {
  21. $encrypted = $this->decode($data); // 先用base64解密
  22. $decrypted = openssl_decrypt(
  23. $encrypted,
  24. 'AES-256-CBC',
  25. $this->key,
  26. OPENSSL_RAW_DATA,
  27. $this->iv
  28. );
  29. return $decrypted;
  30. } catch (\Exception $e) {
  31. // error_log($e->getMessage());
  32. return null;
  33. }
  34. }
  35. /**
  36. * base64编码
  37. */
  38. public function encode($data) {
  39. return base64_encode($data);
  40. }
  41. /**
  42. * base64解码
  43. */
  44. public function decode($data) {
  45. return base64_decode($data);
  46. }
  47. private function parseSecret($secret) {
  48. $secret = $this->fillSecret($secret);
  49. $secret = $this->cutSecret($secret);
  50. return $secret;
  51. }
  52. private function cutSecret($secret) {
  53. if (strlen($secret) <= 32) {
  54. return $secret;
  55. }
  56. $rightCnt = (int)((strlen($secret) - 32) / 2);
  57. $leftCnt = strlen($secret) - 32 - $rightCnt;
  58. return substr($secret, $leftCnt, 32);
  59. }
  60. private function fillSecret($secret) {
  61. if (strlen($secret) >= 32) {
  62. return $secret;
  63. }
  64. $rightCnt = (int)((32 - strlen($secret)) / 2);
  65. $leftCnt = 32 - strlen($secret) - $rightCnt;
  66. $sb = str_repeat('#', $leftCnt);
  67. $sb .= $secret;
  68. $sb .= str_repeat('#', $rightCnt);
  69. return $sb;
  70. }
  71. }