PHP三种方式读取RSA密钥加解密、签名验签完整教程

科技   2024-12-30 16:05   湖南  

 



以下是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($privateKey64"\n");
$pem = "-----BEGIN PRIVATE KEY-----\n"$pem"-----END PRIVATE KEY-----\n";
$pem2 = chunk_split($publicKey64"\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库则更加灵活,易于使用和跨平台,但可能在性能上稍逊一筹;直接使用密钥字符串的方式较为简单直接,但密钥的管理和安全性需要开发者自行保障。

 


精英博客探索
关注热点,传递正能量。
 最新文章