程序员的公众号:源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);