程序员的公众号:源1024,获取更多资料,无加密无套路!
最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》,《Java并发编程实战》等等
获取方式: 关注公众号并回复 电子书 领取,更多内容持续奉上
SM2算法是中国国家密码局推出的一种基于椭圆曲线的非对称加密算法,是一种安全性高、运算速度快的非对称加密算法,适用于数字签名、密钥交换、密钥派生以及数据加密和解密等应用场景,相比于RSA算法,SM2具有以下特点和优势:
- SM2算法使用的是ECC 256位椭圆曲线,相对于RSA 2048位,它具有更高的安全强度。
- SM2算法的密钥长度较小,运算速度更快。
- 在相同密钥长度下,SM2算法比RSA算法具有更高的安全性。
- SM2算法在安全性和性能方面都具备优势。
SM2算法的应用主要涵盖以下几个方面:
- 数字签名:SM2算法可以用于生成和验证数字签名,保证信息的完整性和真实性。
- 密钥交换:SM2算法可以用于在通信过程中安全地交换密钥,确保通信的机密性。
- 密钥派生:SM2算法可以用于从一个密钥派生出多个密钥,方便管理和使用。
- 加密和解密:SM2算法可以用于加密和解密敏感数据,保护数据的机密性。
具体实现添加以下依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.5.4</version>
</dependency>
<!-- sm2加解密依赖 -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.70</version>
</dependency>
Java示例代码如下
/**
* 生成公私钥
*/
KeyPair pair = SecureUtil.generateKeyPair("SM2");
byte[] prikey = pair.getPrivate().getEncoded();
byte[] pubKey = pair.getPublic().getEncoded();
//私钥
String privateKey = bytesToBase64(prikey);
//公钥
String publicKey = bytesToBase64(pubKey);
/**
* 加密
*/
SM2 sm2 = SmUtil.sm2(privateKey, publicKey);
String encryptStr = sm2.encryptBcd("asdf", KeyType.PublicKey);
System.out.println("加密后:" + encryptStr);
/**
* 解密
*/
String decryptStr = StrUtil.utf8Str(sm2.decryptFromBcd(encryptStr, KeyType.PrivateKey));
System.out.println("解密后:" + decryptStr);
运行结果:
加密后:0407536A4A360FCBB07CF2A9687CE3130547EFBD4E95D825AE2A85EE8060FC9AEBEE7467142A86B91BF54B402E805D2CEDAC8104DE428DCFC2487586AAC110F8A3533BAAA3B7EA0D5F06BC3C80487C270D7E6E1F34C66E57487BBDED06A2B73BAAF9B50AA4
解密后:asdf
如果是对接的一些三方系统,可能不会给私钥,只给到一个公钥,那就只用公钥加密,三方系统用对应的私钥解密即可。具体示例如下:
/**
* 只用公钥加密,只有对应的私钥才能解密成功
*/
SM2 sm2 = SmUtil.sm2(null, publicKey);
String encryptStr = sm2.encryptBcd("asdf", KeyType.PublicKey);
System.out.println("加密后:" + encryptStr);

本文含有隐藏内容,请 开通VIP 后查看