go-ext-sm2国密PHP扩展 密文指定排序、识别ans1编码等功能

go-ext-sm2

介绍

基于go-gmsm静态库编写的SM2椭圆曲线公钥密码算法PHP扩展
相较于openssl-ext-sm2编译更方便
增加了密文指定排序、识别ans1编码等功能

特性:非对称加密

git地址:https://gitee.com/state-secret-series/go-ext-sm2.git

软件架构

zend 常规PHP扩展结构

依赖要求

1,包内在lib文件目录下已包含了mac、liunx编译后的gosm2静态库,自动加载对应环境的静态库,可直接编译

2,编译时注意使用make clean时会把编译好的静态库删除

3,如静态库在编译时不可用、请手动编译go-gogmsm库,完成后放到对应环境的目录下 地址:https://gitee.com/state-secret-series/go-gmsm.git

安装教程

解压进入openssl-ext-sm2目录

cd go-ext-sm2
phpize

检查依赖

./configure --with-php-config=/www/server/php/*你的版本*/bin/php-config

检查结果

[root@6309fccb9e17 go-ext-sm2]# ./configure --with-php-config=/www/server/php/74/bin/php-config
checking for grep that handles long lines and -e... /usr/bin/grep
checking for egrep... /usr/bin/grep -E
checking for a sed that does not truncate output... /usr/bin/sed
checking for pkg-config... /usr/bin/pkg-config
checking pkg-config is at least version 0.9.0... yes
checking for cc... cc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables... 
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether the compiler supports GNU C... yes
checking whether cc accepts -g... yes
checking for cc option to enable C11 features... -std=gnu11
checking how to run the C preprocessor... cc -std=gnu11 -E
checking for egrep -e... (cached) /usr/bin/grep -E
checking for icc... no
checking for suncc... no
checking for system library directory... lib
checking if compiler supports -R... no
checking if compiler supports -Wl,-rpath,... yes
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking target system type... x86_64-pc-linux-gnu
checking for PHP prefix... /www/server/php/74
checking for PHP includes... -I/www/server/php/74/include/php -I/www/server/php/74/include/php/main -I/www/server/php/74/include/php/TSRM -I/www/server/php/74/include/php/Zend -I/www/server/php/74/include/php/ext -I/www/server/php/74/include/php/ext/date/lib
checking for PHP extension directory... /www/server/php/74/lib/php/extensions/no-debug-non-zts-20190902
checking for PHP installed headers prefix... /www/server/php/74/include/php
checking if debug is enabled... no
checking if zts is enabled... no
checking for gawk... gawk
checking whether to enable go_sm2 support... yes, shared
checking for gcc... (cached) cc
checking whether the compiler supports GNU C... (cached) yes
checking whether cc accepts -g... (cached) yes
checking for cc option to enable C11 features... (cached) -std=gnu11
checking whether cc -std=gnu11 supports C99... yes
checking for macOS... no
checking for a sed that does not truncate output... /usr/bin/sed
checking for ld used by cc -std=gnu11... /usr/bin/ld
checking if the linker (/usr/bin/ld) is GNU ld... yes
checking for /usr/bin/ld option to reload object files... -r
checking for BSD-compatible nm... /usr/bin/nm -B
checking whether ln -s works... yes
checking how to recognize dependent libraries... pass_all
checking for stdio.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for strings.h... yes
checking for sys/stat.h... yes
checking for sys/types.h... yes
checking for unistd.h... yes
checking for dlfcn.h... yes
checking the maximum length of command line arguments... 1572864
checking command to parse /usr/bin/nm -B output from cc -std=gnu11 object... ok
checking for objdir... .libs
checking for ar... ar
checking for ranlib... ranlib
checking for strip... strip
checking if cc -std=gnu11 supports -fno-rtti -fno-exceptions... no
checking for cc -std=gnu11 option to produce PIC... -fPIC
checking if cc -std=gnu11 PIC flag -fPIC works... yes
checking if cc -std=gnu11 static flag -static works... no
checking if cc -std=gnu11 supports -c -o file.o... yes
checking whether the cc -std=gnu11 linker (/usr/bin/ld -m elf_x86_64) supports shared libraries... yes
checking whether -lc should be explicitly linked in... no
checking dynamic linker characteristics... GNU/Linux ld.so
checking how to hardcode library paths into programs... immediate
checking whether stripping libraries is possible... yes
checking if libtool supports shared libraries... yes
checking whether to build shared libraries... yes
checking whether to build static libraries... nocreating libtool
appending configuration tag "CXX" to libtool
configure: patching config.h.in
configure: creating ./config.status
config.status: creating config.h
config.status: config.h is unchanged

