以下是PHP三种方式读取RSA密钥加解密、签名验签的完整教程:
使用openssl扩展
• 生成密钥对:可以使用openssl命令行工具生成RSA密钥对。在Linux或Mac系统下,在终端中运行以下命令生成2048位的私钥文件
private.pem
和对应的公钥文件public.pem
:
openssl genrsa -out private.pem 2048
openssl rsa -in private.pem -pubout -out public.pem
• 加密操作:使用公钥对数据进行加密 :
<?php
$public_key = file_get_contents('public.pem');
$data = "这是要加密的数据";
openssl_public_encrypt($data, $encrypted_data, $public_key);
// 将加密后的数据进行base64编码,方便存储和传输
$encrypted_data_base64 = base64_encode($encrypted_data);
echo "加密后的数据(base64编码):".$encrypted_data_base64;
?>
• 解密操作:使用私钥对加密后的数据进行解密 :
<?php
$private_key = file_get_contents('private.pem');
$encrypted_data_base64 = "刚才加密后的数据(base64编码)";
$encrypted_data = base64_decode($encrypted_data_base64);
openssl_private_decrypt($encrypted_data, $decrypted_data, $private_key);
echo "解密后的数据:".$decrypted_data;
?>
• 签名操作:使用私钥对数据进行签名 :
<?php
$private_key = file_get_contents('private.pem');
$data = "这是要签名的数据";
openssl_sign($data, $signature, $private_key);
// 将签名进行base64编码,方便存储和传输
$signature_base64 = base64_encode($signature);
echo "签名后的数据(base64编码):".$signature_base64;
?>
• 验签操作:使用公钥对签名进行验证 :
<?php
$public_key = file_get_contents('public.pem');
$data = "刚才签名的数据";
$signature_base64 = "刚才签名后的数据(base64编码)";
$signature = base64_decode($signature_base64);
$verify_result = openssl_verify($data, $signature, $public_key);
if ($verify_result === 1) {
echo "签名验证成功";
} elseif ($verify_result === 0) {
echo "签名验证失败";
} else {
echo "验签出错";
}
?>
使用phpseclib库
• 安装phpseclib库:通过Composer进行安装。在项目目录下运行
composer require phpseclib/phpseclib
,安装完成后,在PHP脚本中通过require 'vendor/autoload.php';
引入自动加载文件.• 加密操作 :
<?php
require 'vendor/autoload.php';
use phpseclib\crypt\rsa;
$rsa = new rsa();
$public_key = file_get_contents('public.pem');
$rsa->loadkey($public_key);
$data = "这是要加密的数据";
$encrypted_data = $rsa->encrypt($data);
// 将加密后的数据进行base64编码,方便存储和传输
$encrypted_data_base64 = base64_encode($encrypted_data);
echo "加密后的数据(base64编码):".$encrypted_data_base64;
?>
• 解密操作 :
<?php
require 'vendor/autoload.php';
use phpseclib\crypt\rsa;
$rsa = new rsa();
$private_key = file_get_contents('private.pem');
$rsa->loadkey($private_key);
$encrypted_data_base64 = "刚才加密后的数据(base64编码)";
$encrypted_data = base64_decode($encrypted_data_base64);
$decrypted_data = $rsa->decrypt($encrypted_data);
echo "解密后的数据:".$decrypted_data;
?>
• 签名操作:
<?php
require 'vendor/autoload.php';
use phpseclib\crypt\rsa;
$rsa = new rsa();
$private_key = file_get_contents('private.pem');
$rsa->loadkey($private_key);
$data = "这是要签名的数据";
$signature = $rsa->sign($data);
// 将签名进行base64编码,方便存储和传输
$signature_base64 = base64_encode($signature);
echo "签名后的数据(base64编码):".$signature_base64;
?>
• 验签操作:
<?php
require 'vendor/autoload.php';
use phpseclib\crypt\rsa;
$rsa = new rsa();
$public_key = file_get_contents('public.pem');
$data = "刚才签名的数据";
$signature_base64 = "刚才签名后的数据(base64编码)";
$signature = base64_decode($signature_base64);
$verify_result = $rsa->verify($data, $signature);
if ($verify_result) {
echo "签名验证成功";
} else {
echo "签名验证失败";
}
?>
直接使用密钥字符串
• 准备密钥:将公钥和私钥以字符串的形式存储在PHP变量中,并且需要将其转换为PEM格式。如果密钥不是PEM格式,可使用
chunk_split
函数将密钥按照每行64个字符的长度进行分割,并在适当的位置插入换行符\n
,然后拼接成完整的PEM格式.
<?php
$publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKZ1mKTymRoGKnHiP1xAy4aiyt5r0BscCZnDAonCrMFZ4kBGriPNHxEaLr5lfBnMKw7k6i+2dsFPSEZooTvqtPUCAwEAAQ==';
$privateKey = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEApnWYpPKZGgYqceI/XEDLhqLK3mvQGxwJmcMCicKswVniQEauI80fERouvmV8GcwrDuTqL7Z2wU9IRmihO+q09QIDAQABAkBunx3nGHXYjppsfn++7iyTd+I7+Agfy/0xWyB3rpEiGGgfemjcRFaeq5SC2vUNXsrEOY5gbUSQmFxH//Cym18NAiEA1z1cZx/Q9cbIjFPwp1a+K5CVFDXDcfbi/AQgAkVs0/cCIQDF+2fr23AoBslcOC4S0yAx94AbgxCntYuRqztxybsrcwIgMW86ZcT87TX2oaQ1xXk6vC68zqN6fBZEE7Wu1Fa1pAkCIElmOJP3qfAc/AAlj+dIwLHlqWgJwl3674CU9Bfui2bDAiEA0CKJpF8x7KANCcopEQC93PsbIztuML322LOfDV1Lw/k=';
$pem = chunk_split($privateKey, 64, "\n");
$pem = "-----BEGIN PRIVATE KEY-----\n". $pem. "-----END PRIVATE KEY-----\n";
$pem2 = chunk_split($publicKey, 64, "\n");
$pem2 = "-----BEGIN PUBLIC KEY-----\n". $pem2. "-----END PUBLIC KEY-----\n";
?>
• 加密操作:
<?php
openssl_public_encrypt("要加密的数据", $encrypted, $pem2);
$encrypted_base64 = base64_encode($encrypted);
echo "加密后的数据(base64编码):".$encrypted_base64;
?>
• 解密操作:
<?php
openssl_private_decrypt(base64_decode($encrypted_base64), $decrypted, $pem);
echo "解密后的数据:".$decrypted;
?>
• 签名操作:
<?php
openssl_sign("要签名的数据", $signature, $pem);
$signature_base64 = base64_encode($signature);
echo "签名后的数据(base64编码):".$signature_base64;
?>
• 验签操作:
<?php
$verify_result = openssl_verify("刚才签名的数据", base64_decode($signature_base64), $pem2);
if ($verify_result === 1) {
echo "签名验证成功";
} elseif ($verify_result === 0) {
echo "签名验证失败";
} else {
echo "验签出错";
}
?>
在实际应用中,需根据具体需求和场景选择合适的方式来进行RSA密钥的读取、加解密以及签名验签操作 。使用openssl扩展是基于PHP的内置扩展,性能较好,但配置相对复杂;phpseclib库则更加灵活,易于使用和跨平台,但可能在性能上稍逊一筹;直接使用密钥字符串的方式较为简单直接,但密钥的管理和安全性需要开发者自行保障。