一、加入maven依赖
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15to18</artifactId>
<version>${bcprov}</version>
</dependency>
二、SM2Util.java
package com.gllic.workweixin.SM2;
import cn.hutool.core.util.HexUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.SM2;
import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey;
public class SM2Util {
/*生成密钥对*/
public static SM2KeyPair getSm2KeyPair() {
SM2 sm2= SmUtil.sm2();
/*公钥*/
String publickey=sm2.getPublicKeyBase64();
/* js端公钥 JS代码实现 SM2的方案,都是直接使用的私钥的d值和公钥的q值直接进行的加解密所以后端口返回的最好是从公钥里面提取的q值,以q值做为js端的加密公钥*/
String publicQkey = HexUtil.encodeHexStr(((BCECPublicKey)sm2.getPublicKey()).getQ().getEncoded(false));
/*私钥*/
String privatekey=sm2.getPrivateKeyBase64();
return new SM2KeyPair(publickey,publicQkey,privatekey);
}
/*公钥加密*/
public static String encrypt(String data, String publickey) {
SM2 sm2=SmUtil.sm2(null,publickey);
String encryptStr = sm2.encryptBcd(data, KeyType.PublicKey);
return encryptStr;
}
/*私钥解密 公钥加密密文*/
public static String decrypt(String encryptStr, String privatekey){
if(!encryptStr.startsWith("04")){
encryptStr="04".concat(encryptStr);
}
SM2 sm2=SmUtil.sm2(privatekey,null);
String decryptStr = StrUtil.utf8Str(sm2.decryptFromBcd(encryptStr, KeyType.PrivateKey));
return decryptStr;
}
/** 私钥签名*/
public static String signByPrivateKey(String data, String privatekey){
SM2 sm2= SmUtil.sm2(privatekey,null);
String sign = sm2.signHex(HexUtil.encodeHexStr(data));
return sign;
}
/**公钥验签*/
public static boolean verifyByPublicKey(String data, String publickey, String signature){
SM2 sm2= SmUtil.sm2(null,publickey);
boolean verify = sm2.verifyHex(HexUtil.encodeHexStr(data), signature);
return verify;
}
}
三、生成密钥对:
SM2KeyPair.java
package com.gllic.workweixin.SM2;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class SM2KeyPair {
/**
* 公钥
*/
private String publicKey;
/*vue js端 公钥*/
private String publicQKey;
/**
* 私钥
*/
private String privateKey;
}