rsa2加解密及签名校验

2023-10-27

非对称加解密:

第一种用法:私钥签名,公钥验签。---用于签名

第二种用法:公钥加密,私钥解密。---用于加解密

class Rsa2Controller extends Controller
{
    /****
     * 第一种应用:验签(私钥加密,公钥验签)
     * @return string
     */
    public function verifySign()
    {
        $rsa2 = new Rsa2();
        $data = [
            'app_id' => 1,
            'content' => '我的就是你的',
            'from_uid' => 10024,
        ];
        ksort($data);
        $dataStr = http_build_query($data);

        //生成签名
        $signature = $rsa2->createSign($dataStr);

        echo "数据{$dataStr}签名后数据:{$signature}";

        //公钥验签
        $res = $rsa2->verifySign($dataStr, $signature);
        echo $res ? '验签成功' : '验签失败';
    }

    /****
     * 第二种应用:加解密(公钥加密,私钥解密)
     * @return array
     */
    public function decryptData()
    {
        $rsa2 = new Rsa2();
        $data = [
            'app_id' => 1,
            'content' => '我的就是你的',
            'from_uid' => 10024,
        ];
        $dataStr = json_encode($data);

        //公钥加密
        $encryptStr = $rsa2->encryptData($dataStr);

        echo "数据{$dataStr}加密后数据:{$encryptStr}";

        //私钥解密
        $originalData = $rsa2->decryptData($encryptStr);
        dd($originalData);
    }
}

下面是已经封装好的rsa2工具类:

class Rsa2
{
    //私钥和公钥直接去生成密码类网站上获取即可,也可以自己使用命令生成
    //私钥
    private $privateKey = '-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQBsyuPhUCfUPVI4zF0A6OA6tc8N35W89KNND0KcNbPLaEhNjo0z
IZjOP+D3TfJislc2o1939hs6qk1vNYA0oGPHoyV3HDhecxMh7XDXTg7WF1IZEjhJ
2JVgFe/oqFDOcCiJZUg4ixLV/NFnnayA4f2rLK8ZdO7276rZLHPIlQcbwecA7sKA
IWrvt6LbjCV/a7E7CEhLzDjC0Jaa/n//5WrtJmKlrG0TMF+S65vjz/HkxUO53JDQ
lZoDuj+FSjP0PTauZmz4ksqA4vHCqRi4ExNQ7eztH70DHEyAPeMqqsBa1Oz9hkWr
F94DMSmM9DOu5pPHfmF/6wOraKf6mUtpkRuDAgMBAAECggEARpy1peNpxpb6jAUR
BGsiRtkEiCOrw9YhO/4ApPUyOn74FubEfQB8drn9YWbFQQwyETOe3nTtnXk2A019
ZisIOGaLBbFaYOtd6rJ7gDOY65p9Xep2gG/EHHaAncjJkgQ4O11yr8iMtDmBDTjI
42pLRFQfXm2IQNy0TntMt08LKxcmqLFuMCnp4HUpkk5QVXZnhNwSHul+O2kormnd
WnTi0YvLzKqDiL4GhpD2zBzcxYgBKplKsmjcnipSU4oacA6RTGkNfLXuo4ocMjq0
z/AcNl9cwEPdvgb1ilmQEKxXTweiHRvE/SQ47k+9Nk7veN0SokctYLBCsP57QAsx
xKDR8QKBgQDHfEV+r+li/UU4stuxOxRUWbkZ3V7k9kQck/XD1UO6OxKA8iZQEL0W
eeUxDBu+E4mr/Rn79vsyzrs8lCaIq5j3lzyYGuXdMyFVnzFcSpmALvPfKxXZcevb
B1upEhKk2z6JTnqI6Ijy78C+FXSTmcbMlKBuutinAI3DhMPJaWr0mQKBgQCLnRhM
CvTu0YbSkUOGeT/nVEwWjQbAMGJAdYbR0YLmJDX5Ijp68pCQGp97/oeq8m5XPFbM
UP2YsHGUJu8qaDm9FuupxsFc7BAaH5Ylbk5O78NBp+pgiykjwAmN0Kk/Y6UXWW4s
AjTZHTiJbPEKk85MrR4eDd14kRDNg/G5AkIGewKBgFq8yheQCIbAUWYy5P8+skaT
8UA0k19uLRkarCWBsibZi9cfThIJKxk4JOokadIRrQOQQut7MlOv+Tba5JQyCYhF
QIinY3s0MKtzl841GJFXyhHu1SdtTCz6sdS7pcNa/p0SF2aC7xghufg8ZiRlRCn2
SOtVDgsYk2Ml1rCcxMuxAoGAQHInwRJdtc/qWFDNxsk5gmMbLF20/ApZkD+wGDKK
JgoZEAOI0zAdIyfm7qmznmmCHaqwtme8aDsqcqT2SbEK1go6hohEwcwGMsjZ2jVs
2Gs8ypXkTuRt/R6sSlZDigtJLdoOTSpHkuE2M9mh+qv30tUmzeDAluL/yp5Zenlc
WPkCgYEAnMxZRmDjfyAPqbBTgKXnhESNgj6mUPm1UfhjdvmorXs+AtULfC1dBW4n
WHgtyU3POihHd2swy7o0AXPqU0z4i1mETT42E+QA6OOfRpbfnamBVRlY1Fp8a09Q
nI1hhvAVabj7EKo3Rtti7iV+fwtfLPiNQ3SwjGNLKIofIyb8Huc=
-----END RSA PRIVATE KEY-----';
    //注意:-----靠最左,不然获取私钥资源会错误
    //公钥
    private $publicKey = '-----BEGIN PUBLIC KEY-----
MIIBITANBgkqhkiG9w0BAQEFAAOCAQ4AMIIBCQKCAQBsyuPhUCfUPVI4zF0A6OA6
tc8N35W89KNND0KcNbPLaEhNjo0zIZjOP+D3TfJislc2o1939hs6qk1vNYA0oGPH
oyV3HDhecxMh7XDXTg7WF1IZEjhJ2JVgFe/oqFDOcCiJZUg4ixLV/NFnnayA4f2r
LK8ZdO7276rZLHPIlQcbwecA7sKAIWrvt6LbjCV/a7E7CEhLzDjC0Jaa/n//5Wrt
JmKlrG0TMF+S65vjz/HkxUO53JDQlZoDuj+FSjP0PTauZmz4ksqA4vHCqRi4ExNQ
7eztH70DHEyAPeMqqsBa1Oz9hkWrF94DMSmM9DOu5pPHfmF/6wOraKf6mUtpkRuD
AgMBAAE=
-----END PUBLIC KEY-----';

    /***
     * 获取私钥
     * @return bool|resource
     */
    private function getPrivateKey()
    {
        $privateKey = $this->privateKey;
        //秘钥格式处理(以下多种处理方式,根据自己情况处理)
        //1,读取私钥文件
        //$res = file_get_contents(__DIR__.'/private.pem');
        //2,对秘钥进行折行处理
        //$res = "-----BEGIN RSA PRIVATE KEY-----\n" . wordwrap($keyPem, 64, "\n", true) . "\n-----END RSA PRIVATE KEY-----";
        // 请注意密钥 是不是有带   -----BEGIN RSA PRIVATE KEY-----   -----END RSA PRIVATE KEY-----
        //3,去除字符串中的空格
        //$res = str_replace("\r",'',$privateKey);
        //获取私钥资源标识符(此处返回false则说明秘钥文件格式不对,需要处理格式)

        return openssl_get_privatekey($privateKey);
    }

    /***
     * 获取公钥
     * @return bool|resource
     */
    private function getPublicKey()
    {
        $publicKey = $this->publicKey;
        return openssl_get_publickey($publicKey);
    }

    /***
     * 创建签名
     * @param string $dataStr 数据
     * @return null|string
     */
    public function createSign($dataStr = '')
    {
        if (!is_string($dataStr)) {
            return null;
        }
        $privateKey = $this->getPrivateKey();
        openssl_sign($dataStr, $sign, $this->getPrivateKey(), 'SHA256');
        //释放私钥资源标识符
        openssl_free_key($privateKey);
        return $sign ? base64_encode($sign) : null;
    }

    /**
     * 验证签名
     * @param string $dataStr 数据
     * @param string $sign 签名
     * @return bool
     */
    public function verifySign($dataStr = '', $sign = '')
    {
        if (!is_string($dataStr) || !is_string($sign)) {
            return false;
        }
        return (bool)openssl_verify($dataStr, base64_decode($sign), $this->getPublicKey(), 'SHA256');
    }

    /****
     * 公钥加密
     * @param string $dataStr 数据
     * @return string
     **/
    public function encryptData($dataStr = '')
    {
        $publicKey = $this->getPublicKey();
        return openssl_public_encrypt($dataStr, $encrypted, $publicKey)
            ? base64_encode($encrypted) : null;
    }

    /****
     * 私钥解密
     * @param string $dataStr 数据
     * @return string
     **/
    public function decryptData($encryptStr = '')
    {
        $privateKey = $this->getPrivateKey();
        $encrypted = base64_decode($encryptStr);
        $myData = openssl_private_decrypt($encrypted, $decrypted, $privateKey)
            ? json_decode($decrypted, true) : null;
        return $myData;
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

rsa2加解密及签名校验 的相关文章

  • 如何使用 OpenSSL.Net C# 包装器通过 AES 加密字符串?

    我正在尝试将一些加密数据从我的 SharePoint 网站发送到我公司的 PeopleSoft 网站 PeopleSoft 人员坚持要求我必须使用 OpenSSL 库进行加密 我已经从 SourceForge 下载并安装了 OpenSSL
  • 使用 aes_256_cbc 密码加密时的默认 IV 是多少?

    我在一个文件中生成了一个随机 256 位对称密钥 用于使用 OpenSSL 命令行加密一些数据 稍后我需要使用 OpenSSL 库以编程方式解密该数据 我没有成功 我认为问题可能出在我正在使用 或没有使用 的初始化向量中 我使用以下命令加密
  • 在 Objective-C 中以编程方式创建 .pem 文件?

    我正在尝试使用 iPhone 应用程序中的 Objective C 和 OpenSSL 库以编程方式从证书签名请求创建 PEM 文件 我按照 Adria Navarro 对这个问题的回答生成了 CSR 类型为 X509 REQ 使用钥匙串存
  • 将证书文件加载到证书对象中

    我正在尝试将证书文件加载到证书对象中 但出现以下异常 java security cert CertificateParsingException invalid DER encoded certificate data at sun se
  • openssl 获取证书扩展

    我正在使用 openssl 解析 X509 证书 我设法获得扩展 但我不知道如何提取扩展值 我正在使用的代码是 X509 EXTENSION extension sk X509 EXTENSION pop exts int critical
  • openssl-使用密钥和 IV 解密 Base64 字符串

    我正在尝试解密已在 openssl 中使用 aes256 加密的 base64 字符串 我获得了会话密钥和 IV 它们是用我的密钥加密的 我将它们转换为十六进制 以便可以使用以下 openssl 命令 openssl enc d aes25
  • openssl_random_pseudo_bytes() 很慢(PHP)

    我在 PHP 中使用 opennssl random pseudo bytes 它的执行速度非常慢 我的应用程序经常超时 引发执行时间限制错误 OpenSSL random 这么慢有什么特殊原因吗 我目前在我的开发机器上使用 Windows
  • bash 脚本中带有 PKCS#12 证书的 cURL

    我必须连接到网络服务 其中必须有 pkcs12 证书 这个想法是在 bash 脚本中使用curl 具体来说 在 OS X 下 我了解到 curl 在通信中无法做的少数事情之一是处理 pkcs12 证书 p12 我有什么选择 我读过将证书转换
  • 使用 Ruby OpenSSL 库时公钥无效

    我正在尝试在 Ruby 中生成 RSA 密钥对 主要使用来自这篇博文 http stuff things net 2009 12 11 generating rsa key pairs in ruby 这是我稍微修改过的代码 def gen
  • Lion:RVM 安装 rubies 时出现问题 - 与 openssl 相关的问题

    我很绝望 现在两天 天都在摆弄以下问题 但没有解决方案 更新 Lion 后 我想使用最新版本的 rvm 安装额外的 rubies 这是我之后调用捆绑器时发生的情况 Users felix rvm rubies ruby 1 9 2 p290
  • 在 XCode 中静态链接 OpenSSL

    我正在尝试链接libssl a and libcrypto aXCode 命令行项目中的静态库 在 Link Binary With Libraries 下 我已在搜索路径中包含 Openssl 头文件 编译成功但执行失败dyld Libr
  • 对 smtp.live.com 和 TIdSmtp(Indy、Delphi)的 SSL 支持

    我正在尝试连接到 smtp live com 发送电子邮件 live com 自 2009 年以来显然支持免费的 pop3 smtp 但这对我来说完全是新闻 当我尝试连接到 smtp live com 端口 587 时 会发生以下情况 Me
  • 使用 .NET 类进行 OpenSSL 加密

    我希望创建一个使用与 OpenSSL 兼容的 NET 库的类 我知道有一个 OpenSSL Net 包装器 但我希望避免引用第 3 方 非托管代码 我并不是要讨论这是否是正确的选择 但这是有原因的 目前我有以下内容 我认为它应该与 Open
  • Ruby 安装由于缺少扩展而中止:openssl、readline、zlib 编译错误

    我正在使用 macOS Catalina 我正在尝试通过 rbenv 安装旧版本的 Ruby 1 9 3 2 1 2 但是 在尝试安装旧版本时 我不断收到以下错误 安装 2 4 或更新版本时没问题 我已经尝试过 brew install o
  • 以编程方式验证 X509 证书和私钥匹配

    我使用以下命令创建了 RSA 密钥对EVP aes 256 cbc 密码 私钥采用 PEM 编码并具有密码 这需要用户输入密码 这是创建私钥的调用 Save private key bio priv BIO new file full as
  • 如何修改s_client的代码?

    我正在玩apps s client c in the openssl源代码 我想进行一些更改并运行它 但是在保存文件并执行操作后 我的更改没有得到反映make all or a make 例如 我改变了sc usage函数为此 BIO pr
  • 使用 PKCS1 生成私钥 RSA

    有没有办法在 PHP 中通过 OpenSSL 生成私钥openssl pkey 新 http php net manual en function openssl pkey new php在 RSA 和 PKCS1 中 如果您的意思是带有
  • Anaconda 无法导入 ssl 但 Python 可以

    Anaconda 3 Jupyter笔记本无法导入ssl 但使用Atom终端导入ssl没有问题 我尝试在 Jupyter 笔记本中导入 ssl 但出现以下错误 C ProgramData Anaconda3 lib ssl py in
  • OpenSSL 真的需要 openssl.conf 的路径吗?

    我想在 PHP 5 x 中创建自签名证书 使用我自己的 替代 openssl 配置 该配置应该由我的 PHP 代码定义 PHP 脚本将在不同的环境 共享托管网络服务器 上运行 官方PHP手册 http php net manual en f
  • 使用 OpenSSL 解码/提取 smime.p7m 文件内容(带有嵌入文件的电子邮件)?

    我们有一个旧的进程 VBScript 它读取一个公共邮箱并将某些电子邮件处理到数据库中 新法规要求所有带附件的邮件都经过数字签名 该进程现在仅提取一个文件 smime p7m 使用基于 GUI 的查看器 我可以查看嵌入的文件并毫无问题地提取

随机推荐

  • 2.NanoPi M1(全志H3)的GPIO控制总结(内核驱动)

    开发环境 VM Ubuntu 编译环境 linux3 4 交叉编译工具 arm linux gcc 4 4 3 GPIO内核驱动程序链接 https download csdn net download ddffyhg 11022291 用
  • ABAP DOI 下载SMW0的EXCEL和WORD模板

    用 FUNCTION SAP OI LOAD MIME DATA 下载SMW0的模板 用METHOD LR PROXY gt OPEN DOCUMENT FROM TABLE 打开模板 没找到和ole一样先下载 在打开的方法 SMWO上载模
  • 用正则表达式爬豆瓣电影数据

    学了正则表达式后 简单的用它来爬取豆瓣网的数据 import re from urllib request import urlopen def getPage url 获取网页的字符串 response urlopen url retur
  • STL_set——set::find

    Reference Returns an iterator addressing the location of an element in a set that has a key equivalent to a specified ke
  • 酷比魔方AI慧读器评测 – 实用,值,但不够智能

    转自 https post m smzdm com p ar07qo8x 前段时间在网上看到了酷比魔方AI慧读器的宣传 说是可以让孩子爱上阅读 还可以教会孩子正宗的伦敦腔英语 真的让人很好奇这是一款什么样的神奇产品 正好4月份是小侄子三岁的
  • 使用具有OpenCV和Tesseract的Raspberry Pi光学字符识别(OCR)

    了解如何使用Tesseract和OpenCV通过Raspberry Pi相机从PDF等图像中提取文本 在本教程中 我将向您展示如何使用光学字符识别通过Raspberry Pi相机和Raspberry Pi从图像中提取文本 Pi相机将捕获图像
  • CentOS6.8环境下,通过docker创建Anaconda3容器的基础使用

    目录 一 主要步骤 1 查找docker里评分最高的Anaconda 2 拉取下来 3 运行Anaconda虚拟容器 并挂载 4 进入容器后 创建虚拟环境 5 进入虚拟环境 6 进入虚拟环境后 就可以下载自己所需要的第三方库了 7 执行相关
  • 图形图像学习随笔:计算机图形学的一些基本概念

    本文内容摘抄于 计算机图形学的概念 一 计算机图形学的范畴 1 图形主要分为两类 一类是基于线条信息表示的 如工程图 等高线地形图 曲面的线框图等 另一类是明暗图 也就是通常所说的真实感图形 2 计算机图形学利用计算机建立图形所描述的场景和
  • Django小结02

    1 数据库设置 1 打开myproject settings py 配置mysql数据库 需要添加密码 默认端口3306 在myproject init py中 import pymysql pymysql install as MySQL
  • 自动化Playwright专题汇总

    文章目录 序言 一 特性 1 测试和自动化框架 2 支持所有主流浏览器 3 快速可靠的执行 4 强大的自动化功能 5 自动化工具对比 在这里插入图片描述 https img blog csdnimg cn 97189e12b617477a8
  • 多线程爬取百度关键字结果,并获取真实url

    项目目的 练习 项目要求 根据给定的关键字 检索百度的结果 将结果保存到文件中 遇到问题 1 python list取值问题 有些看不清晰的 用for index item in enumerate array 查看 2 选取想要的元素 两
  • Linux系统磁盘扩容

    本机为CentOS7 9 在虚拟机环境下给Linux系统磁盘扩容 直接添加硬盘无法使用 还需要在系统内部有磁盘挂载操作 给虚拟机添加磁盘 查看系统盘分区类型 root Para110 fdisk dev sda 列出系统分区 欢迎使用 fd
  • springboot框架主要用来做什么?

    Spring Boot是一个开源的Java框架 主要用于简化和加速基于Java的应用程序的开发 它提供了一套开发工具和约定 使得构建独立 可执行的 生产级别的Spring应用变得更加容易 Spring Boot的主要目标是简化Spring应
  • 华夏相机/臻识相机车牌识别器同LED屏幕语音对接以及javaDemo

    上篇文章说过在本地买的华夏相机T83因为当地的销售人员只懂安装 一点技术支持也给不了 导致语音 屏幕 均不能实现自己想要的功能 自定义修改文字 语音播放余额等 经过自己进一步的研究发现 这个led屏幕和语音只需要自己买一块几十块的主板更换上
  • java类总结_Java类的高级用法总结

    马上就要进入10月中旬了 距离开学已经过去整整一个半月了 想想大四的学长学姐们的忙碌的生活 我似乎也感受到了他们内心的躁动 但要淡定 学东西就是要沉住气 今天先来梳理梳理Java类的高级用法 主要内容 1 final关键字 2 抽象方法及抽
  • Maven手动安装ojdbc7.jar

    这篇文章介绍了Springboot项目中通过maven引入与安装外部jar的方法与踩坑 因为版权原因 oracle的ojdbc jar 无法直接从maven 的中央仓库下载 需要手动进行下载安装 下载后选择一个指定位置 我这边选择 opt
  • matplotlib 直方图绘制详解

    n bins patches plt hist datasets bins normed False facecolor None alpha None 函数说明 用于绘制多个数据集datasets的直方图 主要形参 datasets 数据
  • GD32+ADC+DMA定时采集+acs712霍尔电流传感器

    GD32 ADC DMA定时采集 acs712霍尔电流传感器 目的 本文使用定时器定时触发adc采样 并且通过dma搬运数据 环境 KEIL GD32F107vct6 ADC01 IN5 PA5 TIMER3 CH3 时钟初始化 rcu p
  • js 实现左右移动

    底部工具栏左右控制js author tangw 2010 11 07 var RL RL defCount 6 arWindow startIndex 0 endIndex 5 currShowW up function 向上 var l
  • rsa2加解密及签名校验

    非对称加解密 第一种用法 私钥签名 公钥验签 用于签名 第二种用法 公钥加密 私钥解密 用于加解密 class Rsa2Controller extends Controller 第一种应用 验签 私钥加密 公钥验签 return stri