国密即国家密码局认定的国产密码算法。主要有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性能更优更安全:密码复杂度高、处理速度快、机器性能消耗更小
算法名称 | SM2 | RSA |
---|---|---|
算法结构 | 基本椭圆曲线(ECC) | 基于特殊的可逆模幂运算 |
计算复杂度 | 完全指数级 | 亚指数级 |
存储空间 | 192-256bit | 2048-4096bit |
秘钥生成速度 | 较RSA算法快百倍以上 | 慢 |
解密加密速度 | 较快 | 一般 |
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 加解密注意事项