aes解密设置utf8 php,PHP实现AES加密解密

1、mcrypt_encrypt AES加密,解密

1 class Lib_desEnctyp

2 {

3 private $key = "";

4 private $iv = "";

5

6 /**

7 * 构造,传递二个已经进行base64_encode的KEY与IV

8 *

9 * @param string $key

10 * @param string $iv

11 */

12 function __construct ($key, $iv)

13 {

14 if (empty($key) || empty($iv)) {

15 echo 'key and iv is not valid';

16 exit();

17 }

18 $this->key = $key;

19 $this->iv = $iv;

20 }

21

22 /**

23 *加密

24 * @param $value

25 * @return

26 */

27 public function encrypt ($value)

28 {

29 $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');

30 $iv = base64_decode($this->iv);

31 $value = $this->PaddingPKCS7($value);

32 $key = base64_decode($this->key);

33 mcrypt_generic_init($td, $key, $iv);

34 $ret = base64_encode(mcrypt_generic($td, $value));

35 mcrypt_generic_deinit($td);

36 mcrypt_module_close($td);

37 return $ret;

38 }

39

40 /**

41 *解密

42 * @param $value

43 * @return

44 */

45 public function decrypt ($value)

46 {

47 $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');

48 $iv = base64_decode($this->iv);

49 $key = base64_decode($this->key);

50 mcrypt_generic_init($td, $key, $iv);

51 $ret = trim(mdecrypt_generic($td, base64_decode($value)));

52 $ret = $this->UnPaddingPKCS7($ret);

53 mcrypt_generic_deinit($td);

54 mcrypt_module_close($td);

55 return $ret;

56 }

57

58 private function PaddingPKCS7 ($data)

59 {

60 $block_size = mcrypt_get_block_size('tripledes', 'cbc');

61 $padding_char = $block_size - (strlen($data) % $block_size);

62 $data .= str_repeat(chr($padding_char), $padding_char);

63 return $data;

64 }

65

66 private function UnPaddingPKCS7($text)

67 {

68 $pad = ord($text{strlen($text) - 1});

69 if ($pad > strlen($text)) {

70 return false;

71 }

72 if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) {

73 return false;

74 }

75 return substr($text, 0, - 1 * $pad);

76 }

77 }

2、openssl 加密,解密 [方式1]

1 /**

2 * DES加密类

3 * User: gaowei

4 * Date: 2017/12/12

5 * Time: 19:23

6 */

7 class DesEncrypt {

8 private $key = "";

9 private $iv = "";

10

11 /**

12 * 构造,传递二个已经进行base64_encode的KEY与IV

13 *

14 * @param string $key

15 * @param string $iv

16 */

17 function __construct ($key, $iv)

18 {

19 if (empty($key) || empty($iv)) {

20 echo 'key and iv is not valid';

21 exit();

22 }

23 $this->key = $key;

24 $this->iv = $iv;//8

25 //$this->iv = $iv.'00000000000';//16

26

27 }

28

29 /**

30 * @title 加密

31 * @author gaowei

32 * @date 2017/12/18

33 * @param string $value 要传的参数

34 * @ //OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING //AES-128-ECB|AES-256-CBC|BF-CBC

35 * @return json

36 * */

37 public function encrypt ($value) {

38

39 //参考地址:https://stackoverflow.com/questions/41181905/php-mcrypt-encrypt-to-openssl-encrypt-and-openssl-zero-padding-problems#

40 $value = $this->PaddingPKCS7($value);

41 $key = base64_decode($this->key);

42 $iv = base64_decode($this->iv);

43 //AES-128-ECB|不能用 AES-256-CBC|16 AES-128-CBC|16 BF-CBC|8 aes-128-gcm|需要加$tag DES-EDE3-CBC|8

44 $cipher = "DES-EDE3-CBC";

45 if (in_array($cipher, openssl_get_cipher_methods())) {

46 //$ivlen = openssl_cipher_iv_length($cipher);

47 // $iv = openssl_random_pseudo_bytes($ivlen);

48 $result = openssl_encrypt($value, $cipher, $key, OPENSSL_SSLV23_PADDING, $iv);

49 //$result = base64_encode($result); //为3的时间要用

50 //store $cipher, $iv, and $tag for decryption later

51 /* $original_plaintext = openssl_decrypt($result, $cipher, $key, OPENSSL_SSLV23_PADDING, $iv);

52 echo $original_plaintext."\n";*/

53 }

54 return $result;

55

56 }

57 /**

58 * @title 解密

59 * @author gaowei

60 * @date 2017/12/18

61 * @param string $value 要传的参数

62 * @return json

63 * */

64 public function decrypt ($value) {

65 $key = base64_decode($this->key);

66 $iv = base64_decode($this->iv);

67 $decrypted = openssl_decrypt($value, 'DES-EDE3-CBC', $key, OPENSSL_SSLV23_PADDING, $iv);

68 $ret = $this->UnPaddingPKCS7($decrypted);

69 return $ret;

70 }

71

72 private function PaddingPKCS7 ($data) {

73 //$block_size = mcrypt_get_block_size('tripledes', 'cbc');//获取长度

74 //$block_size = openssl_cipher_iv_length('tripledes', 'cbc');//获取长度

75 $block_size = 8;

76 $padding_char = $block_size - (strlen($data) % $block_size);

77 $data .= str_repeat(chr($padding_char), $padding_char);

78 return $data;

79 }

80 private function UnPaddingPKCS7($text) {

81 $pad = ord($text{strlen($text) - 1});

82 if ($pad > strlen($text)) {

83 return false;

84 }

85 if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) {

86 return false;

87 }

88 return substr($text, 0, - 1 * $pad);

89 }