安装编译

make&&make install

修改php.ini

extension="go_sm2.so"

重启php-fpm或者apache

使用说明

全局定义常量

非ans1加密
GO_SM2_MODE_DEFAULT 
结果ans1加密
GO_SM2_MODE_ASN1密文排列顺序
老规则
GO_SM2_ORDER_C1C2C3
新规则
GO_SM2_ORDER_C1C3C2
  1. 创建公钥和私钥
$pub_key 取地址 结果为二进制
$pri_key 结果为二进制$key_pair=go_sm2_key_pair();
dump($key_pair);array:3 ["code" => 200"msg" => "Key generation successful!""data" => array:2 ["publicKey" =>二进制"privateKey" =>二进制]
]返回值code int 200 成功 其他状态失败
  1. 签名
$msg 信息
$pri_key 私钥 二进制
$mode 签名返回模式 默认 GO_SM2_MODE_DEFAULT
$iv userid 默认为1234567812345678 可不传
返回 GO_SM2_MODE_DEFAULT r,s 拼接的642进制
返回 GO_SM2_MODE_ANS1 r,s 编码的30开头的2进制
$sign=go_sm2_sign($msg, $pri_key)array:3 ["code" => 200"msg" => "Key generation successful!""data" => array:1 ["signature" => 二进制]
]
//转成hex16进制$iv='1224222232424333';
$sign=go_sm2_sign($msg,$pri_key,GO_SM2_MODE_ANS1)$sign=go_sm2_sign($msg, $pri_key,GO_SM2_MODE_ANS1,$iv);返回值code int 200 成功 其他状态失败
  1. 验签 自动识别是否是ans1 无需传mode
$msg 信息
$signature 输入签名结果
$pub_key 公钥 二进制
$iv userid 默认为1234567812345678go_sm2_verify($msg, $pub_key,$signature)go_sm2_verify($msg, $pub_key,$signature,$iv);返回值code int 200 成功 其他状态失败
  1. 公钥加密
$msg 信息
$encrypt 输出加密结果 二进制 
$pub_key 公钥 二进制
$order 排序方式 默认C1C3C2
$mode  是否ans1编码 默认不编码$encrypt=go_sm2_encrypt($msg, $pub_key);$encrypt=go_sm2_encrypt($msg, $pub_key,GO_SM2_ORDER_C1C2C3);$encrypt=go_sm2_encrypt($msg, $pub_key,GO_SM2_ORDER_C1C2C3,GO_SM2_MODE_ASN1);返回值code int 200 成功 其他状态失败
  1. 私钥解密 自动识别ans1编码格式的密文
$encrypt 加密信息 二进制
$string 输出结果 明文
$pri_key 私钥
$order 排序方式 默认C1C3C2go_sm2_decrypt($encrypt, $string, $pri_key);
go_sm2_decrypt($encrypt, $string, $pri_key,GO_SM2_ORDER_C1C2C3);返回值code int 200 成功 其他状态失败
  1. 演示
$key_pair = go_sm2_key_pair();if ($key_pair['code'] != 200) {echo '生成钥匙对失败:' . $key_pair['msg'] . PHP_EOL;exit;
}
$msg     = "这是测试";
$pub_key = $key_pair['data']['publicKey'];
$pri_key = $key_pair['data']['privateKey'];
echo '公钥:' . bin2hex($pub_key) . PHP_EOL;
echo '私钥:', bin2hex($pri_key) . PHP_EOL;
$sign = go_sm2_sign($msg, $pri_key);
if ($sign['code'] != 200) {echo '签名失败:' . $sign['msg'] . PHP_EOL;exit;
}
echo '签名:' . bin2hex($sign['data']['signature']) . PHP_EOL;$res = go_sm2_verify($msg, $pub_key, $sign['data']['signature']);
if ($res['code'] != 200) {echo '验签失败:' . $res['msg'] . PHP_EOL;exit;
}
echo '验签:' . $res['msg'] . PHP_EOL;$encrypt = go_sm2_encrypt($msg, $pub_key);
if ($encrypt['code'] != 200) {echo '加密失败:' . $encrypt['msg'] . PHP_EOL;exit;
}
echo '密文:' . bin2hex($encrypt['data']['ciphertext']) . PHP_EOL;$decrypt = go_sm2_decrypt($pri_key, $encrypt['data']['ciphertext']);
if ($decrypt['code'] != 200) {echo '解密失败:' . $encrypt['msg'] . PHP_EOL;exit;
}
echo '明文:' . $decrypt['data']['plaintext'] . PHP_EOL;

