php实现rsa
PHP 实现 RSA 加密解密
PHP 提供了内置的 OpenSSL 扩展来实现 RSA 加密和解密功能。以下是完整的实现方法:
生成 RSA 密钥对
$config = array(
"digest_alg" => "sha512",
"private_key_bits" => 4096,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
);
// 生成密钥对
$res = openssl_pkey_new($config);
// 提取私钥
openssl_pkey_export($res, $privateKey);
// 提取公钥
$publicKey = openssl_pkey_get_details($res);
$publicKey = $publicKey["key"];
// 保存密钥到文件(可选)
file_put_contents('private.key', $privateKey);
file_put_contents('public.key', $publicKey);
使用公钥加密数据
$data = "敏感数据需要加密";
openssl_public_encrypt($data, $encrypted, $publicKey);
// 加密后的数据是二进制,可以base64编码便于传输
$encrypted = base64_encode($encrypted);
使用私钥解密数据
// 先解码base64
$encrypted = base64_decode($encrypted);
openssl_private_decrypt($encrypted, $decrypted, $privateKey);
echo $decrypted; // 输出: 敏感数据需要加密
使用私钥签名数据
$data = "需要签名的数据";
openssl_sign($data, $signature, $privateKey, OPENSSL_ALGO_SHA256);
// 签名也是二进制,可以base64编码
$signature = base64_encode($signature);
使用公钥验证签名
$data = "需要签名的数据";
$signature = base64_decode($signature);
$valid = openssl_verify($data, $signature, $publicKey, OPENSSL_ALGO_SHA256);
if ($valid === 1) {
echo "签名验证成功";
} else {
echo "签名验证失败";
}
注意事项
- RSA 加密有长度限制,通常只能加密比密钥长度小的数据(例如4096位密钥最多加密446字节)
- 对于大数据加密,应该使用对称加密(如AES)加密数据,再用RSA加密对称密钥
- 密钥长度建议至少2048位,高安全性场景使用4096位
- 私钥必须严格保密,公钥可以自由分发
- 生产环境应该使用专业的密钥管理方案
性能优化建议
- 对于频繁的加密操作,可以缓存密钥而不是每次从文件读取
- 考虑使用更高效的签名算法如OPENSSL_ALGO_SHA256替代OPENSSL_ALGO_SHA512
- 大量数据加密时,采用混合加密方案(RSA+AES)性能更好