90 }

3、openssl 加密,解密 [方式2]

1 /**

2 * @desc:php aes加密解密类

3 * @author gl

4 * @date 2019/08/31

5 */

6 class CI_Aes{

7 /**

8 * CI_Aes cipher

9 * @var string

10 */

11 protected $cipher = 'aes-128-ecb';

12 /**

13 * CI_Aes key

14 *

15 * @var string

16 */

17 protected $key;

18 /**

19 * CI_Aes constructor

20 * @param string $key Configuration parameter

21 */

22

23 public function __construct($key=null){

24 $this->key = $key;

25 }

26

27 /**

28 * Initialize

29 *

30 * @param array $params Configuration parameters

31 * @return CI_Encryption

32 */

33 public function initialize($params)

34 {

35 if (!empty($params) && is_array($params)) {

36 foreach ($params as $key => $val) {

37 $this->$key = $val;

38 }

39 }

40 }

41 /**

42 * Encrypt

43 *

44 * @param string $data Input data

45 * @return string

46 */

47 public function encrypt($data) {

48 $endata = openssl_encrypt($data, $this->cipher, $this->key, OPENSSL_RAW_DATA);

49 return bin2hex($endata);

50 }

51

52 /**

53 * Decrypt

54 *

55 * @param string $data Encrypted data

56 * @return string

57 */

58 public function decrypt($data) {

59 $encrypted = hex2bin($data);

60 return openssl_decrypt($encrypted, $this->cipher, $this->key, OPENSSL_RAW_DATA);

61 }

62

63 }

4、其他 加密,解密

1 //加密函数

2 function lock_url($txt,$key='www.jb51.net')

3 {

4 $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+";

5 $nh = rand(0,64);

6 $ch = $chars[$nh];

7 $mdKey = md5($key.$ch);

8 $mdKey = substr($mdKey,$nh%8, $nh%8+7);

9 $txt = base64_encode($txt);

10 $tmp = '';

11 $i=0;$j=0;$k = 0;

12 for ($i=0; $i

13 $k = $k == strlen($mdKey) ? 0 : $k;

14 $j = ($nh+strpos($chars,$txt[$i])+ord($mdKey[$k++]))%64;

15 $tmp .= $chars[$j];

16 }

17 return urlencode($ch.$tmp);

18 }

19 //解密函数

20 function unlock_url($txt,$key='www.jb51.net')

21 {

22 $txt = urldecode($txt);

23 $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+";

24 $ch = $txt[0];

25 $nh = strpos($chars,$ch);

26 $mdKey = md5($key.$ch);

27 $mdKey = substr($mdKey,$nh%8, $nh%8+7);

28 $txt = substr($txt,1);

29 $tmp = '';

30 $i=0;$j=0; $k = 0;

31 for ($i=0; $i

32 $k = $k == strlen($mdKey) ? 0 : $k;

33 $j = strpos($chars,$txt[$i])-$nh - ord($mdKey[$k++]);

34 while ($j<0) $j+=64;

35 $tmp .= $chars[$j];

36 }

37 return base64_decode($tmp);

38 }

标签:function,AES,return,解密,value,iv,key,PHP,data

来源: https://www.cnblogs.com/guliang/p/11763104.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值