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