国密-SM2

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 国密-SM2

前言

SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法。

SM2算法和RSA算法都是公钥密码算法,SM2算法是一种更先进安全的算法,在我们国家商用密码体系中被用来替换RSA算法。

随着密码技术和计算机技术的发展,目前常用的1024位RSA算法面临严重的安全威胁,我们国家密码管理部门经过研究,决定采用SM2椭圆曲线算法替换RSA算法。

SM2算法和RSA算法比较

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

详细参考: https://www.ecaa.org.cn/667.html

后端代码实现

添加 sm2 依赖

<dependency>
    <groupId>com.antherd</groupId>
    <artifactId>sm-crypto</artifactId>
    <version>0.3.2</version>
</dependency>

获取密钥对

    @Test
    public void testSM2(){
        // 生成出来的密钥可无缝衔接 前端 js 加解密
        Keypair keypair = Sm2.generateKeyPairHex();
        String privateKey = keypair.getPrivateKey(); // 公钥
        String publicKey = keypair.getPublicKey(); // 私钥
        System.out.println(privateKey);
        System.out.println(publicKey);
        System.out.println("========================");
    }

使用公私钥进行加解密

    @Test
    public void testSM2(){
        // 生成出来的密钥可无缝衔接 前端 js 加解密
        Keypair keypair = Sm2.generateKeyPairHex();
        String privateKey = keypair.getPrivateKey(); // 公钥
        String publicKey = keypair.getPublicKey(); // 私钥
        System.out.println(privateKey);
        System.out.println(publicKey);
        System.out.println("========================");
        // cipherMode 1 - C1C3C2,0 - C1C2C3,默认为1
        // 使用公钥加密
        final String doEncrypt = Sm2.doEncrypt("https://softleadergy.github.io/", publicKey);
        System.out.println("加密: \n" + doEncrypt);
        // 私钥解密
        final String s = Sm2.doDecrypt(doEncrypt, privateKey);
        System.out.println("解密:\n" + s);
    }

前端代码实现 - vue

安装依赖

npm install --save sm-crypto

获取密钥对

const sm2 = require('sm-crypto').sm2
let keypair = sm2.generateKeyPairHex()
publicKey = keypair.publicKey // 公钥
privateKey = keypair.privateKey // 私钥
// 自定义随机数,参数会直接透传给 jsbn 库的 BigInteger 构造器
// 注意:开发者使用自定义随机数,需要自行确保传入的随机数符合密码学安全
let keypair2 = sm2.generateKeyPairHex('123123123123123')
let keypair3 = sm2.generateKeyPairHex(256, SecureRandom)
let verifyResult = sm2.verifyPublicKey(publicKey) // 验证公钥

加密解密

// 这里使用Java生成的密钥
// 后端生成密钥
const privateKey = 'a7a9846bbb015f8192bae355be4013d7b7b2bdcf56033b990d58bb5a7541f518'
const publicKey = '048ff6380b4db5c9fc9d80fc5e30bde049c12222c56b9085aa1f1c0b53cabd09e72dc5690110e5b57fc3ff88111d0d161723bcb6365c33cef70d3dbbdf32c7038f'
const sm2 = require('sm-crypto').sm2
const cipherMode = 1 // 1 - C1C3C2,0 - C1C2C3,默认为1
let encryptData = sm2.doEncrypt(msgString, publicKey, cipherMode) // 加密结果
let decryptData = sm2.doDecrypt(encryptData, privateKey, cipherMode) // 解密结果
// 指定输出类型
// encryptData = sm2.doEncrypt(msgArray, publicKey, cipherMode) // 加密结果,输入数组
// decryptData = sm2.doDecrypt(encryptData, privateKey, cipherMode, {output: 'array'}) // 解密结果,输出数组

最终封装

/**
 * 前端加密
 * @param text
 * @returns {*}
 */
export function encrypt(text) {
  return sm2.doEncrypt(text, publicKey, 1) // 加密结果
}
/**
 * 前端解密
 * @param text
 * @returns {*}
 */
export function decrypt(text) {
  return sm2.doDecrypt(text, privateKey, 1) // 加密结果
}

签名验签

