php实现扩展加密解密
PHP 扩展加密解密实现方法
在 PHP 中实现加密解密功能可以通过多种方式完成,包括内置函数、第三方库或自定义扩展。以下是几种常见的方法:
使用 OpenSSL 扩展
PHP 的 OpenSSL 扩展提供了强大的加密解密功能,支持多种算法如 AES、DES、RSA 等。
// AES-256-CBC 加密
function encrypt($data, $key) {
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
$encrypted = openssl_encrypt($data, 'aes-256-cbc', $key, 0, $iv);
return base64_encode($encrypted . '::' . $iv);
}
// AES-256-CBC 解密
function decrypt($data, $key) {
list($encrypted_data, $iv) = explode('::', base64_decode($data), 2);
return openssl_decrypt($encrypted_data, 'aes-256-cbc', $key, 0, $iv);
}
使用 Sodium 扩展
PHP 7.2+ 内置了 Sodium 扩展,提供了现代加密算法如 ChaCha20-Poly1305。
// Sodium 加密
function sodiumEncrypt($message, $key) {
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
$cipher = sodium_crypto_secretbox($message, $nonce, $key);
return base64_encode($nonce . $cipher);
}
// Sodium 解密
function sodiumDecrypt($encrypted, $key) {
$decoded = base64_decode($encrypted);
$nonce = substr($decoded, 0, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
$cipher = substr($decoded, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
return sodium_crypto_secretbox_open($cipher, $nonce, $key);
}
使用 Libsodium 扩展
对于 PHP 7.2 以下版本,可以通过 PECL 安装 Libsodium 扩展。

// 安装命令
pecl install libsodium
使用 Mcrypt 扩展(已弃用)
虽然 Mcrypt 扩展在 PHP 7.1 后被弃用,但在旧版本中仍可使用。
// Mcrypt 加密
function mcryptEncrypt($data, $key) {
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_RAND);
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv);
return base64_encode($encrypted . '::' . $iv);
}
// Mcrypt 解密
function mcryptDecrypt($data, $key) {
list($encrypted_data, $iv) = explode('::', base64_decode($data), 2);
return mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $encrypted_data, MCRYPT_MODE_CBC, $iv);
}
自定义加密扩展
如果需要更高性能或特殊算法,可以编写 PHP 扩展。以下是简单示例:

-
创建扩展骨架
php ext_skel.php --ext=mycrypto -
实现加密函数
PHP_FUNCTION(mycrypto_encrypt) { char *data; size_t data_len; char *key; size_t key_len; if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss", &data, &data_len, &key, &key_len) == FAILURE) { RETURN_NULL(); } // 实现加密逻辑 // ... } -
注册函数
const zend_function_entry mycrypto_functions[] = { PHP_FE(mycrypto_encrypt, NULL) PHP_FE_END };
注意事项
- 始终使用安全的随机数生成器(如
random_bytes) - 对密钥和 IV 进行安全存储
- 考虑使用 PHP 的
hash_equals进行安全比较 - 避免使用已弃用的加密函数(如 Mcrypt)
- 对于密码存储,使用
password_hash和password_verify
以上方法可以根据具体需求选择,现代 PHP 应用中推荐使用 OpenSSL 或 Sodium 扩展。






