<?php /** * 加密/解密函数 * * @param string $data 数据明文或密文(若要加密数组数据可先将其json_encode()处理) * @param string $action 操作类型,可选值:encrypt=加密|decrypt=解密 * @return string|bool 加密/解密结果,若失败则返回false */ function openssl_cipher($data, $action = 'encrypt') { $key = 'www.manong.life'; // 加密或解密所需的密钥 $cipher = 'AES-128-CBC-HMAC-SHA256'; // 加密算法(非恒定值),可调用openssl_get_cipher_methods()获取可用的加密算法 $options = OPENSSL_RAW_DATA; $ivlen = openssl_cipher_iv_length($cipher); // 根据使用的加密算法计算出初始化向量的长度,即下面的{$iv}变量的strlen()值 $key = md5($key); // 密钥使用MD5处理一下 //========== 加密·开始 ==========// if ($action === 'encrypt') { $iv = openssl_random_pseudo_bytes($ivlen, $cstrong); // 生成初始化向量(可以理解为给密文加入随机元素) if ($iv === false || $cstrong === false) { return false; } // 加密函数的返回值是一堆乱码,后面会用base64_encode()函数处理 $encrypt = openssl_encrypt($data, $cipher, $key, $options, $iv); // 初始化向量{$iv}是解密必填参数,故将其附加在密文后 return $encrypt === false ? false : base64_encode("{$encrypt}{$iv}"); } //========== 加密·结束 ==========// //========== 解密·开始 ==========// $decrypt = base64_decode($data, true); if ($decrypt === false) { return false; } $iv2 = substr($decrypt, -1 * $ivlen); // 提取出初始化向量部分 $decrypt = substr($decrypt, 0, strlen($decrypt) - $ivlen); // 提取出密文部分 return openssl_decrypt($decrypt, $cipher, $key, $options, $iv2); //========== 解密·结束 ==========// } $encrypt = openssl_cipher('PHP是世界上最好的语言', 'encrypt'); // 加密 $decrypt = openssl_cipher($encrypt, 'decrypt'); // 解密 echo "加密结果:{$encrypt}<br>" . PHP_EOL; // 加密结果:TfcKVxf6J5ZyJP0aX3P4ChNXEPDygnrk42YR7GbGeW9IxwSc2HU4zORHOlSrQ3Ac echo "解密结果:{$decrypt}<br>" . PHP_EOL; // 解密结果:PHP是世界上最好的语言
Copyright © 2023 码农人生. All Rights Reserved