输出结果

公钥:0460fda1fe45d5dfcb84c7b7f4199ebca7bff423c7f1ca1eeb2e2abc1a004df3cd22aab950e476eef30fcff54ee0404d6fea09979a23bc9ee5dd883b05863f2f92
私钥:81905b16e44b267d6a179c5a09774cd698f8eac168f4429d793eb89931e9e7d0
签名:58cc705f11aef46db6469eefff2c26be386cc697d9f6d283f740ef3a116adb38a0a3e6a5e71afc9cd05973723678f25f339c1e38cdccb886e85dfb2a5c8795d9
验签:message verify successful!
密文:0427f56b468097cd763ac108079abb8e7b750d628fbc53c286c21270947e5885eda79451ba6416ebd8dcb4dee70c4e80cfc16971694b5d717ceab88def2d6586b98179419cfcf534bba12767540fc765e0b04a3576fba2cff67b5fe410b98c90672a98761f17e4725d4cde7
明文:这是测试

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

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

相关文章

该让医疗垂类大模型,走出“试题”了

图源:123rf “现阶段,许多医疗垂类大模型就是伪命题,推理能力不行。” 一位观望大模型已久的医疗从业者玄彬(化名)发出了极为尖锐的批评。 在他看来,目前人工智能是靠scaling law涌现的,模型性…

【Icon】矢量图、小图标、logo、资源网站,免费获取

要获取汽车和轮船的UI小图标、矢量图,可以访问以下一些网站,这些网站提供了丰富的图标和矢量图资源,适用于各种设计需求: 1. Flaticon 网站地址:https://www.flaticon.com/ 特点:Flaticon是一个与FreePik同一家公司的网站,专门为设计师找寻免费素材。它提供了大量高质…

【前端】使用chrom浏览器Network,查看前后台数据传输请求

使用chrom浏览器Network查看前后台数据传输请求 写在最前面查看前后台数据传输请求① 首先,打开开发者工具(F12)打开控制台,切换到Network面板。Network面板右键界面copy ②清空请求log ctrle两次或者点击clear图标 案例展示&…

鸿蒙开发HarmonyOS NEXT (三) 熟悉ArkTs (上)

一、自定义组件 1、自定义组件 自定义组件,最基础的结构如下: Component struct Header {build() {} } 提取头部标题部分的代码,写成自定义组件。 1、新建ArkTs文件,把Header内容写好。 2、在需要用到的地方,导入…

html——VSCode的使用

快捷键 快速生成标签:标签名tab 保存文件:CtrlS 设置自动保存【文件】→【自动保存】 快速查看网页效果:右击→Open in Default Browser 快捷键:altb 注意:必须安装了open in brows…

转载!abap代码规范

01、在增强里面禁止显式或者隐式提交(ZILOG所在函数如果用在增强里面,不要COMMIT) 02、WAIT、异步RFC,都会触发隐式提交,所以禁止在增强内以及禁止提交的场合使用 03、FOR ALL ENTRIES一定要判断内表是否为空且尽量删除重复,SEL…

软考高级第四版备考--第13天(规划资源管理)Plan Resoure Management

