国密算法(SM2)简介及SM2生成秘钥

1,730 阅读2分钟

一、国密算法介绍

国密即国家密码局认定的国产密码算法。主要有SM1,SM2,SM3,SM4。密钥长度和分组长度均为128位。

SM1 为对称加密。其加密强度与AES相当。该算法不公开,调用该算法时,需要通过加密芯片的接口进行调用。

SM2为非对称加密,基于ECC。该算法已公开。由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA。ECC 256位(SM2采用的就是ECC 256位的一种)安全强度比RSA 2048位高,但运算速度快于RSA。 旧标准的加密排序C1C2C3 新标准 C1C3C2,C1为65字节第1字节为压缩标识,这里固定为0x04,后面64字节为xy分量各32字节。C3为32字节。C2长度与原文一致。

SM3 消息摘要。可以用MD5作为对比理解。该算法已公开。校验结果为256位。

SM4 无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为128位。

二、SM2算法和RSA算法比较

SM2性能更优更安全:密码复杂度高、处理速度快、机器性能消耗更小

算法名称 SM2 RSA 算法结构 基本椭圆曲线(ECC) 基于特殊的可逆模幂运算 计算复杂度 完全指数级 亚指数级 存储空间 192-256bit 2048-4096bit 秘钥生成速度 较RSA算法快百倍以上 慢 解密加密速度 较快 一般

三、生成SM2秘钥

1、openssl生成SM2秘钥

1.1、安装openssl 下载安装包

下载地址:slproweb.com/products/Wi…

安装

设置环境变量

image.png

1.2、生成SM2私钥

openssl ecparam -genkey -name SM2 -out priv.key

1.3、生成SM2公钥

./openssl ec -in priv.key -pubout -out pub.key

2、nodejs:使用sm-crypto包生成SM2密钥

此秘钥若给c++使用,需要把公钥的前两位04去掉。

const sm2 = require('sm-crypto').sm2
let keypair = sm2.generateKeyPairHex()
let publicKey = keypair.publicKey // 公钥
let privateKey = keypair.privateKey // 私钥

nodejs使用SM2加密、解密,参考sm-crypto

3、c++生成秘钥

	/* ecc_make_key() function.
	Create a public/private key pair.

	You must use a new nonpredictable random number to generate each new key pair.

	Outputs:
		p_publicKey  - Will be filled in with the point representing the public key.
		p_privateKey - Will be filled in with the private key.

	Inputs:
		p_random - The random number to use to generate the key pair.

	Returns 1 if the key pair was generated successfully, 0 if an error occurred. If 0 is returned,
	try again with a different random number.
	*/
	int ecc_make_key(EccPoint *p_publicKey, uint8_t p_privateKey[NUM_ECC_DIGITS], uint8_t p_random[NUM_ECC_DIGITS]);