PHP 实现对称与非对称加密详解

Dylan
Dylan
发布时间:2026-10-13| 4人浏览过
原创

在 Web 开发中数据安全至关重要,本文详细解析了 PHP 环境下利用 OpenSSL 扩展实现对称加密(AES)与非对称加密(RSA)的具体操作。内容涵盖算法原理差异、优缺点分析以及可直接运行的代码示例,帮助开发者构建安全的数据传输通道。

RSA 非对称加密解密

RSA 算法原理与应用场景

RSA 是一种基于大数分解困难性的非对称加密算法,核心特征是使用一对密钥:公钥和私钥。公钥可以公开,用于加密数据;私钥必须严格保密,用于解密数据。其安全性依赖于将两个大质数相乘容易,但将一个大数分解回两个质数极其困难这一数论事实。

为什么使用 RSA

RSA 主要解决密钥配送问题。在开放网络环境中,通信双方无需提前共享密钥即可进行安全通信。由于公钥公开,任何人皆可加密发送数据,只有持有私钥的接收方才能解密,从而确保信息的机密性。

优点与局限

  • 安全性高:无需在网络中传输私钥,避免密钥被窃取风险。
  • 效率较低:加解密运算复杂,耗时较长,仅适合加密少量数据(如密钥或签名)。
  • 服务端消耗大:长位密钥(如 2048 位)计算密集,不适合直接加密大量业务数据。

典型应用模式:在 C/S 架构中,通常采用“混合加密”策略。客户端生成随机对称密钥(如 AES Key),使用服务端公钥加密该对称密钥并发送;服务端用私钥解密获得对称密钥后,再用该密钥进行大数据量的加解密,兼顾安全性与效率。

PHP 实现 DEMO

<?php
// 1. 生成密钥对 (2048位)
$keyPair = openssl_pkey_new(array(
    "private_key_bits" => 2048,
    "private_key_type" => OPENSSL_KEYTYPE_RSA,
));
 
// 2. 导出私钥和公钥字符串
openssl_pkey_export($keyPair, $privateKey);
$publicKey = openssl_pkey_get_details($keyPair)["key"];
 
// 3. 准备待加密数据
$data = "Hello, World!";
 
// 4. 使用公钥加密 (推荐 OAEP 填充方式)
$encryptedData = '';
openssl_public_encrypt($data, $encryptedData, $publicKey, OPENSSL_PKCS1_OAEP_PADDING);
echo "Encrypted data: " . base64_encode($encryptedData) . PHP_EOL;
 
// 5. 使用私钥解密
$decryptedData = '';
openssl_private_decrypt($encryptedData, $decryptedData, $privateKey, OPENSSL_PKCS1_OAEP_PADDING);
echo "Decrypted data: " . $decryptedData . PHP_EOL;
?>

注意:生产环境中建议将生成的公私钥保存为文件而非硬编码。OPENSSL_PKCS1_OAEP_PADDING 是比 PKCS#1 v1.5 更安全的填充模式。

AES 等对称加密解密

对称加密算法对比

对称加密使用同一个密钥进行加密和解密,速度快、适合海量数据处理。常见的算法包括 DES、3DES 和 AES:

  • DES (Data Encryption Standard):早期标准,密钥仅 56 位,易受暴力破解,现已不推荐使用。
  • 3DES (Triple DES):对 DES 进行三次加密以提高强度,但速度较慢,逐渐被取代。
  • AES (Advanced Encryption Standard):当前主流标准,支持 128、192、256 位密钥,安全性高且效率高。

为什么使用 AES

AES 是美国国家标准与技术研究院(NIST)选定的高级加密标准。相比旧算法,AES 在保持极高安全性的同时,拥有出色的硬件加速支持和软件执行效率,是保护静态数据和传输数据的最佳选择。

优点

  • 速度快:计算开销小,适合加密大文件或流媒体数据。
  • 可逆性强:同一密钥即可双向转换明文与密文,操作简单。
  • 灵活性高:支持多种工作模式(如 ECB, CBC, GCM 等)。

PHP 实现 DEMO

<?php
// 定义密钥 (需为16/24/32字节对应128/192/256位)
$key = '0123456789abcdef'; // 示例:16字节密钥
$plaintext = 'Hello, world!'; 
 
// 指定加密算法为 AES-128-ECB
$cipher = "aes-128-ecb";
$ivlen = openssl_cipher_iv_length($cipher);
 
// 初始化向量 IV (ECB模式不需要IV,但代码通用写法保留)
if ($ivlen > 0) {
    $iv = openssl_random_pseudo_bytes($ivlen);
} else {
    $iv = null;
}
 
// 加密
$ciphertext = openssl_encrypt($plaintext, $cipher, $key, OPENSSL_RAW_DATA, $iv);
echo "密文(hex): " . bin2hex($ciphertext) . "\n";
 
// 解密
$decrypted_text = openssl_decrypt($ciphertext, $cipher, $key, OPENSSL_RAW_DATA, $iv);
echo "解密后的明文:" . $decrypted_text . "\n";
?>

提示:虽然上述示例使用了 ECB 模式以便简化展示,但在实际项目中,强烈建议使用 CBC 或 GCM 等包含初始化向量 (IV) 的模式,以避免相同明文产生相同密文的安全隐患。ECB 模式下相同的明文块会生成相同的密文块,可能泄露数据模式。

总结与建议

在实际开发中,通常结合两者优势:使用 RSA 的非对称特性安全地交换 AES 的对称密钥,随后使用 AES 高效处理业务数据。这种混合加密机制广泛应用于 HTTPS 握手、API 签名及敏感数据存储场景。

以上就是 PHP 非对称与对称双向加密解密方式的详细内容,更多关于 PHP OpenSSL 加密实战的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。