🗣 Wd提问: RSA加密PHP源码
🤖 Ai回答: 以下是使用 PHP 实现 RSA 加密的完整示例代码,包括生成密钥对、加密和解密功能。该示例使用 PHP 的 `openssl` 扩展。
✅ 要求:
PHP 环境(支持 `openssl` 扩展)
`openssl` 扩展已启用(通常默认启用)
🔐 1、生成 RSA 密钥对(公钥和私钥)
php
<?php
// 生成 RSA 密钥对
$privateKey = openssl_pkey_new([
private_key_type = OPENSSL_KEYTYPE_RSA,
rsa_bits = 2048, // 密钥长度
]);
// 提取私钥
openssl_pkey_export($privateKey, $privateKeyPem);
// 提取公钥
$publicKey = openssl_pkey_get_details($privateKey);
$publicKeyPem = $publicKey[key];
// 保存到文件(可选)
file_put_contents(private_key.pem, $privateKeyPem);
file_put_contents(public_key.pem, $publicKeyPem);
echo 私钥已保存为 private_key.pem\n;
echo 公钥已保存为 public_key.pem\n;
?
🔐 2、使用公钥加密数据
php
<?php
// 加载公钥
$publicKey = openssl_pkey_get_public(file_get_contents(public_key.pem));
// 要加密的数据
$data = Hello, RSA Encryption!;
// 加密
$encrypted = '';
if (openssl_public_encrypt($data, $encrypted, $publicKey, OPENSSL_PKCS1_OAEP_PADDING)) {
// 使用 base64 编码输出(便于传输)
$encryptedData = base64_encode($encrypted);
echo 加密结果: 、$encryptedData 、\n;
} else {
echo 加密失败: 、openssl_error_string() 、\n;
}
// 释放资源
openssl_free_key($publicKey);
?
🔐 3、使用私钥解密数据
php
<?php
// 加载私钥
$privateKey = openssl_pkey_get_private(file_get_contents(private_key.pem));
// 假设这是从加密中得到的密文(base64 编码)
$encryptedData = 你的base64加密字符串;
$encrypted = base64_decode($encryptedData);
// 解密
$decrypted = '';
if (openssl_private_decrypt($encrypted, $decrypted, $privateKey, OPENSSL_PKCS1_OAEP_PADDING)) {
echo 解密结果: 、$decrypted 、\n;
} else {
echo 解密失败: 、openssl_error_string() 、\n;
}
// 释放资源
openssl_free_key($privateKey);
?
📌 注意事项:
1、密钥长度:建议使用 `2048` 或更高位数,`1024` 已不安全。
2、填充方式:
`OPENSSL_PKCS1_OAEP_PADDING`:推荐,更安全。
`OPENSSL_PKCS1_PADDING`:旧方式,安全性较低。
3、数据大小限制:
RSA 加密的数据长度受限于密钥长度。
例如:2048 位 RSA 最多加密约 245 字节数据。
超过长度需使用 混合加密(如 AES + RSA)。
4、文件权限:确保 `private_key.pem` 文件权限安全,避免泄露。
✅ 安全建议(生产环境)
不要将私钥暴露在代码中,应保存在安全位置。
使用 HTTPS 传输密钥或加密数据。
对于大文件加密,建议使用 AES 对称加密,然后用 RSA 加密 AES 密钥。
🔄 混合加密示例(推荐)
php
<?php
// 生成 AES 密钥
$aesKey = openssl_random_pseudo_bytes(32); // 256 位 AES 密钥
// 使用 RSA 加密 AES 密钥
$publicKey = openssl_pkey_get_public(file_get_contents(public_key.pem));
$encryptedAesKey = '';
openssl_public_encrypt($aesKey, $encryptedAesKey, $publicKey, OPENSSL_PKCS1_OAEP_PADDING);
// 使用 AES 加密数据
$data = This is sensitive data.;
$iv = openssl_random_pseudo_bytes(16); // 初始化向量
$encryptedData = openssl_encrypt($data, 'AES-256-CBC', $aesKey, OPENSSL_RAW_DATA, $iv);
// 返回加密结果(包含 IV 和加密数据)
$finalResult = base64_encode($iv 、$encryptedData);
$encryptedAesKey = base64_encode($encryptedAesKey);
echo 加密数据: 、$finalResult 、\n;
echo 加密的 AES 密钥: 、$encryptedAesKey 、\n;
?
🔐 总结
| 功能 | 方法 |
| 生成密钥对 | `openssl_pkey_new()` |
| 保存私钥 | `openssl_pkey_export()` |
| 保存公钥 | `openssl_pkey_get_details()` |
| 公钥加密 | `openssl_public_encrypt()` |
| 私钥解密 | `openssl_private_decrypt()` |
如需进一步支持 PKCS8 格式、PEM 密码保护 或 跨语言兼容(如 Java/Python),可继续扩展。需要我提供这些高级功能的代码吗?
📣 商家广告:





0
IP地址: 159.23.147.158
搜索次数: 0
提问时间: 2025-11-10 16:02:02
🛒 域名购买:
hv.gs
kb.gs
41.gs
z-j.net
koupin.com.cn
827.net.cn
5.he.cn
wangsou.com.cn
nefronet.com
25.gold
❓️ 热门提问:
VPS云主机购买指南
香港vps哪家便宜
wins服务器是什么
服务器并发
墨西哥目的港
可靠云服务器
虚拟主机学生
二级等保机房
linux服务器香港
网站空间和虚拟主机
豌豆Ai站群搜索引擎系统
🌐 域名评估:
prhh.cn
t.sc.cn
deepseek.black
oo.xj.cn
96au.com
ev.he.cn
vahf.cn
deepseek.uno
uhmm.cn
z.hn.cn
⛏ 最新挖掘:
凯里酸汤鱼
贵阳烤脑花
都匀毛尖茶
花溪牛肉粉
贵阳烤生蚝
贵阳烤豆腐
贵阳纸包鱼
贵阳特色菜
🖌 热门作画:
🤝 关于我们:
豌豆Ai
域名
建站
站群
留痕
推广
评估
源码
开发Ai
工具
日记
价格
加盟
广告
流量
留言
联系
🗨 加入群聊:
🔗 友情链接:
搜尋引擎大全
北京网络seo
ai提问
🧰 站长工具:
Ai工具 whois查询 搜索
📢 温馨提示:本站所有问答由Ai自动创作,内容仅供参考,若有误差请用“联系”里面信息通知我们人工修改或删除。
👉 技术支持:本站由豌豆Ai提供技术支持,使用的最新版:《豌豆Ai站群搜索引擎系统 V.25.10.25》搭建本站。