我来提供一个功能完整的PHP加解密工具类,包含多种常用的加密方法:

<?php
/**
* PHP 加解密工具类
* 支持 AES、DES、RSA 等常用加密算法
*/
class Encryption {
/**
* AES加密
* @param string $data 待加密数据
* @param string $key 密钥(16/24/32位)
* @param string $iv 偏移量
* @param string $method 加密方法
* @return string base64编码的密文
*/
public static function aesEncrypt($data, $key, $iv = '', $method = 'AES-128-CBC') {
// 自动根据密钥长度选择加密方法
if ($method == 'AUTO') {
$keyLen = strlen($key);
if ($keyLen == 16) {
$method = 'AES-128-CBC';
} elseif ($keyLen == 24) {
$method = 'AES-192-CBC';
} elseif ($keyLen == 32) {
$method = 'AES-256-CBC';
} else {
throw new Exception('密钥长度必须是16、24或32位');
}
}
// 如果未指定IV,默认使用密钥的前16位
if (empty($iv)) {
$iv = substr($key, 0, 16);
}
$encrypted = openssl_encrypt($data, $method, $key, OPENSSL_RAW_DATA, $iv);
return base64_encode($encrypted);
}
/**
* AES解密
* @param string $encrypted base64编码的密文
* @param string $key 密钥
* @param string $iv 偏移量
* @param string $method 解密方法
* @return string 解密后的明文
*/
public static function aesDecrypt($encrypted, $key, $iv = '', $method = 'AES-128-CBC') {
if ($method == 'AUTO') {
$keyLen = strlen($key);
if ($keyLen == 16) {
$method = 'AES-128-CBC';
} elseif ($keyLen == 24) {
$method = 'AES-192-CBC';
} elseif ($keyLen == 32) {
$method = 'AES-256-CBC';
} else {
throw new Exception('密钥长度必须是16、24或32位');
}
}
if (empty($iv)) {
$iv = substr($key, 0, 16);
}
$decrypted = openssl_decrypt(base64_decode($encrypted), $method, $key, OPENSSL_RAW_DATA, $iv);
return $decrypted;
}
/**
* DES加密
* @param string $data 待加密数据
* @param string $key 密钥(8字节)
* @param string $iv 偏移量(8字节)
* @return string base64编码的密文
*/
public static function desEncrypt($data, $key, $iv = '') {
if (strlen($key) != 8) {
throw new Exception('DES密钥长度必须为8字节');
}
if (empty($iv)) {
$iv = $key;
}
$encrypted = openssl_encrypt($data, 'DES-CBC', $key, OPENSSL_RAW_DATA, $iv);
return base64_encode($encrypted);
}
/**
* DES解密
*/
public static function desDecrypt($encrypted, $key, $iv = '') {
if (strlen($key) != 8) {
throw new Exception('DES密钥长度必须为8字节');
}
if (empty($iv)) {
$iv = $key;
}
$decrypted = openssl_decrypt(base64_decode($encrypted), 'DES-CBC', $key, OPENSSL_RAW_DATA, $iv);
return $decrypted;
}
/**
* RSA加密
* @param string $data 待加密数据
* @param string $publicKey 公钥(PEM格式)
* @return string base64编码的密文
*/
public static function rsaEncrypt($data, $publicKey) {
$publicKey = self::formatPublicKey($publicKey);
$result = openssl_public_encrypt($data, $encrypted, $publicKey);
if (!$result) {
throw new Exception('RSA加密失败');
}
return base64_encode($encrypted);
}
/**
* RSA解密
* @param string $encrypted base64编码的密文
* @param string $privateKey 私钥(PEM格式)
* @return string 解密后的明文
*/
public static function rsaDecrypt($encrypted, $privateKey) {
$privateKey = self::formatPrivateKey($privateKey);
$result = openssl_private_decrypt(base64_decode($encrypted), $decrypted, $privateKey);
if (!$result) {
throw new Exception('RSA解密失败');
}
return $decrypted;
}
/**
* 生成RSA密钥对
* @param int $bits 密钥位数(1024/2048/4096)
* @return array 包含公钥和私钥的数组
*/
public static function generateRSAKeyPair($bits = 2048) {
$config = [
"private_key_bits" => $bits,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
];
$res = openssl_pkey_new($config);
openssl_pkey_export($res, $privateKey);
$publicKey = openssl_pkey_get_details($res);
$publicKey = $publicKey['key'];
return [
'public_key' => $publicKey,
'private_key' => $privateKey
];
}
/**
* 格式化公钥(添加BEGIN/END标记)
*/
private static function formatPublicKey($key) {
$key = trim($key);
if (strpos($key, '-----BEGIN PUBLIC KEY-----') === false) {
$key = chunk_split($key, 64, "\n");
$key = "-----BEGIN PUBLIC KEY-----\n" . $key . "-----END PUBLIC KEY-----";
}
return $key;
}
/**
* 格式化私钥(添加BEGIN/END标记)
*/
private static function formatPrivateKey($key) {
$key = trim($key);
if (strpos($key, '-----BEGIN PRIVATE KEY-----') === false) {
$key = chunk_split($key, 64, "\n");
$key = "-----BEGIN PRIVATE KEY-----\n" . $key . "-----END PRIVATE KEY-----";
}
return $key;
}
/**
* MD5加密
* @param string $data 待加密数据
* @param bool $rawOutput 是否返回原始格式
* @return string 32位哈希值
*/
public static function md5($data, $rawOutput = false) {
return md5($data, $rawOutput);
}
/**
* SHA1加密
*/
public static function sha1($data) {
return sha1($data);
}
/**
* SHA256加密
*/
public static function sha256($data) {
return hash('sha256', $data);
}
/**
* HMAC-SHA256加密
* @param string $data 待加密数据
* @param string $key 密钥
* @return string HMAC值
*/
public static function hmacSha256($data, $key) {
return hash_hmac('sha256', $data, $key);
}
/**
* Base64加密(URL安全)
* @param string $data 待加密数据
* @return string URL安全的Base64编码
*/
public static function base64UrlEncode($data) {
return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}
/**
* Base64解密(URL安全)
*/
public static function base64UrlDecode($data) {
return base64_decode(strtr($data, '-_', '+/'));
}
/**
* 密码哈希(推荐用于密码存储)
* @param string $password 明文密码
* @return string 包含哈希和盐值的字符串
*/
public static function passwordHash($password) {
return password_hash($password, PASSWORD_BCRYPT);
}
/**
* 密码验证
* @param string $password 明文密码
* @param string $hash 哈希值
* @return bool 验证结果
*/
public static function passwordVerify($password, $hash) {
return password_verify($password, $hash);
}
/**
* 简单对称加密(自定义算法)
* @param string $data 待加密数据
* @param string $key 密钥
* @return string 加密后的字符串
*/
public static function simpleEncrypt($data, $key) {
$char = '';
$str = '';
$keyLen = strlen($key);
$dataLen = strlen($data);
for ($i = 0; $i < $dataLen; $i++) {
$char = $data[$i];
for ($j = 0; $j < $keyLen; $j++) {
$char = chr(ord($char) ^ ord($key[$j]));
}
$str .= $char;
}
return base64_encode($str);
}
/**
* 简单对称解密
*/
public static function simpleDecrypt($data, $key) {
$data = base64_decode($data);
$char = '';
$str = '';
$keyLen = strlen($key);
$dataLen = strlen($data);
for ($i = 0; $i < $dataLen; $i++) {
$char = $data[$i];
for ($j = 0; $j < $keyLen; $j++) {
$char = chr(ord($char) ^ ord($key[$j]));
}
$str .= $char;
}
return $str;
}
/**
* 生成随机字符串
* @param int $length 长度
* @param string $type 类型(all/alnum/alpha/numeric)
* @return string 随机字符串
*/
public static function randomString($length = 16, $type = 'all') {
switch ($type) {
case 'alnum':
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
break;
case 'alpha':
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
break;
case 'numeric':
$chars = '0123456789';
break;
default:
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_=+';
}
return substr(str_shuffle($chars), 0, $length);
}
/**
* 文件加密
* @param string $filePath 文件路径
* @param string $key 密钥
* @param string $method 加密方法
* @return string 加密后的文件路径
*/
public static function encryptFile($filePath, $key, $method = 'AES-128-CBC') {
$content = file_get_contents($filePath);
$iv = openssl_random_pseudo_bytes(16);
$encrypted = openssl_encrypt($content, $method, $key, OPENSSL_RAW_DATA, $iv);
$encryptedFile = $filePath . '.enc';
file_put_contents($encryptedFile, $iv . $encrypted);
return $encryptedFile;
}
/**
* 文件解密
*/
public static function decryptFile($encryptedFile, $key, $method = 'AES-128-CBC') {
$content = file_get_contents($encryptedFile);
$iv = substr($content, 0, 16);
$encrypted = substr($content, 16);
$decrypted = openssl_decrypt($encrypted, $method, $key, OPENSSL_RAW_DATA, $iv);
$decryptedFile = str_replace('.enc', '', $encryptedFile);
file_put_contents($decryptedFile, $decrypted);
return $decryptedFile;
}
}
使用方法示例:
<?php
// 引入工具类
require_once 'Encryption.php';
// 1. AES加解密
$key = '0123456789abcdef'; // 16位密钥
$data = '你好,世界!';
$encrypted = Encryption::aesEncrypt($data, $key);
echo "AES加密:" . $encrypted . "\n";
echo "AES解密:" . Encryption::aesDecrypt($encrypted, $key) . "\n";
// 2. RSA加解密
$keyPair = Encryption::generateRSAKeyPair(2048);
$publicKey = $keyPair['public_key'];
$privateKey = $keyPair['private_key'];
$data = 'RSA加密测试数据';
$rsaEncrypted = Encryption::rsaEncrypt($data, $publicKey);
echo "RSA加密:" . $rsaEncrypted . "\n";
echo "RSA解密:" . Encryption::rsaDecrypt($rsaEncrypted, $privateKey) . "\n";
// 3. 密码哈希
$password = 'my_secure_password';
$hash = Encryption::passwordHash($password);
echo "密码哈希:" . $hash . "\n";
echo "密码验证:" . (Encryption::passwordVerify($password, $hash) ? '通过' : '失败') . "\n";
// 4. HMAC签名
$signature = Encryption::hmacSha256('要签名的数据', '密钥');
echo "HMAC签名:" . $signature . "\n";
// 5. 生成随机字符串
$randomToken = Encryption::randomString(32);
echo "随机令牌:" . $randomToken . "\n";
主要特性:
- AES加解密:支持多种模式(CBC、ECB等),自动判断密钥长度
- RSA加解密:支持生成密钥对,非对称加密
- 密码哈希:使用bcrypt算法,安全存储密码
- HMAC签名:数据完整性验证
- URL安全Base64:适用于URL传输
- 文件加解密:支持文件内容的加密保护
- 简单自定义加密:基于XOR运算的简单加密
安全建议:
- 生产环境推荐使用AES-256-CBC加密
- 密码存储使用
passwordHash()方法 - 密钥、IV等敏感信息妥善保管
- 使用HTTPS传输加密数据
- 定期更换加密密钥
这个工具类涵盖了日常开发中大部分的加解密需求,并且代码清晰,易于理解和使用。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播