PHP RSA加密解密实战:密钥生成与OpenSSL调用

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

在Web开发中,RSA非对称加密常用于敏感数据传输。本文将详细解析如何在PHP环境下,利用OpenSSL工具生成公私钥对,并通过代码实现私钥加密、公钥解密及反向操作的完整流程,同时包含环境配置的排错指南。

RSA密钥生成的标准流程

RSA加密的核心在于非对称的公私钥对:私钥通常由服务器端严格保管,用于生成数字签名或解密客户端传来的数据;公钥则分发给Android、iOS等前端应用,用于加密敏感数据或验证签名。在使用PHP进行操作前,需要先准备标准的密钥文件。

第1步:使用OpenSSL生成密钥文件

目的:创建符合PHP openssl_* 函数要求的密钥格式。

操作:在Linux终端或具备OpenSSL环境的CMD中,进入工作目录执行以下命令:

# 1. 生成原始RSA私钥 (1024位密钥)
openssl genrsa -out rsa_private_key.pem 1024
# 2. 将原始私钥转换为PKCS#8格式 (去除密码保护)
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem
# 3. 从原始私钥中提取对应的公钥
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

结果说明:
- private_key.pem:转换后的私钥,建议仅保存在服务端。
- rsa_public_key.pem:公钥,可安全发布给客户端。

PHP中使用OpenSSL进行加解密

PHP内置了 openssl_* 扩展库支持RSA算法。以下代码展示了读取密钥、执行加解密以及处理Base64编码的完整逻辑。

第2步:加载密钥并初始化资源

入口:文件路径需指向第一步生成的 .pem 文件。

操作:读取文件内容并使用 openssl_pkey_get_public/ssl 验证密钥有效性,返回资源ID供后续函数使用。

$privateKeyStr = file_get_contents('rsa/private_key.pem');
$publicKeyStr = file_get_contents('rsa/rsa_public_key.pem');

// 获取密钥资源ID
$pi_key = openssl_pkey_get_private($privateKeyStr);
$pu_key = openssl_pkey_get_public($publicKeyStr);

if ($pi_key === false || $pu_key === false) {
    die('密钥加载失败,请检查文件格式是否正确');
}

第3步:执行私钥加密与公钥解密(签名场景)

用途:用于后端向特定客户端发送数据,或验证数据的完整性(类似签名)。只有持有对应私钥的一方能解开该数据是不成立的,此处逻辑应为:私钥加密的内容能通过公钥解密。

$data = '敏感数据内容';

// 1. 私钥加密
openssl_private_encrypt($data, $encrypted, $pi_key);
// Base64编码以适配URL传输或存储
$encrypted_base64 = base64_encode($encrypted);
echo '私钥加密后: ' . $encrypted_base64 . PHP_EOL;

// 2. 公钥解密
openssl_public_decrypt(base64_decode($encrypted_base64), $decrypted, $pu_key);
echo '公钥解密后: ' . $decrypted . PHP_EOL;

第4步:执行公钥加密与私钥解密(传输场景)

用途:前端获取公钥后,对敏感信息(如密码)加密发送给后端,后端利用私有私钥解密。

$data = '需要传输的密码';

// 1. 公钥加密
openssl_public_encrypt($data, $encrypted, $pu_key);
$encrypted_base64 = base64_encode($encrypted);

// 2. 私钥解密
openssl_private_decrypt(base64_decode($encrypted_base64), $decrypted, $pi_key);
echo '最终解密原文: ' . $decrypted . PHP_EOL;

常见运行环境与排错指南

如果在执行上述代码时出现扩展未找到或函数未定义的报错,请按以下步骤排查:

1. Windows系统下的DLL依赖缺失

在Windows环境中运行PHP RSA代码,除了启用 php_openssl.dll 外,还需确保系统能够找到SSL的动态链接库。若 system32 目录下缺少文件,请将PHP安装目录下的以下文件拷贝至 C:\Windows\System32:

  • libeay32.dll
  • ssleay32.dll

2. PHP扩展配置

检查 php.ini 配置文件是否已正确加载OpenSSL扩展:

extension=php_openssl.dll

重启Web服务器(如Apache或Nginx)使配置生效。若仍无法运行,请使用 phpinfo() 确认 openssl 模块是否处于Active状态。

总结

RSA加密在PHP中的实现主要依赖于OpenSSL扩展的标准调用。关键在于区分“私钥加密-公钥解密”与“公钥加密-私钥解密”的应用场景,并确保密钥文件遵循PKCS#8或标准PEM格式。对于开发环境不在本地的用户,务必留意操作系统层面的DLL引用问题。以上就是PHP RSA加密解密使用详解的详细内容,更多关于PHP加密技术的资料请关注本站其它相关文章!

相关标签:

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

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 算法库。