Giter Club home page Giter Club logo

sm3-php's Introduction

SM3-PHP

国密标准SM3的原生PHP实现。

Latest Stable Version Latest Unstable Version License FOSSA Status

Run Tests Total Downloads Monthly Downloads

前言

在开发本库的过程中,发现了 PHP 的三个痛点,敬请各位务必要有所了解:

  1. PHP本身对其他进制转换为二进制,由于浮点数的长度特性,会造成数据丢失,这样就会造成运算结果的错误,需要自己重写;
  2. PHP的位运算符没法直接进行二进制变量的与或非运算,必须得自己重写;
  3. 碍于PHP本身的解释型、弱类型语言特点,运行速度没有C快,所以并不是最优选择。

但我们常说,看问题要有两面性。

尽管 PHP 本身有诸多问题,唱衰之声不断,但仍然发展到今天的生态规模, 很多时候,我们的实际性能需求并没有严格到要求我们去考量语言之间的速度差异,而重在功能的实现。

况且,上面提到的诸多痛点都已经被我封装在了这个库里, 性能的优化交给我来做,大家只要负责调用,来实现业务逻辑即可。

也希望大家来都来了,点个 WatchStar ,持续关注一下。在此拜谢!

特点

  1. 纯原生 PHP 代码,不额外依赖扩展项;
  2. OOP + Composer ,更优雅,安装更简单;
  3. 使用命名空间,防止变量名、方法名污染;
  4. 引入了 ComposerPSR-4 规范,进行类的自动加载;
  5. 使用 PSR-12 代码规范
  6. 代码注释完整, 可配合《 SM3密码杂凑算法 》食用, 方便进一步学习和研究本算法。

要求

  • 5.3 <= php < 7.2

7.2 之后版本理论通过,但因为 phpunit 的版本兼容性问题,没有单元测试支撑

1.x 版本之后只会作为低版本兼容,2.x 及之后版本会对 PHP 更高版本做适配,使用更多新特性

安装

本库优先支持 Composer 安装,但为了尊重使用习惯,也提供了直接下载压缩包的方式。 但不得不说,Composer 式的以组件、包为单位的项目管理方式更加现代化、方便和优雅。

一、源码解压(不推荐)

  1. 下载压缩包

    提供了 .zip.tar.gz 两种格式的压缩包, 压缩包已经过 Composer 包的优化

    下载地址:https://github.com/DongyunLee/SM3-PHP/releases/latest

  2. 解压到项目中的任意位置

    • Windows:

      使用 winrar/7zip/Bandizip 等工具解压

    • 类Unix:

      tar zxvf SM3-PHP.tar.gz
      # 或者
      unzip SM3-PHP.zip
    # 打包命令
    composer arch
    
    # 或 composer run-script arch

二、composer 安装(强烈推荐)

  1. 安装 composer

    详见 《如何安装 Composer

  2. 安装慢可更换中文镜像

    由于大量先前的镜像失效,所以目前(2019-11-25)推荐使用阿里云镜像

    其实配置中已经把镜像配置成了阿里云的镜像。 但有效范围毕竟只有这一个包。

    开发环境中还是建议进行下全局的配置。

    更换阿里云镜像方式详见拙笔 《向先行者致敬,迎接 Composer 的未来!

  3. composer require ch4o5/sm3-php

  4. composer install

  5. composer update

    下述 composer update 参数作为生产环境的优化,分析、调试和阅读代码无须使用

    参数简单说明:

    1. --prefer-dist:优先构建好的包,而不是源码
    2. --no-dev:不安装require-dev中定义的包,减小包的大小
    3. --no-plugins:不安装插件
    4. --with-dependencies:递归更新依赖的包
    5. --optimize-autoloader / -o:转换 PSR-0/4 autoload 到 classmap 可以获得更快的加载支持
    6. --classmap-authoritative: 推荐 使用后默认开启 -o,并对所有类加速

快速开始

在根目录中的 demo.php 中,进行了简单地调用示范:

<?php
/**
 * demo @ sm3-php
 *
 * Code BY ch4o5
 * 10月. 12th 2019
 * Powered by PhpStorm
 */

// 1. 引入项目中 Composer 的 autoload.php
require 'vendor/autoload.php';
// 2. 如果使用源码压缩包方式安装,则引入下面这句
// require '解压后的SM3-PHP目录/vendor/autoload.php';

// 直接调用提供的 sm3() 函数
$sm3 = sm3('abc');

// 使用它
echo $sm3;

