悠悠楠杉
在PHP中实现RSA密钥的加解密与签名验签是保证数据安全传输的重要手段。本文将详细介绍三种常见的实现方式,包括使用openssl
1. 使用openssl
扩展实现RSA加解密与签名验签
生成密钥对
php
$config = array(
"private_key" => array(
"type" => OPENSSL_KEYTYPE_RSA,
"bits" => 2048,
"private" => true,
"comment" => "Private Key"
),
"public_key" => array(
"type" => OPENSSL_KEYTYPE_RSA,
"bits" => 2048,
"public" => true,
"comment" => "Public Key"
)
);
$res = openssl_pkey_new($config);
openssl_pkey_export($res, $privateKey);
openssl_pkey_export_to_file($res, "public.pem"); // 导出公钥到文件
$details = openssl_pkey_get_details($res);
$publicKey = $details["key"]; // 获取公钥字符串用于签名验证等操作
加密解密
php
$data = "Hello, World!"; // 待加密的数据
openssl_private_encrypt($data, $encryptedData, $privateKey); // 私钥加密
$decryptedData = openssl_public_decrypt($encryptedData, $decryptedData, $publicKey); // 公钥解密
echo "Decrypted: " . $decryptedData . "\n"; // 输出解密后的数据
签名验签
php
$signature = openssl_sign($data, $sigResource, $privateKey); // 私钥生成签名
openssl_verify($data, $sigResource, $publicKey, OPENSSL_ALGO_SHA256); // 公钥验证签名,返回布尔值表示是否成功
2. 使用phpseclib
库实现RSA加解密与签名验签
安装phpseclib库:通过Composer安装 composer require phpseclib/phpseclib
。
示例代码:
```php
include('vendor/autoload.php'); // 引入Composer自动加载文件
use phpseclib3\Crypt\PublicKeyLoader; // 引入PublicKeyLoader类
// 加载私钥
$privateKey = PublicKeyLoader::load('path/to/your/private/key.pem'); // 指定私钥文件路径
// 加载公钥
$publicKey = PublicKeyLoader::load('path/to/your/public/key.pem'); // 指定公钥文件路径 (注意,这里实际使用时应该加载公钥)
// 加密解密(以公钥加密为例)
$encrypted = $publicKey->encrypt('Hello, World!'); // 公钥加密
$decrypted = $privateKey->decrypt($encrypted); // 私钥解密 (实际中这里应该使用公钥进行解密) 这里为示例正确性调整了注释,但实际操作需相反使用。 $decrypted = $publicKey->decrypt($encrypted); // 公钥解密(实际应为公钥) echo "Decrypted: " . $decrypted . "\n"; // 输出解密后的数据 注意:此处实例以公钥加密和解密为例,但实际使用时,通常用私钥加密,公钥解密。 修改了前面的例子说明以匹配实际操作。 同样,签名验签过程也需正确使用私钥和公钥。 // 签名验签(省略错误部分,仅保留正确部分) $signature = $privateKey->sign('SHA256'); // 私钥生成签名(略去具体调用) openssl_verify(...) // 公钥验证签名(已见前文) // 注意:此处仅展示了使用phpseclib的加密、解密和签名流程的大致方向,具体实现时还需正确使用公私钥进行对应操作。