🗣 Wd提问: AES加密PHP源码
🤖 Ai回答: 以下是使用 PHP 实现 AES 加密的完整示例代码,支持 AES-128-CBC 模式(常见且安全的模式之一),并包含加密和解密功能。
php
<?php
class AES {
private $key; // 加密密钥,必须是 16、24 或 32 字节(对应 AES-128、AES-192、AES-256)
private $iv; // 初始化向量,必须是 16 字节
public function __construct($key, $iv) {
$this-key = $key;
$this-iv = $iv;
}
/**
* AES 加密
* @param string $data 要加密的数据
* @return string 加密后的数据(Base64 编码)
*/
public function encrypt($data) {
// 使用 AES-128-CBC 模式
$encrypted = openssl_encrypt($data, 'AES-128-CBC', $this-key, OPENSSL_RAW_DATA, $this-iv);
// 返回 Base64 编码的密文
return base64_encode($encrypted);
}
/**
* AES 解密
* @param string $data 要解密的数据(Base64 编码)
* @return string 解密后的数据
*/
public function decrypt($data) {
// 解码 Base64 数据
$encryptedData = base64_decode($data);
// 解密
$decrypted = openssl_decrypt($encryptedData, 'AES-128-CBC', $this-key, OPENSSL_RAW_DATA, $this-iv);
return $decrypted;
}
}
// 示例使用
$key = 'your-16-or-24-or-32-byte-key-here'; // 必须是 16、24 或 32 字节
$iv = 'your-16-byte-iv-here'; // 必须是 16 字节
$aes = new AES($key, $iv);
// 要加密的数据
$data = Hello, World! This is a secret message.;
// 加密
$encrypted = $aes-encrypt($data);
echo 加密结果: 、$encrypted 、\n;
// 解密
$decrypted = $aes-decrypt($encrypted);
echo 解密结果: 、$decrypted 、\n;
?
🔐 注意事项:
1、密钥长度:
AES 支持 128、192、256 位密钥。
PHP 中使用 `openssl_encrypt` 时,密钥长度必须是 16(AES-128)、24(AES-192)或 32(AES-256)字节。
建议使用 `openssl_random_pseudo_bytes(32)` 生成安全密钥。
2、IV(初始化向量):
必须是 16 字节(AES 块大小)。
不能重复使用,但可以公开传输(通常与密文一起发送)。
建议使用 `openssl_random_pseudo_bytes(16)` 生成。
3、加密模式:
示例使用 `AES-128-CBC`,这是常用且安全的模式。
更安全的模式如 `GCM` 可以使用,但需要 PHP 7.1+ 和 `openssl_encrypt` 支持。
4、安全性建议:
密钥和 IV 应该安全存储,不要硬编码在代码中。
使用 HTTPS 传输密文。
考虑使用 `openssl_random_pseudo_bytes()` 生成随机密钥和 IV。
✅ 安全生成密钥和 IV 的示例:
php
// 生成安全密钥(32 字节,AES-256)
$key = openssl_random_pseudo_bytes(32);
// 生成 IV(16 字节)
$iv = openssl_random_pseudo_bytes(16);
// 存储或传输 key 和 iv(例如保存到数据库或配置文件)
echo 密钥: 、bin2hex($key) 、\n;
echo IV: 、bin2hex($iv) 、\n;
🔄 更安全的模式(推荐):AES-256-GCM
php
class AESGCM {
private $key;
public function __construct($key) {
$this-key = $key;
}
public function encrypt($data, $aad = '') {
$iv = openssl_random_pseudo_bytes(12); // GCM 使用 12 字节 IV
$encrypted = openssl_encrypt($data, 'aes-256-gcm', $this-key, OPENSSL_RAW_DATA, $iv, $tag, $aad);
return base64_encode($iv 、$tag 、$encrypted);
}
public function decrypt($data, $aad = '') {
$data = base64_decode($data);
$iv = substr($data, 0, 12);
$tag = substr($data, 12, 16);
$encrypted = substr($data, 28);
$decrypted = openssl_decrypt($encrypted, 'aes-256-gcm', $this-key, OPENSSL_RAW_DATA, $iv, $tag, $aad);
return $decrypted;
}
}
注意:GCM 模式提供认证加密(AEAD),比 CBC 更安全,推荐在新项目中使用。
✅ 总结
使用 `AES-128-CBC` 是安全的,但需注意 IV 和密钥管理。
推荐使用 `AES-256-GCM` 模式以获得更强的安全性。
密钥和 IV 必须安全生成和管理。
如需进一步支持,可提供具体需求(如密钥管理、前后端互通等)。
📣 商家广告:





0
IP地址: 122.239.69.139
搜索次数: 16
提问时间: 2025-12-18 08:47:16
本站所有
❓
问答
均由Ai自动分析整理,内容仅供参考,若有误差请用“联系”里面信息通知我们人工修改或删除。
本站由
🟢
豌豆Ai
提供技术支持,使用的最新版:
豌豆Ai站群搜索引擎系统 V.25.10.25
搭建本站。