加密算法_国密算法

国家密码管理局
SM2国密标准文档

国密介绍

GMSM —— 国密简介、概念(SM1-9)、ZUC祖冲之算法
商密算法SM2、SM3、SM4的用途和原理
webencrypt sm2
国密SM2算法
加速国密SM2算法的优化实现系统及方法与流程

开源OpenSSL

openssl

openssl

gmssl

gmssl
https://github.com/guanzhi/GmSSL

开源SM2

stevenpsm/GM_SM2

本项目基于相关规范实现了sm2算法以及der编解码,具备sm2密钥生成、加密、解密、签名、验签等功能;
包含sm2算法实现、sm2算法测试、sm2der编解码(基于国密sm2相关结构的asn定义)、sm2算法jni封装、大数库等;
算法实现中调用了libtommath大数库、goldbar的sm3算法,以及asn1c等;
本项目可以在Mac/Linux/Windows/Android/iOS等平台编译;
本项目作者simonpang/[email protected];感谢libtommath作者及goldbar

dishibolei/SM2

国密算法SM2的实现。

基于stevenpsm/GM_SM2,封装的OC代码。

注:源代码SM2算法有一些问题,无法使用(SM3的算法有问题)。另外其他基于openssl的算法,算法太大,不适合对大小有要求的工程。如果有需要可以自行使用。

算法通过了官方文档中的例子,http://www.oscca.gov.cn/News/201012/News_1197.htm

在sm2.h中加了#define _DEBUG 宏用于调试,正常使用的时候要注释掉。

相关解读可以参考我的博客:

https://dishibolei.github.io/2017/05/25/save-encode/

国密算法的基础是使用曲线计算。曲线应该使用官方推荐的曲线,曲线不同加解密肯定失败。

国密算法生成的数据为C1C2C3,其中C1为固定的64字节,c2和原始数据一样长,C3为固定的32字节。有些要求数据前面加上’0x04’,旧的版本输出是C3C1C2。这两点要注意。

公钥分为P_x和P_y,都是32字节长度。私钥长度从资料上看没有限制,是一个随机数[1,N-2]。N为曲线参数。

加密过程中使用了SM3的散列算法(官方叫杂凑算法),这个算法输出为32字节的数据。如果对端没有用这个算法,两端也无法加解密成功。

注意:

本算法是基于stevenpsm/GM_SM2的算法,因为实际项目中只对sm2的加解密做了验证,所以OC只暴露了加解密的方法,其他的生成公私钥对和签名验证没有验证,有不通的应该需要对源码做修改,主要是KDF的算法有问题,可以按照官方算法校正

Aries-orz/nano-sm2

这是一个8位处理器上的SM2实现,未使用openssl等第三方库,目前仅支持256位SM2。代码基于nano-ecc实现(8位处理器上的ecc实现,详情见
https://github.com/iSECPartners/nano-ecc )。

SM2与ecc的区别主要在于曲线参数的选择不同,另外在签名,验签的过程中也有一点区别,SM2的官方文档以及官方推荐参数可以参考
http://www.oscca.gov.cn/News/201012/News_1197.htm 。

Changes 本代码主要在以下几方面对nano-ecc进行了改动:

大数模运算 - nano-ecc在实现大数模运算的过程中,根据《Mathematical routines for the NIST
prime elliptic
curves》文档(https://koclab.cs.ucsb.edu/teaching/cren/docs/w02/nist-routines.pdf
)给出的方法,对模标准ecc参数p的运算进行了优化,故其模运算仅适用于标准ecc的曲线参数(nano-ecc这一部分代码也是参考的linux内核源码)。本代码根据其优化方法,实现了对256位SM2算法的推荐参数的算法优化,可以快速得到与SM2推荐参数p相关的模运算结果;

签名过程 - 本代码完全按照SM2签名过程实现;

验签过程 - 本代码完全按照SM2验签过程实现。

Usage Notes
使用时只需将sm2.h与sm2.c加入自己的项目工程中,然后再include头文件sm2.h即可。test_sm2.c为一个测试算法的样例。密钥对可用apps/makekeys.c来生成。

Parameters 另附本代码使用的SM2官方推荐参数(256位): 椭圆曲线方程:y^2 = x^3 + ax + b 曲线参数:
p=FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF
FFFFFFFF a=FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000
FFFFFFFF FFFFFFFC b=28E9FA9E 9D9F5E34 4D5A9E4B CF6509A7 F39789F5
15AB8F92 DDBCBD41 4D940E93 n=FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF
7203DF6B 21C6052B 53BBF409 39D54123 Gx=32C4AE2C 1F198119 5F990446
6A39C994 8FE30BBF F2660BE1 715A4589 334C74C7 Gy=BC3736A2 F4F6779C
59BDCEE3 6B692153 D0A9877C C62A4740 02DF32E5 2139F0A0

你可能感兴趣的:(加密算法)