1 <?php
2 namespace app\components;
3 use yii;
4 class Aes
5 {
6 /**
7 * This was AES-128 / CBC / PKCS5Padding
8 * return base64_encode string
9 * @param string $plaintext
10 * @param string $key
11 * @return string
12 */
13 public static function AesEncrypt($plaintext,$key = null)
14 {
15 $plaintext = trim($plaintext);
16 if ($plaintext == '') return '';
17 $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
18
19 //PKCS5Padding
20 $padding = $size - strlen($plaintext) % $size;
21 // 添加Padding
22 $plaintext .= str_repeat(chr($padding), $padding);
23
24
25 $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
26 $key=self::substr($key, 0, mcrypt_enc_get_key_size($module));
27 $iv = $key;
28 // str_repeat($key, $size);
29 /* Intialize encryption */
30 mcrypt_generic_init($module, $key, $iv);
31
32
33 /* Encrypt data */
34 $encrypted = mcrypt_generic($module, $plaintext);
35 /* Terminate encryption handler */
36 mcrypt_generic_deinit($module);
37 mcrypt_module_close($module);
38 return base64_encode($encrypted);
39 }
40 /**
41 * Returns the length of the given string.
42 * If available uses the multibyte string function mb_strlen.
43 * @param string $string the string being measured for length
44 * @return integer the length of the string
45 */
46 private static function strlen($string)
47 {
48 return extension_loaded('mbstring') ? mb_strlen($string,'8bit') : strlen($string);
49 }
50
51
52 /**
53 * Returns the portion of string specified by the start and length parameters.
54 * If available uses the multibyte string function mb_substr
55 * @param string $string the input string. Must be one character or longer.
56 * @param integer $start the starting position
57 * @param integer $length the desired portion length
58 * @return string the extracted part of string, or FALSE on failure or an empty string.
59 */
60 private static function substr($string,$start,$length)
61 {
62 return extension_loaded('mbstring') ? mb_substr($string,$start,$length,'8bit') : substr($string,$start,$length);
63 }
64 /**
65 * This was AES-128 / CBC / PKCS5Padding
66 * @param string $encrypted base64_encode encrypted string
67 * @param string $key
68 * @throws CException
69 * @return string
70 */
71 public static function AesDecrypt($encrypted, $key = null)
72 {
73 if ($encrypted == '') return '';
74 $ciphertext_dec = base64_decode($encrypted);
75 $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
76 $key=self::substr($key, 0, mcrypt_enc_get_key_size($module));
77 $iv = $key;
78 // str_repeat($key, 16); //解密的初始化向量要和加密时一样。
79 /* Initialize encryption module for decryption */
80 mcrypt_generic_init($module, $key, $iv);
81
82
83 /* Decrypt encrypted string */
84 $decrypted = mdecrypt_generic($module, $ciphertext_dec);
85
86 /* Terminate decryption handle and close module */
87 mcrypt_generic_deinit($module);
88 mcrypt_module_close($module);
89 // echo $decrypted;die;
90 //$a = rtrim($decrypted,"\0");
91 return rtrim($decrypted,"\0");
92 }
93 }