一、国密算法介绍
国密即国家密码局认定的国产密码算法。主要有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…
安装
设置环境变量
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]);