最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》,《Java并发编程实战》等等
获取方式: 关注公众号并回复 电子书 领取,更多内容持续奉上
SM2算法是中国国家密码局推出的一种基于椭圆曲线的非对称加密算法,是一种安全性高、运算速度快的非对称加密算法,适用于数字签名、密钥交换、密钥派生以及数据加密和解密等应用场景,相比于RSA算法,SM2具有以下特点和优势:
SM2算法的应用主要涵盖以下几个方面:
具体实现添加以下依赖
- <dependency>
- <groupId>cn.hutoolgroupId>
- <artifactId>hutool-allartifactId>
- <version>5.5.4version>
- dependency>
-
- <dependency>
- <groupId>org.bouncycastlegroupId>
- <artifactId>bcprov-jdk15onartifactId>
- <version>1.70version>
- 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);