示例

    @Test
    public void test(){
        // 获取公私钥
        Keypair keypair = Sm2.generateKeyPairHex();
        String privateKey = keypair.getPrivateKey(); // 公钥
        String publicKey = keypair.getPublicKey(); // 私钥
        // 需要加密的明文
        String msg = "https://softleadergy.github.io/";
        String encrypt = Sm2.doEncrypt(msg, publicKey);
        System.out.println("使用公钥加密密文为:"+ encrypt);
        String decrypt = Sm2.doDecrypt(encrypt, privateKey);
        System.out.println("使用私钥解密明文为:"+ decrypt);
        // 纯签名 + 生成椭圆曲线点
        String sigValueHex = Sm2.doSignature(msg, privateKey); // 签名
        System.out.println("使用私钥签名结果为:"+ sigValueHex);
        boolean verifyResult = Sm2.doVerifySignature(msg, sigValueHex, publicKey); // 验签结果
        System.out.println("使用公钥验签结果为:"+ verifyResult);
    }

输出

使用公钥加密密文为:89bd07ef376bdc732f2d6430b64a144df14ce7f50fe6aea2d217b79dac1fcf4a950922ed7046a92702aa2f132504b19e8f35449f01a4dcbfb4d8a845e396d27d073b12cc89bb9db8d7bdd88e404be6d2b3d46527cc788012b210633500a3d7f00a7dc9d64d0a78a49ff58be351b03abe2d4cc30abbc5e2ec6fb297f10fa586
使用私钥解密明文为:https://softleadergy.github.io/
使用私钥签名结果为:5eeacc471fe227f5679f94e7029ac1c0105420dbea0d8a6532ed03325207f8c191559f191edf05858d787bd3e1de331d179d93ae99dd4c9033a93295054fb5b8
使用公钥验签结果为:true

签名验签、获取椭圆曲线点

详细请了解:https://github.com/JuneAndGreen/sm-crypto#readme

相关文章
|
2月前
|
存储 算法 安全
SM2解密
【10月更文挑战第5天】SM2解密
209 11
|
算法 安全 应用服务中间件
ECC+RSA双证书解决方案
ECC+RSA双算法SSL证书的配置方法
1462 0
|
1月前
|
算法 安全 物联网
关于SM2、SM3、SM4、SM9这四种国密算法
本文介绍了四种国密算法——SM2、SM3、SM4和SM9。SM2是一种基于椭圆曲线的非对称加密算法,用于数据加密和数字签名;SM3是哈希算法,用于数字签名和消息完整性验证;SM4是对称加密算法,用于数据加密和解密;SM9是基于标识的非对称密码算法,适用于物联网环境中的数据安全和隐私保护。
607 0
|
2月前
|
算法 安全 物联网
如何应用SM2算法进行身份认证
【10月更文挑战第5天】如何应用SM2算法进行身份认证
125 1
|
2月前
|
数据安全/隐私保护
sm2加密解密
sm2加密解密
67 3
|
3月前
|
算法 Java 数据安全/隐私保护
国密加密算法简介
国密指国家密码局认定的国产密码算法,主要包括SM1、SM2、SM3、SM4等,并持续完善。SM1是对称加密算法,加密强度与AES相当,需加密芯片支持;SM2是非对称加密,基于ECC算法,签名和密钥生成速度优于RSA;SM3为杂凑算法,安全性高于MD5;SM4为对称加密算法,用于无线局域网标准。本文提供使用Java和SpringBoot实现SM2和SM4加密的示例代码及依赖配置。更多国密算法标准可参考国家密码局官网。
328 1
|
3月前
|
存储 算法 安全
超级好用的C++实用库之国密sm4算法
超级好用的C++实用库之国密sm4算法
96 0
|
3月前
|
算法 安全 Serverless
超级好用的C++实用库之国密sm3算法
超级好用的C++实用库之国密sm3算法
132 0
|
7月前
|
算法 安全 BI
国密算法学不学?
国密算法学不学?
119 0
|
算法 安全 物联网
CFCA证书——基于SM2/3算法的安全信任
CFCA证书——基于SM2/3算法的安全信任
228 0
CFCA证书——基于SM2/3算法的安全信任