你也可以在 examples/ 目录下找到更多的使用示例。

目录结构

  • examples/ 示例项目

  • src/ 源码目录,命名空间为SM3

  • vendor/ Composer自动加载相关

  • CHANGELOG.md 版本变更日志

  • composer.json Composer 配置文件

  • composer.lock Composer 锁文件,用于保证版本

  • demo.php 演示代码

  • LICENSE 开源许可证文件

  • README.md 本文件,项目说明

开源许可

FOSSA Status

本项目遵从 MPL-2.0 许可:

  • 修改源码后不可以闭源;
  • 新增代码无需采用相同许可证;
  • 需要对源码的修改之处,提供说明文档

这是一个松散的许可证,我没有给各位添加使用负担。

但请务必注意,引用时请注明来源,请勿删除文件开头的版权注释。
己所不欲,勿施于人。

我保留追究相关责任的权利。

sm3-php's People

Contributors

axiosleo avatar dongyunlee avatar fossabot avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

sm3-php's Issues

composer安装失败

require 'vendor/autoload.php';

use SM3\SM3;

$sm3 = new SM3('abc');
echo $sm3;
这边报错引用不到require 'vendor/autoload.php';
请问一下,这个是引用Composer 的吗

不能正确处理空白符(空格、回车符等)

问题描述
当输入包含whitespace时,得到的结果和openssl(1.1.1d 10 Sep 2019)不同

复现
执行如下代码:

<?php
/**
 * demo @ sm3-php
 *
 * Code BY ch4o5
 * 10月. 12th 2019
 * Powered by PhpStorm
 */

require 'vendor/autoload.php';

$sm3 = sm3("a a");
echo $sm3;

结果:
1076807302544460b26944d7756a067bd4e135e2076889e86d62db5b5a10c867

对比openssl
执行:
 openssl dgst -sm3 test.txt
结果:
SM3(test.txt)= d6ef141c5faa9bbde67cbc9f45988d6158eaf0bc2ab492bb489a6524ca492cbc

对比在线工具
另一个在线工具的例子(http://aks.jd.com/tools/sec/):
深度截图_选择区域_20191216172917

环境 :

  • OS: Manjaro 18.1.4 Juhraya
  • Kernel: x86_64 Linux 4.19.88-1-MANJARO
  • PHP 7.4.0 (cli) (built: Nov 30 2019 10:43:49) ( NTS )
  • ch4o5/sm3-php: 1.1

sm3() donnot support Non-ASCII (不支持非ASC码)

bug描述
例如:sm3(hexToStr("31313131323232329988"));
这样计算出来的结果是:49f5ee514b753fe9c8a0a8385301ff91e53847800e613520bfcbec787845e373
而标准结果是:f639edc383b5031b24e3c2f0c3414970ae3d0537716627c8d1c486676da0b8c0

太遗憾了

sm3_file

请描述下你需要的功能相关的问题
生成文件的 sm3 标识

请描述下你预期的解决方案

  • 直接生成本地和远程文件的 sm3 标识
    • 单元测试
  • 文件流形式生成文件 sm3 标识
    • 单元测试
  • 抛出异常
    • 单元测试

请描述下你考虑过的替代方案
替代?不存在的,莽就完了

为啥我这边输出结果不一致

// 输出 66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0

我这边是 2daef60e7a0b8f5e024c81cd2ab3109f2b4f155cf83adeb2ae5532f74a157fdf
本地 远程都是 echo sm3_file('https://raw.githubusercontent.com/DongyunLee/SM3-PHP/master/examples/sm3_file/test.txt');

测试服务器信息 **************

重构为使用PHP直接操作二进制的方式

请描述下你需要的功能相关的问题
现在的计算方式太慢了,需要把把二进制转化成可读的十进制数字(1、0)然后再算

请描述下你预期的解决方案
PHP直接操作二进制

额外信息
整个项目全部重构,精简代码

经测试V1.1.2, V1.1.1结果有误, demo结果也不同

环境:
debian 7.8
PHP 5.4.45-0+deb7u11 (cli) (built: Aug 30 2017 01:07:33)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies

下载release V1.1.2, V1.1.1 访问demo.php
计算结果均为: 183920f00e15a0433ee3a8fc90dd9ac164c4142ccf63ca189a8f645ec96ff8de
正确结果为: 66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0

下载部署V1.1 , 复制V1.1.2的demo.php 访问可以得到预期结果. 是否高版本引入了问题?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.