GithubHelp home page GithubHelp logo

sm9_free's Introduction

SM9_FREE

标识密码算法SM9(IBC)实现,包括密钥生成、签名验签、密钥交换和加解密等SM9标准中提到的所有功能。

该实现基于Miracl密码库

采用C语言编写,可支持X86、X86_64、ARM等多平台编译。

源码关系

Miracl密码库比较庞大,因此只截取出其中最核心的部分,包括大整数运算,Fp,Fp^2,Fp^4域计算以及Fp和Fp^2上椭圆曲线基础计算等功能。

依赖的所有Miracl密码库文件在文件夹 SM9_FREE/miracl 内。

Miracl密码库 基础之上,实现了满足SM9扩域需求的Fp^12和ate-pairing实现,最后在此之上完成了SM9的密钥生成、签名验签、密钥交换和加解密等功能。 所有和SM9相关的文件都在文件夹 SM9_FREE/sm9内。

SM9Test.c文件内是简单的测试用例,同时对性能做了简单的统计。

SM9编译测试

可以直接用XCODE进行编译测试

也可用gcc进行编译

make test

./test

SM9使用方法

#具体返回错误码等可参考sm9_algorithm.h文件

  1. 首先需要初始化参数(使用SM9 第五部分 指定的曲线类型和主密钥初始化系统):

SM9_Init(0,0,32,NULL,NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL );

  1. 如果想要使用签名部分

2.1 需要首先生成签名公私钥对:

SM9_MSK msk = SM9_MSK_New(32, cks); // 申明一个签名主密钥

SM9_MSPK mspk = SM9_MSPK_New(32); //申明一个主签名公钥

SM9_GenMSignPubKey(&msk, &mspk); // 生成主签名公钥

2.2 启动签名验签lib

gg = SM9_Set_Sign(mspk.x1, mspk.x2, mspk.y1, mspk.y2, NULL); // 启动签名lib

第二次启动时候可以使用上述生成的gg

SM9_Set_Sign(NULL, NULL, NULL, NULL, gg);

2.3 针对具体id生成签名私钥

SM9_PK pk = SM9_PK_New(5, id); // 申明一个签名公钥

SM9_SSK sk = SM9_SSK_New(32); // 申明一个签名私钥

SM9_GenSignSecKey(&sk, &pk, &msk); // 由公钥(id)生成签名私钥

2.4 完成签名

SM9_Sign sign = SM9_Sign_New(32); // 申明一个签名体

SM9_Signature(msg, 20, rand, &sk, &sign); //签名

2.5 验签部分

单独使用验签,同样需要先初始化参数

SM9_Init(0,0,32,NULL,NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL );

和启动签名验签lib

SM9_Set_Sign(NULL, NULL, NULL, NULL, gg);

随后可以根据用户id完成验签

SM9_Verify(msg, 20, &sign, &pk, NULL);

开源协议

本代码遵循BSD开源协议,欢迎大家使用

性能

在cpu i7 2.3G, 64位单线程环境下:

签名10000次大约耗时:120秒

验证10000次大约耗时:372秒

加密10000次大约耗时:130秒

解密10000次大约耗时:214秒

密钥交换20000次大约耗时:833秒

捐献

接受ETH捐献: ETH地址:0x36D112ad944c44Be528D5B799ECC131ffD3669BA

接受EOS捐献: EOS账号:jueduijuxing

所有收到的捐献将以徐峥、刘青云、周迅或张韶涵的名义在西部助建希望小学、水井等基础设施(不知以他人名义捐献是否妥当,如有不妥将删除)。

sm9_free's People

Contributors

songgeng87 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

Watchers

 avatar  avatar  avatar  avatar  avatar

sm9_free's Issues

怎么比官方的代码多了一些函数呢?

我发现了一些函数官方库里没有,比如zzn2_pow,zzn2_kill,是作者自己添加的么。我本来想用别人编译好的库,但是发现有些函数提示找不到,查了官方的代码发现也没有。

签名

生成签名:代码 SM9_Signature() 函数,签名通过结构体SM9_Sign存放,想问一下放在消息体后的签名,是将结构体赋值再消息体之后,直接发送至对端么。还是经过了进一步的运算

签名结果和验证工具不太一致

cks="2185EFAE4160ADB3ADF66661896A0093730FA84100A18AB252892B3C5151D7D4"
id="rtxm"
msg="mfds"
rand="641C11724B96E1CABE8230F9E4EFC309A7D2B8B0C18234E6D3249C3C9AB247A9"

代码测试结果:
h:
8ca9426325d020fd7bb92f3f4b17bc2ff941353d133699e2c8cdc9b8ece48eba
xs:
14d624aeb3f9774540a4e99767ae88791757c8087a15b0df271381203b1cadd7
ys:
4588e599a91466ffe22e21adbf7ad4168cb7ac4bd93c042771fbaf2aaf6c3897

###############################################################################
测试工具结果:
h:
8CA9426325D020FD7BB92F3F4B17BC2FF941353D133699E2C8CDC9B8ECE48EBA
xs:
9073D8A1588EB53D659DB032E26E688A7E3FD36A99D8F5C80AF020D2199755CA
ys:
47030BA93EFD34970C6F83AEEDBB201239D4473CC58B21DC1BBD71FAD07626F6

签名验签问题

