当前位置: 首页 > news >正文

【PHP】PHP实现RSA加密,解密,加签,验签

1.php RSA生成公私钥

// 生成密钥对
$config = array("digest_alg" => "sha256", // 加密算法"private_key_bits" => 2048, // 密钥长度(位数)
);// 创建并保存私钥到文件
$res = openssl_pkey_new($config);
if (!file_put_contents('private.key', $res)) {die("无法将私钥写入文件");
}// 获取公钥
$pubKey = openssl_pkey_get_details($res)['key'];
if (empty($pubKey)) {die("无法从私钥中提取公钥");
}echo '私钥内容:' . PHP_EOL;
var_dump($res);echo '公钥内容:' . PHP_EOL;
var_dump($pubKey);

2.公钥用于对数据进行加密,私钥用于对数据进行解密;

私钥用于对数据进行签名,公钥用于对签名进行验证。

class Rsa
{/*** private key*/private $_privKey;/*** public key*/private $_pubKey;/*** the keys saving path*/private $_keyPath;public function __construct ($path)
{if (empty($path) || !is_dir($path)) {throw new \Exception('Must set the keys save path');}//设置私钥$this->_keyPath = $path;$file = $this->_keyPath . DIRECTORY_SEPARATOR . 'rsa_private_key.pem';$prk = file_get_contents($file);$this->_privKey = openssl_pkey_get_private($prk);//设置公钥$file = $this->_keyPath . DIRECTORY_SEPARATOR . 'rsa_public_key.pem';$puk = file_get_contents($file);$this->_pubKey = openssl_pkey_get_public($puk);}/*** setup the private key*/public function setupPrivKey ()
{if (is_resource($this->_privKey)) {return true;}$file = $this->_keyPath . DIRECTORY_SEPARATOR . 'rsa_private_key.pem';$prk = file_get_contents($file);$this->_privKey = openssl_pkey_get_private($prk);return true;}/*** setup the public key*/public function setupPubKey ()
{if (is_resource($this->_pubKey)) {return true;}$file = $this->_keyPath . DIRECTORY_SEPARATOR . 'rsa_public_key.pem';$puk = file_get_contents($file);$this->_pubKey = openssl_pkey_get_public($puk);return true;}/*** @function 私钥加密* @param $data* @return string|null*/public function privEncrypt ($data)
{if (!is_string($data)) {return null;}$r = openssl_private_encrypt($data, $encrypted, $this->_privKey);if ($r) {return base64_encode($encrypted);}return null;}/*** @function 私钥解密* @param $data* @return string|null*/public function privDecrypt ($encrypted)
{if (!is_string($encrypted)) {return null;}$encrypted = base64_decode($encrypted);$r = openssl_private_decrypt($encrypted, $decrypted, $this->_privKey);if ($r) {return $decrypted;}return null;}/*** @function 公钥加密* @param $data* @return string|null*/public function pubEncrypt ($data)
{if (!is_string($data)) {return null;}$r = openssl_public_encrypt($data, $encrypted, $this->_pubKey);if ($r) {return base64_encode($encrypted);}return null;}/*** @function 公钥解密* @param $data* @return string|null*/public function pubDecrypt ($crypted)
{if (!is_string($crypted)) {return null;}$crypted = base64_decode($crypted);$r = openssl_public_decrypt($crypted, $decrypted, $this->_pubKey);if ($r) {return $decrypted;}return null;}/*** @function 私钥加签* @param $data* @return string|null*/public function sign ($data)
{if (!is_string($data)) {return null;}openssl_sign($data, $sign, $this->_privKey);//base64编码$sign = base64_encode($sign);return $sign;}/*** @function 公钥验签* @param $data* @return string|null*/public function verify($data, $sign){if (!is_string($data)) {return null;}$result = (bool)openssl_verify($data, base64_decode($sign), $this->_pubKey);return $result;}public function __destruct ()
{empty($this->_privKey) ? '' : openssl_free_key($this->_privKey);empty($this->_pubKey) ? '' : openssl_free_key($this->_pubKey);}
}使用例子:
class Index
{public function index()
{$RSA = new Rsa(config('key_path'));//对数据公钥加密及私钥解密$string = '快乐程序员';$pubString = $RSA->pubEncrypt($string);echo '用公钥加密后数据:'.$pubString .'<br/>';$priDeString = $RSA->privDecrypt($pubString);echo '用私钥解密数据:'.$priDeString .'<br/>';//实现对数据私钥加签及公钥验签$sign = $RSA->sign($string);echo '用私钥加签后得到签名:'.$sign .'<br/>';$result = $RSA->verify($string,$sign);echo '验证签名是否正确:<br/>';dump($result);}}

相关文章:

  • 关于Python里xlwings库对Excel表格的操作(二十八)
  • 【2024.01.04】转行小白-刷算法08
  • html-css-js移动端导航栏底部固定+i18n国际化全局
  • 羊大师讲解每天坚持去散步,你的身体将会感受到奇迹的变化!
  • 【Redux】自己动手实现redux和react-redux
  • 16.Linux Bash Shell通过`read`命令读取用户输入
  • Python3 运算符
  • [C#]C# OpenVINO部署yolov8图像分类模型
  • x-cmd pkg | gitui - git 终端交互式命令行工具
  • 【docker】Dockerfile 指令详解
  • 华为 1+X《网络系统建设与运维(初级)》 认证实验上机模拟试题
  • 图像预处理——transforms
  • 【2023年度总结】蜕变与挑战
  • 【XR806开发板使用】开发环境搭建、Hello工程以及开发事项
  • 基于OpenCV的图像缩放
  • Docker 笔记(2):Dockerfile
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • ES6 学习笔记(一)let,const和解构赋值
  • Python学习之路13-记分
  • Ruby 2.x 源代码分析:扩展 概述
  • spring cloud gateway 源码解析(4)跨域问题处理
  • SSH 免密登录
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 深入 Nginx 之配置篇
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • # Java NIO(一)FileChannel
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (pojstep1.3.1)1017(构造法模拟)
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (二)springcloud实战之config配置中心
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)Mysql的优化设置
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .NET Core Web APi类库如何内嵌运行?
  • .Net环境下的缓存技术介绍
  • .net经典笔试题
  • .NET命名规范和开发约定
  • .net中应用SQL缓存(实例使用)
  • /dev/sda2 is mounted; will not make a filesystem here!
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • @vue/cli 3.x+引入jQuery