PHP下实现RSA的加密,解密,加签和验签

前言:

RSA下加密,解密,加签和验签是四种不同的操作,有时候会搞错,记录一下。

1.公钥加密,私钥解密

发送方通过公钥将原数据加密成一个sign参数,相当于就是信息的载体,接收方能通过sign解密出原数据

/*** 公钥加密*/public static function encrypt($string,$type,$params=[]):string{try{$params['act'] = $params['act']??[];$publicKey = file_get_contents( app()->getRootPath() . "storage/resource/{$type}/public_key.pem");openssl_public_encrypt($string, $encrypted, $publicKey);$encrypted = base64_encode($encrypted);if(in_array('rawurlencode',$params['act'])){$encrypted = rawurlencode($encrypted);}return $encrypted;} catch (\Exception $e) {throw new \Exception($e->getMessage());}/*** 私钥解密*/public static function decrypt($string,$type,$params=[]):string{try{$params['act'] = $params['act']??[];$privateKeyContent = file_get_contents( app()->getRootPath() . "storage/resource/{$type}/private_key.pem");$privateKey = openssl_pkey_get_private([$privateKeyContent,$params['password'],]);if ($privateKey === false) {throw new \Exception('私钥加载失败:' . openssl_error_string());}// 4. 解密数据$string = base64_decode($string);if(in_array('rawurldecode',$params['act'])){$string = rawurldecode($string);}$decryptSuccess = openssl_private_decrypt($string, $decryptedData, $privateKey);if (!$decryptSuccess) {throw new \Exception('解密失败:' . openssl_error_string());}//释放内存openssl_free_key($privateKey);return $decryptedData;} catch (\Exception $e) {throw new \Exception($e->getMessage());}}
使用

1.第三方向本站发送数据,先将公钥同步给第三方。
2.第三方将 name=xiaozhao&age=20 用公钥直接加密成sign参数。
3.第三方将sign发送给我站。
4.我站用私钥将xxx重新解密成 name=xiaozhao&age=20。
4.原数据加密为sign状态下传输。

2.私钥加签,公钥验签

我方和接收方事先协商好加签规则,然后将原数据生成一个sign参数,接收方将一起带来的原数据跟sign参数对比,看是否一致。

 /*** 私钥加签*/public static function sign($string, $type,$params=[]){try {$privateKeyContent = file_get_contents( app()->getRootPath() . "storage/resource/{$type}/private_key.pem");$privateKey = openssl_pkey_get_private([$privateKeyContent,$params['password'],]);if ($privateKey === false) {throw new \Exception('私钥加载失败:' . openssl_error_string());}// 4. 创建签名$signature = '';if (!openssl_sign($string, $signature, $privateKey, OPENSSL_ALGO_SHA256)) {throw new \Exception('签名创建失败: ' . openssl_error_string());}// 5. 返回Base64编码的签名return base64_encode($signature);} catch (\Exception $e) {throw new \Exception("签名过程中发生错误: " . $e->getMessage());}}/*** 公钥验签*/public static function verify($string, $type, $sign) {try {$publicKeyContent = file_get_contents(app()->getRootPath() . "storage/resource/{$type}/public_key.pem");// 关键修复:解析公钥为 OpenSSL 资源$publicKey = openssl_pkey_get_public($publicKeyContent);if ($publicKey === false) {throw new \Exception('公钥加载失败: ' . openssl_error_string());}// 清理签名数据$sign = base64_decode(trim(str_replace(["\r", "\n", " "], '', $sign)));$result = openssl_verify($string, $sign, $publicKey, OPENSSL_ALGO_SHA256);// 释放密钥资源openssl_free_key($publicKey);if ($result === -1) {throw new \Exception('参数无效或密钥格式错误: ' . openssl_error_string());}if ($result === 0) {throw new \Exception('验证失败');}return $result === 1;} catch (\Exception $e) {throw new \Exception("验签失败: " . $e->getMessage());}}
使用

密钥 MIGfMA0G 开头的是PKCS#1 格式,MIIBIjANBgkqh 开头的是PKCS#8 格式。PKCS#8格式提取公钥的时候要先用openssl_pkey_get_public提取

1.本站向第三方发送数据,先将公钥发给第三方。
2.我站将 name=xiaozhao&age=20用双方协商好的方式排序(如去掉空数据,再按键名排序等)后,用私钥生成签名sign。
3.我站将原数据和sign一起发送给我站。
3.第三方将原参数用双方协商好的方式排序后,和sign参数用公钥验签
4.原数据和sign同时传输传输。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/83139.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Win10秘笈:两种方式修改网卡物理地址(MAC)

Win10秘笈:两种方式修改网卡物理地址(MAC) 在修改之前,可以先确定一下要修改的网卡MAC地址,查询方法有很多种,比如: 1、在设置→网络和Internet→WLAN/以太网,如下图所示。 2、在控…

C++中IO文件输入输出知识详解和注意事项

以下内容将从文件流类体系、打开模式、文本与二进制 I/O、随机访问、错误处理、性能优化等方面&#xff0c;详解 C 中文件输入输出的使用要点&#xff0c;并配以示例。 一、文件流类体系 C 标准库提供三种文件流类型&#xff0c;均定义在 <fstream> 中&#xff1a; std…

Unity3D仿星露谷物语开发56之保存角色位置到文件

1、目标 游戏中通过Save Game保存角色位置&#xff0c;当重启游戏后&#xff0c;通过Load Game可以恢复角色的位置。 2、Player对象操作 &#xff08;1&#xff09;组件添加 给Hierarchy下的Player组件添加Generate GUID组件。 &#xff08;2&#xff09;修改SceneSave.cs脚…

TKernel模块--杂项

TKernel模块–杂项 1.DEFINE_HARRAY1 #define DEFINE_HARRAY1(HClassName, _Array1Type_) \ class HClassName : public _Array1Type_, public Standard_Transient { \public: …

c++ typeid运算符

typeid运算符能获取类型信息。获取到的是type_info对象。type_info类型如下&#xff1a; 可以看到&#xff0c;这个类删除了拷贝构造函数以及等号操作符。有一些成员函数&#xff1a;hash_code、before、name、raw_name, 还重载了和!运算符。 测试&#xff1a; void testTyp…

第304个Vulnhub靶场演练攻略:digital world.local:FALL

digital world.local&#xff1a;FALL Vulnhub 演练 FALL (digitalworld.local: FALL) 是 Donavan 为 Vulnhub 打造的一款中型机器。这款实验室非常适合经验丰富的 CTF 玩家&#xff0c;他们希望在这类环境中检验自己的技能。那么&#xff0c;让我们开始吧&#xff0c;看看如何…

【数据库】数据库恢复技术

数据库恢复技术 实现恢复的核心是使用冗余&#xff0c;也就是根据冗余数据重建不正确数据。 事务 事务是一个数据库操作序列&#xff0c;是一个不可分割的工作单位&#xff0c;是恢复和并发的基本单位。 在关系数据库中&#xff0c;一个事务是一条或多条SQL语句&#xff0c…

switch-case判断

switch-case判断 #include <stdio.h> int main() {int type;printf("请输入你的选择&#xff1a;\n");scanf("%d",&type);getchar();switch (type){case 1:printf("你好&#xff01;");break;case 2:printf("早上好&#xff01;…

从监控到告警:Prometheus+Grafana+Alertmanager+告警通知服务全链路落地实践

文章目录 一、引言1.1 监控告警的必要性1.2 监控告警的基本原理1.2.1 指标采集与存储1.2.2 告警规则与触发机制1.2.3 多渠道通知与闭环 二、技术选型与架构设计2.1 为什么选择 Prometheus 及其生态2.1.1 Prometheus 优势分析2.1.2 Grafana 可视化能力2.1.3 Alertmanager 灵活告…

STM32 UART通信实战指南:从原理到项目落地

STM32串口通信实战指南&#xff1a;从零开始手把手教你 前言&#xff1a;为什么串口这么重要&#xff1f; 在嵌入式开发中&#xff0c;串口就像设备的"嘴巴"和"耳朵"。无论是给单片机下达指令、读取传感器数据&#xff0c;还是让两个模块"对话"…

Jmeter requests

1.Jemter元件和组件 1.1 元件和组件的概念 元件&#xff1a;多个功能相似的的组件的容器&#xff0c;类似于一个工具箱。 组件&#xff1a;实现某个特定功能的实例&#xff0c;类似于工具箱中的螺丝刀&#xff0c;十字扳手... 1.2 作用域和执行顺序 1.2.1 作用域 例子&#…

计算机视觉---GT(ground truth)

在计算机视觉&#xff08;Computer Vision, CV&#xff09;领域&#xff0c;Ground Truth&#xff08;GT&#xff0c;中文常译为“真值”或“ ground truth”&#xff09; 是指关于数据的真实标签或客观事实&#xff0c;是模型训练、评估和验证的基准。它是连接算法与现实世界的…

1-Wire 一线式总线:从原理到实战,玩转 DS18B20 温度采集

引言 在嵌入式系统中&#xff0c;通信总线是连接 CPU 与外设的桥梁。从 I2C、SPI 到 UART&#xff0c;每种总线都有其独特的应用场景。而本文要介绍的1-Wire 一线式总线&#xff0c;以其极简的硬件设计和独特的通信协议&#xff0c;在温度采集、身份识别等领域大放异彩。本文将…

基于开源AI大模型AI智能名片S2B2C商城小程序源码的销售环节数字化实现路径研究

摘要&#xff1a;在数字化浪潮下&#xff0c;企业销售环节的转型升级已成为提升竞争力的核心命题。本文基于清华大学全球产业研究院《中国企业数字化转型研究报告&#xff08;2020&#xff09;》提出的“提升销售率与利润率、打通客户数据、强化营销协同、构建全景用户画像、助…

Linux浅谈

Linux浅谈 一、什么是 Linux&#xff1f;先抛开 “内核”&#xff0c;看整体 可以把 Linux 系统 想象成一台 “组装电脑”&#xff1a; 最核心的零件是 “主板”—— 这就是 Linux 内核&#xff08;Kernel&#xff09;&#xff0c;负责管理电脑里的所有硬件&#xff08;比如 …

PostgreSQL ERROR: out of shared memory处理

使用pg_dump命令导出一个库的时候&#xff0c;报 pg_dump: error: query failed: ERROR: out of shared memory HINT: You might need to increase "max_locks_per_transaction". 从错误字面上看是超出内存大小了&#xff0c;建议增加max_locks_per_transaction参…

IoT/基于NB28-A/BC28-CNV通信模组使用AT指令连接华为云IoTDA平台(HCIP-IoT实验2)

文章目录 概述检查通信环境通信模组固件信号强度CGATT指令参数 / 啥是PS域&#xff1f;PS附着状态&#xff1a;ATCGATTPLMN 选择&#xff1a;ATCOPSCEREG指令参数 / 啥是EPS与EPC?CEREG指令参数 / 啥是URC?网络注册状态&#xff1a;ATCEREG网络附着和网络注册 AT指令接入IoTD…

红外遥控(外部中断)

目录 1.红外遥控简介 通信方式&#xff1a; 红外LED波长&#xff1a; 通信协议标准&#xff1a; 2.硬件电路 发送部分1&#xff1a; 内部元件介绍&#xff1a; 工作原理&#xff1a; 为什么要以38KHZ亮灭&#xff1f; 电路图&#xff1a; 发送部分2&#xff1a; 电…

【C#】一个简单的http服务器项目开发过程详解

这跟安装NoteJs程序运行脚本文件搭建一个简单Http服务器一样&#xff0c;相比起来&#xff0c;它的优点是可以开发的应用是免安装&#xff0c;跨平台的&#xff0c;放在移动盘上便捷的&#xff0c;这里着重讲http服务器实现的过程&#xff0c;以便自主实现特定的功能和服务。 …

WPF【11_4】WPF实战-重构与美化(MVVM 架构)

11-9 【理论】MVVM 架构 在 WPF 项目中&#xff0c;我们主要采用的是一种类似 MVC 的架构&#xff0c;叫做 MVVM。 MVVM 继承了 MVC 的理念&#xff0c;是 Model-View-ViewModel 的缩写&#xff0c;中文意思是模型、视图、视图模型。这三个词分开看我们都能看懂&#xff0c;不…