基于go-gmsm静态库编写的SM2椭圆曲线公钥密码算法PHP扩展 相较于openssl-ext-sm2编译更方便 增加了密文指定排序、识别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... no

creating 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 默认为1234567812345678

go_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 排序方式 默认C1C3C2

go_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.mfbz.cn/a/782357.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows环境安装Redis和Redis Desktop Manager图文详解教程

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl Redis概述 Redis是一个开源的高性能键值对数据库,以其卓越的读写速度而著称,广泛用于数据库、缓存和消息代理。它主要将数据存储在内存中&#xff0…

CISC和RISC指令集

文章目录 1. 指令集 2. CISC(复杂指令集计算) 3. RISC(精简指令集计算) 4. RISC的设计初衷 5. CISC和RISC流程对比 CISC(复杂指令集计算)的实现 RISC(精简指令集计算)的实现 …

【高中数学之函数】四种幂函数图线(二次、三次、开方、开立方)

【图像】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>UNASSIGNED</title><style type"text/css">.c…

【智能算法应用】灰狼算法求解二维栅格路径规划问题

目录 1.算法原理2.二维路径规划数学模型3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】灰狼算法&#xff08;GWO&#xff09;原理及实现 2.二维路径规划数学模型 栅格法模型最早由 W.E. Howden 于 1968 年提出&#xff0c;障碍物的栅格用黑色表示&#xff0c;可通…

基于pi控制的数字锁相环simulink建模与仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a 3.部分核心程序 &#xff08;完整版代码包含详细中文注释和操作步骤视频&#xff09…

基于MATLAB的PEF湍流风场生成器模拟与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于MATLAB的PEF湍流风场生成器模拟与仿真。PEF&#xff08;Primitive Equations Formulation&#xff09;湍流风场模型&#xff0c;是大气科学和气象学中用来描述大气流动和气…

咬文嚼字:词元是当今生成式人工智能失败的一个重要原因

生成式人工智能模型处理文本的方式与人类不同。了解它们基于"标记"的内部环境可能有助于解释它们的一些奇怪行为和顽固的局限性。从 Gemma 这样的小型设备上模型到 OpenAI 业界领先的 GPT-4o 模型&#xff0c;大多数模型都建立在一种称为转换器的架构上。由于转换器在…

subset使用

在R语言中&#xff0c;subset()函数用于从数据框中选择满足特定条件的观测。其语法如下&#xff1a; subset(x, subset, select, drop FALSE) 参数说明&#xff1a; x&#xff1a;数据框或矩阵。 subset&#xff1a;逻辑条件&#xff0c;用于筛选满足特定条件的行。 select…

Linux Bridge - Part 2

概览 在前一篇文章中&#xff0c;我描述了Linux 网桥&#xff08;bridge&#xff09;的配置&#xff0c;并展示了一个实验&#xff0c;其中使用Wireshark来分析流量。在本文中&#xff0c;我将讨论当创建一个网桥时会发生什么&#xff0c;以及Linux 网桥&#xff08;bridge&am…

给您介绍工控CAN总线

CAN是什么 CAN&#xff0c;全称Controller Area Network&#xff0c;即控制器局域网&#xff0c;是一种由Bosch公司在1983年开发的通信协议。它主要用于汽车和工业环境中的电子设备之间的通信。CAN协议定义了物理层和数据链路层的通信机制&#xff0c;使得不同的设备能够通过CA…

数据驱动的内容优化:Kompas.ai如何提升内容表现

在数字化营销时代&#xff0c;内容是企业与用户沟通的重要桥梁。然而&#xff0c;随着信息量的爆炸性增长&#xff0c;如何让内容在激烈的竞争中脱颖而出&#xff0c;成为每个营销人员面临的问题。数据驱动的内容优化策略&#xff0c;通过精准分析和科学决策&#xff0c;帮助品…

基于Java+SpringMvc+Vue技术的实验室管理系统设计与实现

博主介绍&#xff1a;硕士研究生&#xff0c;专注于信息化技术领域开发与管理&#xff0c;会使用java、标准c/c等开发语言&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架…

基于Transformer的端到端的目标检测 | 读论文

本文正在参加 人工智能创作者扶持计划 提及到计算机视觉的目标检测&#xff0c;我们一般会最先想到卷积神经网络&#xff08;CNN&#xff09;&#xff0c;因为这算是目标检测领域的开山之作了&#xff0c;在很长的一段时间里人们都折服于卷积神经网络在图像处理领域的优势&…

SQLite 嵌入式数据库

目录&#xff1a; 一、SQLite 简介二、SQLite 数据库安装1、安装方式一&#xff1a;2、安装方式二&#xff1a; 三、SQLite 的命令用法1、创建、打开、退出数据库&#xff1a;2、编辑数据库&#xff1a; 四、SQLite 的编程操作1、打开 / 创建数据库的 C 接口&#xff1a;2、操作…

欧拉函数.

性质1&#xff1a;质数n的欧拉函数为n-1. 性质2&#xff1a;如果p&#xff0c;q都是质数&#xff0c;那么ϕ ( p ∗ q ) ϕ ( p ) ∗ ϕ ( q ) ( p − 1 ) ∗ ( q − 1 ) 证明&#xff1a;p&#xff0c;2p....q*p都不与q*p互质&#xff0c;q同理&#xff0c;所以总的不互质个…

WPS+Python爬取百度之星排名

运行效果 手动拉取 https://www.matiji.net/exam/contest/contestdetail/146 如果手动查找&#xff0c;那么只能通过翻页的方式&#xff0c;每页10行&#xff08;外加一行自己&#xff09;。 爬取效果预览 本脚本爬取了个人排名和高校排名&#xff0c;可以借助WPS或MS Offi…

专业140+总分420+天津大学815信号与系统考研经验天大电子信息与通信工程,真题,大纲,参考书。

顺利上岸天津大学&#xff0c;专业课815信号与系统140&#xff0c;总分420&#xff0c;总结一些自己的复习经历&#xff0c;希望对于报考天大的同学有些许帮助&#xff0c;少走弯路&#xff0c;顺利上岸。专业课&#xff1a; 815信号与系统&#xff1a;指定教材吴大正&#xf…

缺失行处理(R和python)

R(complete.cases) rm(listls()) # 创建一个包含缺失值的数据框 # df <- data.frame( # x c(1, 2, NA, 4), # y c(NA, 2, 3, 4), # z c(1, NA, 3, 3) # ) # # # 使用complete.cases函数筛选包含缺失值的数据行 # missing_rows <- !complete.cases(df) # # # …

Vue2前端实现数据可视化大屏全局自适应 Vue实现所有页面自适应 Vue实现自适应所有屏幕

Vue自适应所有屏幕大小,目前页面自适应,尤其是数据可视化大屏的自适应更是案例很多 今天就记录一下使用Vue全局自适应各种屏幕大小的功能 在Vue.js中创建一个数据大屏,并使其能够自适应不同屏幕大小,通常涉及到布局的响应式设计、CSS媒体查询、以及利用Vue的事件系统来处理…

C++面向对象的常见面试题目(一)

1. 面向对象的三大特征 &#xff08;1&#xff09;封装&#xff1a;隐藏对象的内部状态&#xff0c;只暴露必要的接口。 #include <iostream> #include <string>// 定义一个简单的类 Person class Person { private: // 私有成员&#xff0c;外部不可直接访问std…