定义:定义如何估算、获取、管理和利用团队以及实物资源的过程。 作用:根据项目类型和复杂程度确定适用与项目资源的管理方法和管理程度 输入:项目章程、项目管理计划(质量管理计划、范围基准)、项目文件(…

域渗透与横向渗透:获取域控制器最高权限的技术与策略

域渗透与横向渗透:获取域控制器最高权限的技术与策略 引言 域控制器是组织网络中的核心组件,负责管理用户账户、安全策略和网络资源访问。横向渗透是攻击者在内网中移动并控制更多系统的过程。获取域控制器的最高权限意味着攻击者可以对整个网络进行操…

windows10下的游戏怎么卸载?

在Windows 10中卸载游戏可以通过多种途径进行,下面是一些常见的方法: 方法一:通过“设置”应用卸载 1. 点击左下角的“开始”按钮,打开“开始”菜单。 2. 选择“设置”图标(齿轮形状)。 3. 在“设置”窗…

2024年5款最佳免费博客程序——对比和测评

多年来,我试用了许多不同的博客网站,并评估了它们在各种需求上的表现。这篇文章记录了我的发现(截至2024年),旨在帮助您为您的项目选择最佳解决方案。 我将介绍五个非常优秀的博客平台,它们让您能够轻松创建…

QTreeWidget 树遍历

在项目中遇到一个问题:需要将QString路径,做成一棵树的样式展示出来。其实倒不是说是问题,只是记录写这块儿的代码的思路 前提:我的所有的QString都是用"/"进行分割的,分割后的list中第一个元素是公共的路径…

知识改变命运 第二集:Java的数据类型与变量

数据类型与变量 1. 字面常量2. 数据类型3. 变量3.1 变量概念3.2 语法格式3.3 整型变量3.3.1 整型变量3.3.2 长整型变量3.3.3 短整型变量3.3.4 字节型变量 3.4 浮点型变量3.4.1 双精度浮点型3.4.2 单精度浮点型 3.5 字符型变量3.6 布尔型变量3.7 类型转换3.7.1 自动类型转换(隐式…

mybatilsplaus 常用注解

官网地址 baomidou注解配置

CATIA二次开发VBA入门(5)——catia文档操作vb.net程序案例,打开catia文件,进行视图操作,退出程序

目录 引出catia文档操作案例1.初始化窗体,始终置顶始终置顶方式2 2.打开文件3.视图切换4.退出5.完整代码 总结认识CATIA二次开发刘瑞欣 vb程序设计教程Excel中的vba开发catia中的vba开发 宏的录制、回放和编辑宏代码精简画圆柱阵列宏Macro文件的3种类型宏的保存&…

CSS 指南

CSS 指南 引言 CSS(层叠样式表)是网页设计和开发中不可或缺的一部分。它用于控制网页的布局和样式,使网页更加美观和易于浏览。本指南将为您提供CSS的基础知识,包括选择器、属性、值以及如何将CSS应用于HTML元素。 CSS基础 选择器 选择器是CSS中用于选择HTML元素的部分…

如何安全隐藏IP地址,防止网络攻击?

当您想在互联网上保持隐私或匿名时,您应该做的第一件事就是隐藏您的 IP 地址。您的 IP 地址很容易被追踪到您,并被用来了解您的位置。下面的文章将教您如何隐藏自己,不让任何试图跟踪您的活动的人发现。 什么是 IP 地址? 首先&am…

Apache Flink核心特性应用场景

Flink的定义 Apache Flink是一个分布式处理引擎,用于处理 无边界数据流, 有边界数据流上金秀贤有状态的计算。Flink能在所有常见的集群环境中运行,并能以内存速度和任意规模进行计算如下Flink官网的一张图 Flink 与Spark的区别 Flink 中处…

keep-alive缓存组件

keep-alive缓存组件是Vue.js中的一个特殊组件&#xff0c;主要用于缓存内部组件的数据状态&#xff0c;以提高应用的性能和用户体验。以下是关于keep-alive缓存组件的详细解析&#xff1a; 一、作用 缓存组件状态&#xff1a;当组件在<keep-alive>内部切换时&#xff0…

白盒测试的概念、特点、应用阶段、实施流程、现状与前景

文章目录 前言一、白盒测试的应用阶段二、白盒测试的特点三、白盒测试的流程四、白盒测试的现状与前景总结 前言 白盒测试&#xff08;White Box Testing&#xff09;&#xff0c;又称为结构测试&#xff08;Structural Testing&#xff09;、透明盒测试&#xff08;Glass Box…

Riscv 调试系统的合规测试

Riscv debug release框图 仿真环境下的Riscv debug框图 平头哥调试环境 XuanTie DebugServer是一个调试代理软件&#xff0c;它通过CKLINK&#xff0c;以JTAG的方式连接目标板&#xff0c;并支持“GDB Remote Protocol” 。开发者可以通过GDB对运行在玄铁800系列和玄铁900系列处…