Aes.php 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Utils\Encrypt;
  4. use App\Master\Enum\RedisKeyEnum;
  5. use App\Utils\RedisUtil;
  6. class Aes
  7. {
  8. /**
  9. * 加密
  10. * @param string $data 要加密的数据
  11. * @param string $key 密钥应该是16字节(128位),24字节(192位)或32字节(256位)
  12. * @param string $method 加密类型
  13. * @return string
  14. */
  15. public static function encode(string $data, string $key, string $method = 'AES-256-CBC'): string
  16. {
  17. $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($method)); // 生成随机IV
  18. $encrypted = openssl_encrypt($data, $method, $key, OPENSSL_RAW_DATA, $iv);
  19. // 使用base64编码输出加密数据,以便于存储和传输
  20. return base64_encode($iv . $encrypted);
  21. }
  22. /**
  23. * 解密
  24. * @param string $data 要加密的数据
  25. * @param string $key 密钥应该是16字节(128位),24字节(192位)或32字节(256位)
  26. * @param string $method 加密类型
  27. * @return false|string
  28. */
  29. public static function decode(string $data, string $key, string $method = 'AES-256-CBC'): false|string
  30. {
  31. $decodedData = base64_decode($data);
  32. $iv = substr($decodedData, 0, openssl_cipher_iv_length($method));// 提取IV
  33. $decryptedData = substr($decodedData, openssl_cipher_iv_length($method));// 提取加密文本
  34. return openssl_decrypt($decryptedData, $method, $key, OPENSSL_RAW_DATA, $iv);
  35. }
  36. private static function base64UrlEncode(string $input): string
  37. {
  38. return str_replace('=', '', strtr(base64_encode($input), '+/', '-_'));
  39. }
  40. private static function base64UrlDecode(string $input): false|string
  41. {
  42. $remainder = strlen($input) % 4;
  43. if ($remainder) {
  44. $add_len = 4 - $remainder;
  45. $input .= str_repeat('=', $add_len);
  46. }
  47. return base64_decode(strtr($input, '-_', '+/'));
  48. }
  49. }