1、写死随机数,但每次执行签名结果不同
2、将msg改为非Chinese IBS standard,比如 abcd 等等,验签会失败

怎么支持arm64

使用arm交叉编译时,内联的汇编指令报错,但是对汇编不了解,应该怎么解决呢

😜

签名验签不正确

cks:="\x86\xDC\xD6\x4F\xEB\x81\xA7\x19\x63\x59\x59\xF1\xA5\xC2\xF9\x88\xBD\x39\x43\x1B\x08\xA8\x63\xF0\x42\x8D\x21\xDF\xFA\xF2\xBF\x89"
id:="\x41\x6C\x69\x63\x65"
msg := "\x43\x68\x69\x6E\x65\x73\x65\x20\x49\x42\x53\x20\x73\x74\x61\x6E\x64\x61\x72\x64"
rand:="\x1A\x23\x29\x77\xBA\x9F\xA2\xD1\xC5\x58\xF2\xD4\x67\xFE\x7B\xE7\x04\x05\x41\x26\x73\xF8\xBE\x64\x9B\xBD\xD4\xA0\x95\xBE\x1B\x4B"

---------------------------------------结果----xs显示不全-------------------------------------
h: 396fb96c805e65426b1120c27edf86ecc1e36f88e8fdd1f59cbfc573c20536b0
xs: 52a37a7ab0b9016147593d068370268dd6e011e8443fffc194
ys: 2eaaba9d337a3cbc8562e1e22794f69f950b82785fe2df7e512ec9588ae3cfa8

俩个问题哦

  1. 代码下Ubuntu下编译不成功呢 make test 编不出来 执行文件哦
  2. 请问可以在单片机下使用吗 如果有 测过哪个?

加解密问题

--------------------------加密测试参数--------------------------

unsigned char cmsg[20] = {"\x43\x68\x69\x6E\x65\x73\x65\x20\x49\x42\x45\x20\x73\x74\x61\x6E\x64\x61\x72\x64"};
unsigned char eks[32] = {"\x00\x01\xED\xEE\x37\x78\xF4\x41\xF8\xDE\xA3\xD9\xFA\x0A\xCC\x4E\x07\xEE\x36\xC9\x3F\x9A\x08\x61\x8A\xF4\xAD\x85\xCE\xDE\x1C\x22"};
unsigned char eid[3] = {"\x42\x6F\x62"};
unsigned char er[32] = {"\x00\x00\xAA\xC0\x54\x17\x79\xC8\xFC\x45\xE3\xE2\xCB\x25\xC1\x2B\x5D\x25\x76\xB2\x12\x9A\xE8\xBB\x5E\xE2\xCB\xE5\xEC\x9E\x78\x5C"};

注:这个加密结果前半部分 x+y都是一致的,后半部分是c3+cp吗 好像不太一样

--------------------------调用库得到的结果--------------------------
x: 2445471164490618e1ee20528ff1d545b0f14c8bcaa44544f03dab5dac07d8ff
y: 42ffca97d57cddc05ea405f2e586feb3a6930715532b8000759f13059ed59ac0
c3: fd3c98dd92c44c68332675a370cceede31e0c5cd209c257601149d12b394a2be
cp: e05b6fac6f11b965268c994f00dba7a8bb00fd60583546cbdf4649250863f10a

--------------------------测试工具得到的结果--------------------------
2445471164490618E1EE20528FF1D545B0F14C8BCAA44544F03DAB5DAC07D8FF42FFCA97D57CDDC05EA405F2E586FEB3A6930715532B8000759F13059ED59AC0DEA278E55F9ECB2ECD98E4BA8C8B8EF05571D2AFB3BD94BA8563E236125055A163451E20CD57DFB0722D6D0C8731573FBB00FD60583546CBDF4649250863F10A

编译错误

Makefile
第2行: CC = gcc -std=c99
第27行: $(CC) SM9Test.o -o test -L./ -lsm9

SM9_Init

SM9_Init函数始终返回1 ,建议初始化成功返回其他值

print_big和sm9_init中的epoint_set

输出big不正确,只能输出28字节。并且我的SM9_init也不能正确运行。epoint_set始终不对,是怎么回事呢,谢谢博主。

签名结果错误

cks:="\x1A\x94\x71\xE7\x2F\xA8\xAB\xE0\xCC\x6B\x9C\x1C\x71\x43\xCF\x77\xC6\xFD\xAF\x62\x7C\x4E\xF5\x5F\x11\x9A\xB6\x9F\xC2\x3D\x48\x97"
msg := "\x43\x68\x69\x6E\x65\x73\x65\x20\x49\x42\x53\x20\x73\x74\x61\x6E\x64\x61\x72\x64"
rand:="\x25\x20\xE4\xEC\x4A\x03\xBD\xED\x54\xEF\x07\x2D\x59\xC5\xFE\xBF\x20\x14\xBE\xDD\xAF\x43\x14\xAA\x94\x35\x9B\x7B\xE4\xE9\x55\xC9"

---------------------------------------结果----xs显示不全-------------------------------------
h: 1fcb9f5bac5e3cef88fa839504fcd7ab9fb89337e95fdfa659a370f728bbd66a
xs: 6cec7fa9abae
ys: 86a7f2b3236b9feda074fded1201ca33c13c2ebe057a99073b02e70ec6e05cb1

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.