使用openssl_encrypt()和openssl_decrypt()实现加密和解密功能

<?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