【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);}}

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

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

相关文章

.NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法

在.NET 6中&#xff0c;微软官方建议把 System.Drawing.Common 迁移到 SkiaSharp 库。因为System.Drawing.Common 被设计为 Window 技术的精简包装器&#xff0c;因此其跨平台实现欠佳。 SkiaSharp是一个基于谷歌的Skia图形库&#xff08;Skia.org&#xff09;的用于.NET平台的…

WebSocket项目中难点与解决方法

1、难点一&#xff1a;连接建立与保持 问题描述&#xff1a; 在项目中&#xff0c;我们发现WebSocket初始连接负担较大&#xff0c;主要体现在频繁的连接建立和保持连接的开销较高。 解决方法&#xff1a; 1. 连接池管理&#xff1a;我们引入了websocket-pool库&#xff0c;通…

Mysqld的关键优化参数

skip-name-resolve 现象 mysql连接很慢&#xff0c;登陆到服务器上查看服务器日志都是正常的&#xff0c;无可疑记录&#xff0c;登陆到mysql服务器上&#xff0c;查看下进程&#xff0c;发现有很多这样的连接&#xff1a; 218 | unauthenticated user | 192.168.10.6:44500 |…

Springcloud 微服务实战笔记 Eureka

服务治理 服务注册 在服务治理框架中&#xff0c;通常都会构建一个注册中心&#xff0c;每个服务单元向注册中心登记自己提供的服务&#xff0c;将主机与端口号、版本号、通信协议等一些附加信息告知注册中心&#xff0c;注册中心按服务名分类组织服务清单。当服务启动后&…

PS制作2寸或者1寸排版打印照

最近家人需要2寸照&#xff0c;然后之前照的摄影馆给打印的是一版1寸照纸质和一张精修的原版照&#xff0c;然后要打印2寸照的话就存在两种选择&#xff1a; 需要自己做排版打印照&#xff0c;拿去打印店打印&#xff0c;要么就是直接拿着这张精修的单照去打印店让打印店的工作…

Vue websocket的封装及使用

创建 WebSocket 连接的函数 创建 WebSocket 连接&#xff1a;通过传入的 url 参数创建一个 WebSocket 实例。 监听连接打开事件&#xff1a;当连接成功建立时&#xff0c;执行传入的 onOpen 回调函数。 监听消息接收事件&#xff1a;当接收到消息时&#xff0c;将消息解析为 …

NLP基础——TF-IDF

TF-IDF TF-IDF全称为“Term Frequency-Inverse Document Frequency”&#xff0c;是一种用于信息检索与文本挖掘的常用加权技术。该方法用于评估一个词语&#xff08;word&#xff09;对于一个文件集&#xff08;document&#xff09;或一个语料库中的其中一份文件的重要程度。…

如何删除K8S中的Pod

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

全国(山东、安徽)职业技能大赛--信息安全管理与评估大赛题目+答案讲解——linux应急响应篇

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋 🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步…

图论及其应用的一些论断---选择题

在任意一个网络N=(X,Y,I,A,c)中,最大流的值等于最小割的容量。在任意6个人的集会上,要么有3个人互相认识,要么有3个人互不认识。若G为无向简单图,则图G的边数ε,点数v之间有: ε < = ( v 2 ) ε<=\binom{v}{2} ε<=

代码随想录|贪心day2

122.力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 买股票的最佳时机&#xff0c;这道题其实和53有一点像&#xff0c;因为不需要写出哪个区间卖出买进&#xff0c;所以判断prices[i] - prices[i - 1]的值的大小&#xff0c;如果这个值是正的&#…

修复异常关机导致CentOS文件系统内存数据损坏的问题

今天一同事重启wifi直接拔的电源&#xff0c;导致服务器异常关机&#xff0c;重启之后发现虚拟机报错&#xff1a; [17.874068] xTS (dm-8): Corruption of in-memory data detected. Shutting dowm filesystem[17.874069] XTS (dm-8): Please umount the f ilesystem and rect…

kotlin first/last/indexOf/elementAt

kotlin 中 first 是取集合元素中第一个元素 last 是取集合元素中最后一个元素 indexOf 根据元素寻找下标&#xff0c;默认是第一个 elementAt 根据下标找元素 下面写一个demo 说明下他们几个的使用 val list listOf("A", "D", "A", "…

java 打印日志的几种方式

java 打印日志的几种方式 Java 日志框架进化史日志门面与日志系统 Log4jslf4jLog4j2slf4jLogbackslf4j 一、先简单介绍五种 &#xff08;1&#xff09;最简单的方式&#xff0c;就是system.println.out(error) ,这样直接在控制台打印消息了&#xff1b; &#xff08;2&#xff…

龙格-库塔(Runge–Kutta)法 (Dopri5, Euler method,Explicit midpoint method)

在数值分析中&#xff0c;龙格-库塔方法是一系列隐式和显式迭代方法&#xff0c;其中包括欧拉方法&#xff0c; 显式中心点法&#xff0c; ,后向欧拉方法, &#xff0c;用于联立非线性方程近似解的时间离散化。[2]这些方法是由德国数学家Carl Runge和Wilhelm Kutta。 显式欧拉…

如何在iPhone设备中查看崩溃日志

​ 目录 如何在iPhone设备中查看崩溃日志 摘要 引言 导致iPhone设备崩溃的主要原因是什么&#xff1f; 使用克魔助手查看iPhone设备中的崩溃日志 奔溃日志分析 总结 摘要 本文介绍了如何在iPhone设备中查看崩溃日志&#xff0c;以便调查崩溃的原因。我们将展示三种不同的…

打破无声世界:让您的网站会说话

导语&#xff1a;在当今的互联网世界&#xff0c;技术创新日新月异&#xff0c;为广大开发者提供了无数便捷的工具。本文将为您介绍前端文本语音API&#xff0c;这一神奇的技术能够实现文字到语音的转换&#xff0c;为您的项目增添更多可能性。同时&#xff0c;我们还将为您提供…

uniapp中uview组件库的Input 输入框 的使用方法

目录 #平台差异说明 #基本使用 #输入框的类型 #可清空字符 #下划线 #前后图标 #前后插槽 API #Props #Events #Methods #Slots 去除fixed、showWordLimit、showConfirmBar、disableDefaultPadding、autosize字段 此组件为一个输入框&#xff0c;默认没有边框和样式…

UE5 VR版增强输入初体验 官方模板学习

问题 我们传统的输入方式&#xff0c;是通过编辑器设置输入操作映射&#xff0c;然后BindAction和BindAxis绑定 这边插播一条增强输入知识点&#xff0c;参考知乎大佬文章 和增强输入的VR模板教学&#xff1a;如何使用VR模板在UE5中使用增强输入系统_哔哩哔哩_bilibili 实践操…

Linux下查看CPU信息

#lscpu Architecture: x86_64&#xff0c;表示系统的处理器架构为x86-64。CPU op-mode(s): 32-bit, 64-bit&#xff0c;表示处理器支持32位和64位操作系统。Byte Order: Little Endian&#xff0c;表示系统使用的字节序为小端序。CPU(s): 96&#xff0c;表示系统中有96个CPU核…