一、国密算法介绍

国密即国家密码局认定的国产密码算法。主要有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性能更优更安全:密码复杂度高、处理速度快、机器性能消耗更小

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

1、openssl生成SM2秘钥

1.1、安装openssl

  • 下载安装包
    下载地址:http://slproweb.com/products/Win32OpenSSL.html
  • 安装
  • 设置环境变量
    在这里插入图片描述

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]);
参考

1.国密算法SM2介绍
2.sm-crypto
3.国密SM1、SM2、SM3、SM4算法资料大全
4.windows安装OpenSSL
5.openssl SM2签名密钥生成
6.在openssl中对SM2的公私钥进行加解密的验证
7.国密算法SM2加解密数据,解密出现异常
8.SM2 加解密注意事项