SpringBoot整合SM2


一、加入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;

}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM