Rsa 加密和解密

2023-11-13

<?php

namespace Rsa;

use Rsa\XRsa;

if (!function_exists('url_safe_base64_encode')) {

    function url_safe_base64_encode($data) {
        $data = base64_encode($data);
        // $data = str_replace(array('+', '/', '='), array('-', '_', ''), $data);
        return $data;
    }

}

if (!function_exists('url_safe_base64_decode')) {

    function url_safe_base64_decode($data) {
        $data = str_replace(array('-', '_'), array('+', '/'), $data);
        $mod4 = strlen($data) % 4;
        if ($mod4) {
            $data .= substr('====', $mod4);
        }
        return base64_decode($data);
    }

}

/**
 *
 * Rsa 加密和解密
 */
class XRsa {

    const CHAR_SET = "UTF-8";
    const RSA_ALGORITHM_KEY_TYPE = OPENSSL_KEYTYPE_RSA;
    const RSA_ALGORITHM_SIGN = OPENSSL_ALGO_SHA1;

    protected $public_key;
    protected $private_key;
    protected $key_len;

    public function __construct($pub_key, $pri_key = null) {
        $this->public_key = $pub_key;
        $this->private_key = $pri_key;

        $pub_id = openssl_get_publickey($this->public_key);
        $this->key_len = openssl_pkey_get_details($pub_id)['bits'];
    }

    /*
     * 创建密钥对
     */

    public static function createKeys($key_size = 2048) {
        $config = array(
            "private_key_bits" => $key_size,
            "private_key_type" => self::RSA_ALGORITHM_KEY_TYPE,
        );
        $res = openssl_pkey_new($config);
        openssl_pkey_export($res, $private_key);
        $public_key_detail = openssl_pkey_get_details($res);
        $public_key = $public_key_detail["key"];

        return [
            "public_key" => $public_key,
            "private_key" => $private_key,
        ];
    }

    /*
     * 公钥加密
     */

    public function publicEncrypt($data) {
        $encrypted = '';
        $part_len = $this->key_len / 8 - 11;
        $parts = str_split($data, $part_len);
        foreach ($parts as $part) {
            $encrypted_temp = '';
            openssl_public_encrypt($part, $encrypted_temp, $this->public_key);
            $encrypted .= $encrypted_temp;
        }
        $encrypted = url_safe_base64_encode($encrypted);
        return $encrypted;
    }

    /*
     * 公钥加密
     */

    public function publicEncrypt2($data) {
        openssl_public_encrypt($data, $encrypted, $this->public_key);
        $encrypted = url_safe_base64_encode($encrypted);
        return $encrypted;
    }

    /*
     * 私钥解密
     */

    public function privateDecrypt($encrypted) {
        $decrypted = "";
        $part_len = $this->key_len / 8;
        $base64_decoded = url_safe_base64_decode($encrypted);
        $parts = str_split($base64_decoded, $part_len);
        foreach ($parts as $part) {
            $decrypted_temp = '';
            openssl_private_decrypt($part, $decrypted_temp, $this->private_key);
            $decrypted .= $decrypted_temp;
        }
        return $decrypted;
    }


    /*
     * 私钥加密
     */
    public function privateEncrypt($data) {
        $encrypted = '';
        $part_len = $this->key_len / 8 - 11;
        $parts = str_split($data, $part_len);
        foreach ($parts as $part) {
            $encrypted_temp = '';
            openssl_private_encrypt($part, $encrypted_temp, $this->private_key);
            $encrypted .= $encrypted_temp;
        }
        return url_safe_base64_encode($encrypted);
    }

    /*
     * 私钥加密
     */

    private function privateEncrypt2($data) {
        openssl_private_encrypt($data, $encrypted, $this->private_key);
        $encrypted = base64_encode($encrypted);
        return $encrypted;
    }

    /*
     * 公钥解密
     */

    public function publicDecrypt($encrypted) {
        $decrypted = "";
        $part_len = $this->key_len / 8;
        $base64_decoded = url_safe_base64_decode($encrypted);
        $parts = str_split($base64_decoded, $part_len);
        foreach ($parts as $part) {
            $decrypted_temp = '';
            openssl_public_decrypt($part, $decrypted_temp, $this->public_key);
            $decrypted .= $decrypted_temp;
        }
        return $decrypted;
    }

    /*
     * 数据加签
     */

    public function sign($data) {
        openssl_sign($data, $sign, $this->private_key, self::RSA_ALGORITHM_SIGN);
        return url_safe_base64_encode($sign);
    }

    /*
     * 数据签名验证
     */

    public function verify($data, $sign) {
        $pub_id = openssl_get_publickey($this->public_key);
        $res = openssl_verify($data, url_safe_base64_decode($sign), $pub_id, self::RSA_ALGORITHM_SIGN);
        openssl_free_key($pub_id);
        return $res;
    }

}

调用案例:

 #声明rsa实例化   
 public function __construct() {
        $this->rsa = new XRsa($this->pub_key, $this->pri_key);
    }
    /*
     * 报文签名
     */

    private function get_sign($param = array()) {
        $arg = "channelCode=" . $param['channelCode'] . "&";
        $arg .= "data=" . $param['data'] . "&";
        $arg .= "timeStamp=" . $param['timeStamp'] . "&";
        $arg .= "serviceName=" . $param['serviceName'];
        $arg = $this->rsa->sign($arg);
        return $arg;
    }

   //构建数组
    public function getInsuranceFiles_test() {
        $data = '{"idCardType":"CER","idCardNumber":"440722196908030521","customerName":"黄丽珠"}';
        $timeStamp = time();
        //私钥加密
        $data = $this->rsa->privateEncrypt($data);
        $param['channelCode'] = "CCB";
        $param['serviceName'] = "getInsuranceFiles";
        $param['timeStamp'] = (string) $timeStamp;
        $param['data'] = $data;
        //加签名
        $sign = $this->get_sign($param);
        $param['sign'] = $sign;
        $r = json_encode($param);
        $r = trim(str_replace("null", '""', $r), "\n");
        echo $r;
        exit();
    }

 

{"channelCode":"CCB","serviceName":"getInsuranceFiles","timeStamp":"1586244470","data":"NrOo1SwFzdqle33VaPloAAXiu7kBNmTy5kzVAKoh5kHMVyqkQ04RxI5bF7mFZ6TViNCwUOkNINrQxPfnWXeAGclSN4j0Iy6E\/TJ4hCQpL8UjFgicgSW7LtuRUFfU0sSy5lRieq96XimCPLpv+Wo3yTdfIpCKmzerDBJKrFczhr\/biqwSay16d1k6c5rzbLT2535lk1VitNIm+xm9MaEz\/fFEqx54UOpJ4zFaxYOVLwkjTY0E9mrShm0O\/aLv3T2SrgUlfizxRJ9Rcg1bJzeg+41YVM9w9KFQwiDSE1IQol390bC1PWnN68Ui6hcKSbuyKfzJ2BoVxB+NGrGxB\/\/uwg==","sign":"Unoee2wiV+raS9u2tDpYBpAA02jkpOB5Edzod96I\/2S7PVwBjqH6+fQCzEORy063OHGrCfbtcWA5uwKGsNf3a4hBjFFS7y0HK5RXcfUmG\/sUzFF6Jh9TOhthOyytBAbl\/jwAhQ3v4\/4cFaFDGSOE91yA9j0Eild4KtLGrQudkxaveXWG6NoA5G7CX\/CKTmFryFIQcN\/xOdjv3LLATGNJr1kQLvGOjgbxVuwEJ137LpuIo6xlA2G5YqpfXbBLHw\/bH1R+LUtDGsfb+K7Kox8872rZEn\/NXM\/NpxiJ+ptUpAaPH\/Upnqg7kYPCPrQZfYujPx77GgYkLml\/wS1ym9bdCw=="}

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

Rsa 加密和解密 的相关文章

  • 使用 crypt() 加密

    我目前正在做一个非常安全的登录系统 但我是 crypt 函数的新手 需要一些快速帮助 我在注册过程中使用 crypt 加密密码字符串并将其保存到数据库中 但是 我如何在登录过程中解密密钥 或者我应该怎么做 或者是否可以对提交的密码字符串进行
  • 克隆和引用传递问题

    所以在过去的几天里 我一直在绞尽脑汁地试图让一个类能够正确克隆 问题是克隆不会删除 重做任何引用传递 结果是 主数据对象仍然作为引用传递 从而完全抵消了克隆的效果 这是问题的简化版本 class my class private data
  • 如何修复 Laravel 中未找到的“PDF”类

    在我的 Laravel 应用程序中遇到以下错误 CollaboPDFController php 第 14 行中的 FatalErrorException 未找到 PDF 类 这是我的ColaboPDFController php
  • 在Windows上安装php Composer时出现错误

    在安装 Composer 以使用 Laravel 框架时 我遇到了一些错误 Download failed file get contents SSL operation failed with code 1 OpenSSL Error m
  • 使用php在html页面中显示bbcode

    我已经有一个 bbcode 字符串 mybbcode b Hello word b 使用 php 我想在 html 页面中以 html 格式显示它 例如 div gt b hello word b div 基本上其他人已经对你说过了 但是如
  • 如何使用 php imap 将邮件消息移动到文件夹

    我似乎无法将邮件移至已保存的文件夹 这是我的代码 mbox imap open mail server mail port mail folder mail username mail password or die Error openi
  • 重定向而不是 404 错误页面 - 状态代码不起作用 (Nginx)

    我目前正在迁移到 nginx 服务器 我尝试将其放入名为的 404 ErrorDocument 中404 php 如果我现在尝试访问http mydomain com 404 php 这按预期工作 它将我重定向到 Google 但是一旦我尝
  • 知道何时调用 persist

    我正在使用 Doctrine 2 作为我的 ORM 一切进展顺利 但我一直想知道EntityManager persist 方法 这 持久实体 https www doctrine project org projects doctrine
  • 从目录中读取所有文件内容 - php

    这实际上是一个简单的任务 我想显示指定文件夹中所有文件的内容 我正在传递目录名称 echo a href row qname a 在第二页上 我正在迭代目录内容 while entryname readdir myDirectory if
  • $_REQUEST、$_GET、$_POST 哪一个最快?

    这些代码中哪一个会更快 temp REQUEST s or if isset GET s temp GET s else temp POST s REQUEST http php net manual en reserved variabl
  • PHP 从日志事件中获取行号

    好的 我还有一个问题HERE https stackoverflow com questions 3213423 php how could i make this class better suggestions feedback wel
  • 限制分页页数

    objConnect mysql connect localhost root or die mysql error objDB mysql select db Test strSQL SELECT FROM UserAddedRecord
  • 根据类别 woocommerce 更改同一产品的默认变体值

    我正在研究一种根据其所属类别显示同一产品的默认变体值的方法 例如 我出售一张带有蓝色和红色选项的卡 当用户进入 一 类别时 我希望默认值为蓝色 如果他属于第二类 则该值将为红色 我发现了一个钩子woocommerce product def
  • Laravel 上传前如何压缩图像?

    我正在制作一个图片库网站 用户可以在其中上传任何图像 它们将显示在前端 我需要在不影响图像质量的情况下压缩图像 以减小图像大小 以便页面加载速度不会影响那么大 我使用以下代码来上传图像 rules array file gt require
  • PHP 负面因素不断增加

    我这里有这个代码 remaining 0 foreach clientArrayInvoice as key gt row remaining remaining row total 它的作用是 它获取总计值并将它们相加 但是当我有负值时
  • 我应该使用排队系统来处理付款吗?

    我在用着Slim https www slimframework com和这个结合Stripe 的 PHP 库 https stripe com docs api php在我的应用程序中处理付款 一切都很好 但是直到最近 我在我的系统中发现
  • SVG 转 JPG / PNG

    有没有工作模块可以convert a SVG image into像素格式如JPEG or PNG 看看蜡染工具包 具体来说是光栅化器 http xmlgraphics apache org batik tools rasterizer h
  • 如何检查一个值是否已经存在以避免重复?

    我有一个 URL 表 但我不想要任何重复的 URL 如何使用 PHP MySQL 检查给定 URL 是否已在表中 如果您不想重复 可以执行以下操作 添加唯一性约束 use REPLACE http dev mysql com doc ref
  • 连接 3 三张表

    我有这个图表应该可以解释我的情况 我需要一些关于连接 3 个表的帮助 我不知道如何做这种事情 因此 我可以通过执行以下操作来经历一段检索记录的 while 循环 img src alt Album AlbumID 使用内部联接 http w
  • 如何更改phpmyadmin MySQL的IP地址?

    我在 xampp 中更改了 apache 的 IP 地址 但无法连接到 MySQL 我认为问题是我的 apache 不在我的数据库的同一网络上 我的 apache 位于 192 168 1 10 而我的 MySQL 位于 127 0 0 1

随机推荐

  • Spring中对于@RequestBody的参数解析问题

    文章目录 问题起源 问题延伸 代码实现 前置准备阶段 选择解决方案 如何自定义Resolver 处理类型 如何自定义HttpMessageConverter 思考总结 问题起源 今天后端与前端同事在讨论对于只有一个参数的接口 能否不将参数当
  • Linux文件系统简单认识学习笔记

    Linux文件系统简单认识 ReadMe 1 什么是文件系统 2 文件系统 文件管理系统的方法 的种类有哪些 3 什么是分区 4 什么是文件系统目录结构 5 什么虚拟文件系统Virtual File System 6 虚拟文件系统有什么作用
  • C语言头文件和源文件差异,#include两种引用方式差异

    一些初学c语言的人 不知道头文件 h文件 原来还可以自己写的 只知道调用系统库函数时 要使用 include语句将某些头文件包含进去 其实 头文件跟 c文件一样 是可以自己写的 头文件是一种文本文件 使用文本编辑器将代码编写好之后 以扩展名
  • Java将一个List中的值赋值给另一个List

    刷leetcode中的一道dfs题时 添加结果集时如果不新创建list所有添加的list都是同一个 并且回溯得到时候会删掉所有元素 Java中 的作用有两个 1 赋值 2 指向地址 当对基本数据类型进行赋值时 的作用就是单纯的赋值 例如 i
  • 使用zabbix监控avamar【一】

    1 介绍 avamar是dell的一款数据备份产品 用于公司私有云平台虚拟机备份 虽然不是与业务直接相关 关注度不是特别高 也正因为如此偶尔出现备份失败问题不能及时发现 所以要加入公司的智慧运维系统 以zabbix为底层开发 2 选择模式
  • 变分推断的数学推导

    这里只给出变分推断的数学推导 变分颇为高深 这里只是简单介绍一下基本概念 想了解更多详见 https blog csdn net weixin 40255337 article details 83088786 变分推断的目的是构造 q w
  • seaborn可视化库分析库基础01 - 布局、参数、色板等

    Seaborn库简介 Seaborn库官网 正如你所知道的 Seaborn是比Matplotlib更高级的免费库 特别地以数据可视化为目标 但他要比这一切更进一步 他解决了用Matplotlib的2个最大问题 正如Michael Wasko
  • windows中将sqlmap添加到环境变量中

    在windows下每次使用sqlmap进行sql注入测试时 都要先进到sqlmap py的目录中 然后执行python sqlmap py url 而作为未来的渗透大佬 怎么能够允许这么low的事情出现 1 添加环境变量 电脑右键属性 高级
  • 【读书笔记】周志华 机器学习 第六章 支持向量机

    第六章 支持向量机 1 间隔和支持向量 2 核函数 3 软间隔和正则化 4 参考文献 1 间隔和支持向量 对上图所示的数据集 有多个超平面可以划分 直观上来说 最中间加粗的那个超平面是最好的 因为离两类数据都比较远 离两类数据都比较远 的好
  • 2020-01-03

    注册 登陆 当进入一个网站时首先进行注册 注册时会提示输入手机号 利用阿里大鱼接口发送一条短信验证码到当前号码并将短信验证码保存到redis 注册时会提示输入邮箱账号 当点击注册时会给当前邮箱发送一条激活码给用户激活 注册成功后会跳转到登陆
  • Netty4之编解码

    本文是基于Netty4 1 x 一般在使用Netty作为网络框架进行开发时 编解码框架是我们应该注意的一个重要部分 应用从网络层接收数据需要经过解码 Decode 将二进制的数据报转换从应用层的协议消息 这样才能被应用逻辑所识别 同样 客户
  • html标题、段落、换行与字符实体

    html标题 通过 h1 h2 h3 h4 h5 h6 标签可以在网页上定义6种级别的标题 6种级别的标题表示文档的6级目录层级关系 比如说 h1 用作主标题 最重要的 其后是 h2 次重要的 再其次是 h3 以此类推 搜索引擎会使用标题将
  • 虚拟数字人类型的形象分为四种

    虚拟人应用类型 虚拟人根据应用场景分为四种 1 虚拟偶像 打造粉丝经济 受到品牌青睐 爱奇艺今年以虚拟偶像新艺打的综艺 跨次元新星 B站推出的跨人团体VirtuaRealReal参加上海时装周 将虚拟与现实连接 拓展多元化应用场景 创造更多
  • UE4官方文档链接记录

    创建并使用自定义高度图和图层 https docs unrealengine com latest CHN Engine Landscape Custom index html 点击打开链接 自发光材质照亮场景 https docs unr
  • 基于 React 和 Redux 开发一个任务管理应用,支持添加任务、编辑任务、完成任务和删除任务等功能

    以下是一个基于 React 和 Redux 的任务管理应用的简单实现 支持添加任务 编辑任务 完成任务和删除任务等功能 javascript import React useState from react import createSto
  • 数字信号处理2-截止频率

    截止频率 2013 10 07 23 50 04 转载 在物理学和电机工程学中 一个系统的输出信号的能量通常随输入信号的频率发生变化 频率响应 截止频率 英语 Cutoff frequency 1 是指一个系统的输出信号能量开始大幅下降 在
  • 学习python爬虫看一篇就足够了之爬取《太平洋汽车》论坛及点评实战爬虫大全

    前言 这也是一篇毕业论文的数据爬虫 我第一次看见 太平洋汽车 的点评信息时 检查它的网页元素 发现并没有像 汽车之家 那样的字体反爬技术 所以就初步判断它没有很强的反爬虫技术 大不了就使用selenium库自动化实现爬虫呗 但是我确因为这样
  • 电脑如何查看及开启虚拟化

    什么是虚拟化 Intel Virtualization Technology就是以前众所周知的 Vanderpool 技术 简称VT 中文译为虚拟化技术 这种技术可以让一个CPU工作起来就像多个CPU并行运行 从而使得在一部电脑内同时运行多
  • 华为OD机试 - 最小循环子数组(Python)

    题目描述 给定一个由若干整数组成的数组nums 请检查数组是否是由某个子数组重复循环拼接而成 请输出这个最小的子数组 输入描述 第一行输入数组中元素个数n 1 n 100000 第二行输入数组的数字序列nums 以空格分割 0 nums i
  • Rsa 加密和解密