import cn.hutool.core.util.HexUtil;
import cn.hutool.crypto.BCUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.SM2;
import cn.hutool.crypto.symmetric.SM4;
import org.apache.commons.lang3.StringUtils;
import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey;
public class SMUtils {
private static final String SM4Key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
/**
* SM2 生成密钥 16进制
*
* @return
*/
public static SM2KeyPair generateSM2Key() {
SM2 sm2 = new SM2();
String privateKey = HexUtil.encodeHexStr(BCUtil.encodeECPrivateKey(sm2.getPrivateKey()));
String publicKey = HexUtil.encodeHexStr(((BCECPublicKey) sm2.getPublicKey()).getQ().getEncoded(false));
return new SM2KeyPair(publicKey, privateKey);
}
public static class SM2KeyPair {
private String publicKey;
private String privateKey;
SM2KeyPair(String publicKey, String privateKey) {
this.publicKey = publicKey;
this.privateKey = privateKey;
}
public String getPublicKey() {
return publicKey;
}
public void setPublicKey(String publicKey) {
this.publicKey = publicKey;
}
public String getPrivateKey() {
return privateKey;
}
public void setPrivateKey(String privateKey) {
this.privateKey = privateKey;
}
}
/**
* SM2 私钥解密
*
* @param privateKey
* @param encryptedText
* @return
*/
public static String sm2Decode(String privateKey, String encryptedText) {
SM2 sm2 = SmUtil.sm2(privateKey, null);
byte[] decryptBytes = sm2.decrypt(encryptedText, KeyType.PrivateKey);
return new String(decryptBytes);
}
/**
* SM2 私钥签名
*
* @param privateKey
* @param text
* @return
*/
public static String sm2PrivateSign(String privateKey, String text) {
SM2 sm2 = SmUtil.sm2(privateKey, null);
return sm2.signHex(HexUtil.encodeHexStr(text));
}
/**
* SM2 公钥验签
*
* @param publicKey
* @param signStr
* @param text
* @return
*/
public static boolean sm2PublicVerify(String publicKey, String signStr, String text) {
SM2 sm2 = SmUtil.sm2(null, publicKey);
return sm2.verifyHex(HexUtil.encodeHexStr(text), signStr);
}
/**
* SM2 公钥加密
*
* @param publicKey
* @param text
* @return
*/
public static String sm2Encode(String publicKey, String text) {
SM2 sm2 = SmUtil.sm2(null, publicKey);
byte[] encryptBytes = sm2.encrypt(text.getBytes(), KeyType.PublicKey);
return HexUtil.encodeHexStr(encryptBytes);
}
/**
* SM4 解密
*
* @param encryptedText
* @return
*/
public static String sm4Decode(String encryptedText) {
if (StringUtils.isEmpty(encryptedText)) {
return "";
}
SM4 sm4 = SmUtil.sm4(HexUtil.decodeHex(SM4Key));
return new String(sm4.decrypt(encryptedText));
}
/**
* SM4 加密
*
* @param text
* @return
*/
public static String sm4Encode(String text) {
SM4 sm4 = SmUtil.sm4(HexUtil.decodeHex(SM4Key));
return HexUtil.encodeHexStr(sm4.encrypt(text));
}
/**
* SM4 生成密钥
*/
public void generateSM4Key() {
byte[] sm4Key = SecureUtil.generateKey("SM4").getEncoded();
System.out.println("SM4密钥:" + HexUtil.encodeHexStr(sm4Key));
}
}
java hutool 国密2 国密4 加密解密 生成密钥
于 2024-02-06 18:04:24 首次发布