PHPackages                             life2016/guomi - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Security](/categories/security)
4. /
5. life2016/guomi

ActiveLibrary[Security](/categories/security)

life2016/guomi
==============

国密sm2

v1.0(1y ago)136MITPHPPHP &gt;=7.2

Since Oct 21Pushed 1y agoCompare

[ Source](https://github.com/ran1990/phpsm2sm3sm4)[ Packagist](https://packagist.org/packages/life2016/guomi)[ RSS](/packages/life2016-guomi/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependencies (1)Versions (2)Used By (0)

php sm2 sm3 sm4 国密算法整理
======================

[](#php-sm2-sm3-sm4-国密算法整理)

- 本项目支持php版本的国密sm2的签名算法，非对称加解密算法，sm3的hash， sm4的对称加解密，要求PHP７，打开gmp支持
- 目前如果服务器配套的使用的是openssl 1.1.1x， 目前到1.1.1.l(w) ，sm3，sm4都可以直接用openssl\_xxx系列函数直接实现，不必大量的代码，不支持sm2的签名，sm2的加解密
- 该版本是基于PHP-ECC,也支持其他的椭圆算法的，依赖比较多，如果只想要简单的 sm2相关的签名，加密，可以使用本版本的简化版

安装
--

[](#安装)

```
composer require life2016/guomi

```

> 请确保你升级到 `composer 2` 及以上版本。`PHP >=7.2`,打开gmp组件支持。

如需要使用php5.6 请使用wzhih童鞋fork修改的  ;

```
composer require wzhih/guomi

```

> 或是使用该项目的简化版本

使用
--

[](#使用)

### SM2

[](#sm2)

- 签名验签算法主体基于PHPECC算法架构，添加了sm2的椭圆参数，
- 参考了  童鞋的sm2验签算法，密钥生成算法
- 添加了签名算法， 支持sm2的16进制，base64公私钥的签名，验签算法
- 支持从文件中读取pem文件的签名，验签算法
- 由于 openssl没有实现sm2withsm3算法，用系统函数无法实现签名及证书的自签名分发

### SM2签名常见问题

[](#sm2签名常见问题)

- 提供的私钥是base64的短串，一般直接 bin2hex(base64\_decode(str)) 就是明文的密钥了
- 文件格式的密钥一般有pkcs1与pkcs8两个格式，本项目只支持pkcs1格式的密钥，使用前请先进行相关的转换，一般 pkcs8是四行，pkcs1是三行，区别见
- 关于签名的字符串的问题，有些项目会将原始字符串哈稀后，再对哈稀值进行签名，有些对这哈稀值又进行了hex2bin操作后再签名，请双方按约定的标准确定最后签名的数据值，双方保持一致即可
- 签名的结果是asn1(r,s)，个别的项目签名出来的只是 r+s的字符串组合，验证签名的时候注意下。 base64的签名如果以MEU开头的(hex的话是30开头)，这个是asn1的，如解开后是固定64字节（hex是 128的）是r + s 的 在src/util/SmSignFormatRS.php 有相关的转换函数，请按需使用

### SM2非对称加密

[](#sm2非对称加密)

- 添加了sm2的非对称加密的算法，但速度一般，有待优化，不能保证兼容所有语言进行加解密，目前测试了js， python的相互加解密
- sm2的加密解密算法在openssl 1.1.1的版本下自带的函数中暂无sm2的公钥私钥的加密函数，得自己实现，建议使用C，C++的算法，打包成PHP扩展的方式
- SM2的非对称加密缺省的是c1c3c2， 请使用的时候注意下，对方返回的是c1c3c2还是c1c2c3，进行相应的修改更新,还有一点就是本项目中c1前面没有04， 视对接方的需求，看是否添加\\x04, v1.0.6版已对c1c3c2还是c1c2c3做了兼容，缺省是c1c3c2,添加相应的modetype后可以兼容两种模式，使用方法见 test/tsm2\_encrypt.php
- 如对方sm2非对称加密生成的不是c1c3c2 而是 asn1(c1x,c1y,c3,c2), 目前本项目不支持这种样式的，请先asn1解开后，拼接成 C1C3C2的形式后再调用解密函数，否则会报椭圆不匹配错误, 请自行处理

### 关于数据格式

[](#关于数据格式)

- sm2的缺省返回是asn1(r,s)的base64字符串
- sm2的非对称加密返回的是 c1c3c2的hex字符串
- sm3缺省hex的字符串
- sm4缺省也是hex的字符串
- 在于其他语言互通的时候请自行统一格式，以免因为格式的问题而造成运算不成功

### SM3

[](#sm3)

- 该算法直接使用  中sm2签名用到的匹配sm3， 未做修改
- 也可使用 openssl的函数， 详见openssl\_tsm3.php
- hmac-sm3,这个算法与hmac-sha256在hmac的算法是一样的，只是hash的算法不一样，一个是sm3,一个sha256, 没有什么特殊的注意的地方

### SM4

[](#sm4)

- 该算法直接封装使用  的sm4算法， 同时该项目支持 sm3,sm4 ，可以composer安装
- 由于sm4-ecb， sm4-cbc加密需要补齐，项目lizhichao/sm项目未做补齐操作，这里封装的时候，针对这两个算法做了补齐操作， 其他如sm4-ctr,sm4-cfb，sm4-ofb等，可以直接用
- 在openssl 1.1.1下可使用系统的函数，已支持sm4-cbc，sm4-cfb，sm4-ctr,sm4-ecb，sm4-ofb， 详见openssl\_tsm4.php ，有一点很诡异，用yum/dnf安装的openssl只支持sm3， 如果是自己编译安装的就支持sm3，sm4

### SM2各语言总结

[](#sm2各语言总结)

- 这里封装的测试函数已与相关的js,python,java,go等都可以互签互认
- js:  一个注意点就是： js的中文字符转成byte\[\]时，缺省的是unicode编码两字节，需要转成utf8的三字节编码，一个简单的方案 unescape(encodeURIComponent(str)) 然后再一个字节一个字节读就行了
- python:  使用 pip install gmssl 安装就可
- java:  注意下java中文的转码问题，getBytes("UTF-8")， 要加上编码类型， 因为 getBytes()函数的缺省编码是随操作系统的，如果是在中文版的windows中使用，缺省是GBK编码，就会出现中文的编码的问题，而造成签名无法通过
- openssl: 升到1.1.1以后，支持sm3，sm4的加解密，还不支持sm2的公私钥加解密，也不支持sm2的签名

- go:  一家做区块链的公司开源的项目，在go方面可以说是最早开源的了， 这个是个go的宝藏项目，有各种的加解密，签名
- C#: 项目也比较少，基本是基于 的BC加密库(java也是基于该库)，该库1.8.4后版本支持sm2，sm3，sm4，考察搜索到的几个项目， 完整性算比较好
- C:  北大计算机的开源项目，fork多,star也多。
- php-openssl: php7 好像支持了sm3, 在openssl1.1.1以上，可用编译的方式加入sm3,sm4的支持。 xampp套件下的php7以上的版本支持sm3, sm4的openssl\_系列函数， openssl\_get\_md\_methods() 查看是否支持sm3, openssl\_get\_cipher\_methods() 查看是否支持sm4

特别注意
----

[](#特别注意)

- sm2的构造函数中缺省是固定了中间椭圆，目前发现个别的接入方（目前发现是招行金融平台）将这个中间椭圆私钥随机算法给加黑了， 请使用的时候 $randFixed 设为false 以及重新生成一个中间椭圆的密钥对替换原有程序的数据

```
function __construct($formatSign='hex', $randFixed = true) {
    // 注意： 这个randFixed尽量取false, 如需要固定，请重新生成$foreignkey密码对
    $this->adapter = RtEccFactory::getAdapter();
    $this->generator = RtEccFactory::getSmCurves()->generatorSm2();
    if(in_array($formatSign,$this->arrFormat)){
        $this->formatSign = $formatSign;
    } else {
        $this->formatSign = 'hex';
    }
    if(!$randFixed){
        $this->useDerandomizedSignatures = false;
        $this->useDerandomizedEncrypt = false;
    }
}

```

- 银联这边java加密非sm2标准， java取x,y的值用错了函数，取成生成asn1的bigint的算法，得计算是否大于7f，php更改代码/src/smecc/sm2/chipher.php

```
private function  Reset() //注意，加密使用无符号的数组转换，以便与硬件相一致
{
    $this->sm3keybase = new SM3Digest();
    $this->sm3c3 = new SM3Digest();

    $p = array();

    $gmp_x = $this->p2->GetX();
    $this->sm3keybase->BlockUpdate(array(4), 0, 1); // 添加： 这里添加个04
    $x = Hex2ByteBuf::ConvertGmp2ByteArray($gmp_x);
    $this->sm3keybase->BlockUpdate($x, 0, sizeof($x));
    if($x[0]>127){ // >7F
        $this->sm3c3->BlockUpdate(array(0), 0, 1);   // 这里做了个判定，补00
    }
    $this->sm3c3->BlockUpdate($x, 0, sizeof($x));

    $gmp_y = $this->p2->GetY();
    $y = Hex2ByteBuf::ConvertGmp2ByteArray($gmp_y);
    $this->sm3keybase->BlockUpdate($y, 0, sizeof($y));

    $this->ct = 1;
    $this->NextKey();
}

public function  Dofinal()
{
    $c3 = array();
    $gmp_p = $this->p2->GetY();

    $p = Hex2ByteBuf::ConvertGmp2ByteArray($gmp_p);
   ///========以下添加的======
    if($p[0]>127){ // >7F
        $this->sm3c3->BlockUpdate(array(0), 0, 1);   // 这里做了个判定，补00
    }
  ///========以上添加的======
    $this->sm3c3->BlockUpdate($p, 0, sizeof($p));
    $this->sm3c3->DoFinal($c3, 0);
    $this->Reset();
    return $c3;
}

```

###  Health Score

23

—

LowBetter than 27% of packages

Maintenance37

Infrequent updates — may be unmaintained

Popularity9

Limited adoption so far

Community9

Small or concentrated contributor base

Maturity33

Early-stage or recently created project

 Bus Factor1

Top contributor holds 94.7% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

569d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/96126fb674e49c89c16c8f6cf2c0fca53197b35ed04a77bc0a7f1a942d32fafe?d=identicon)[ran](/maintainers/ran)

---

Top Contributors

[![lpilp](https://avatars.githubusercontent.com/u/36149355?v=4)](https://github.com/lpilp "lpilp (142 commits)")[![gokure](https://avatars.githubusercontent.com/u/88591?v=4)](https://github.com/gokure "gokure (5 commits)")[![Tinywan](https://avatars.githubusercontent.com/u/14959876?v=4)](https://github.com/Tinywan "Tinywan (3 commits)")

### Embed Badge

![Health badge](/badges/life2016-guomi/health.svg)

```
[![Health](https://phpackages.com/badges/life2016-guomi/health.svg)](https://phpackages.com/packages/life2016-guomi)
```

###  Alternatives

[defuse/php-encryption

Secure PHP Encryption Library

3.9k162.4M214](/packages/defuse-php-encryption)[roave/security-advisories

Prevents installation of composer packages with known security vulnerabilities: no API, simply require it

2.9k97.3M6.4k](/packages/roave-security-advisories)[mews/purifier

Laravel 5/6/7/8/9/10 HtmlPurifier Package

2.0k16.7M113](/packages/mews-purifier)[robrichards/xmlseclibs

A PHP library for XML Security

41278.1M118](/packages/robrichards-xmlseclibs)[bjeavons/zxcvbn-php

Realistic password strength estimation PHP library based on Zxcvbn JS

86917.5M63](/packages/bjeavons-zxcvbn-php)[illuminate/encryption

The Illuminate Encryption package.

9229.7M280](/packages/illuminate-encryption)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
