php实现aes加密

PHP实现AES加密的方法
使用OpenSSL扩展实现AES-256-CBC加密
确保PHP已启用OpenSSL扩展(默认通常已启用)。以下是一个完整的加密与解密示例:

$plaintext = "需要加密的数据";
$key = openssl_random_pseudo_bytes(32); // AES-256密钥
$iv = openssl_random_pseudo_bytes(16); // 初始化向量
// 加密
$ciphertext = openssl_encrypt(
$plaintext,
'aes-256-cbc',
$key,
OPENSSL_RAW_DATA,
$iv
);
$encrypted = base64_encode($iv.$ciphertext);
// 解密
$data = base64_decode($encrypted);
$iv = substr($data, 0, 16);
$ciphertext = substr($data, 16);
$decrypted = openssl_decrypt(
$ciphertext,
'aes-256-cbc',
$key,
OPENSSL_RAW_DATA,
$iv
);
使用Mcrypt扩展(已废弃,PHP 7.1+移除)
虽然不推荐,但在旧版本中可这样实现:
$plaintext = "数据";
$key = md5('密钥', true);
$iv = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM);
$ciphertext = mcrypt_encrypt(
MCRYPT_RIJNDAEL_128,
$key,
$plaintext,
MCRYPT_MODE_CBC,
$iv
);
$encrypted = base64_encode($iv.$ciphertext);
关键参数说明
- 密钥长度:AES-128(16字节)、AES-192(24字节)、AES-256(32字节)
- 加密模式:推荐CBC模式(需IV),也可用GCM(需PHP 7.1+)
- 填充方式:OpenSSL默认使用PKCS7填充
安全注意事项
- 始终使用随机生成的IV(初始化向量)
- 密钥应通过安全方式生成(如
openssl_random_pseudo_bytes) - 考虑将IV和密文一起存储/传输
- 对高敏感数据建议结合HMAC进行完整性验证
GCM模式示例(PHP 7.1+)
$cipher = "aes-256-gcm";
$tag = "";
$ciphertext = openssl_encrypt(
$plaintext,
$cipher,
$key,
OPENSSL_RAW_DATA,
$iv,
$tag
);
// 解密时需要提供$tag参数






