和 SM2 引入的包一样, SM2 为非对称算案发,SM3为散列数据(防止数据篡改和MD5加密类似),SM4 为对称算法
【烦人的加密算法】国密SM2的使用–Java版本
SM3算法:SM3杂凑算法是我国自主设计的密码杂凑算法,适用于商用密码应用中的数字签名和验证消息认证码的生成与验证以及随机数的生成,可满足多种密码应用的安全需求。为了保证杂凑算法的安全性,其产生的杂凑值的长度不应太短,例如MD5输出128比特杂凑值,输出长度太短,影响其安全性SHA-1算法的输出长度为160比特,SM3算法的输出长度为256比特,因此SM3算法的安全性要高于MD5算法和SHA-1算法。
import lombok.extern.slf4j.Slf4j;
import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.crypto.macs.HMac;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.util.encoders.Hex;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
/**
* SM3国密散列算法
*
* @author hcf
* @date 2022/1/4 11:35
*/
@Slf4j
public class SM3Utils {
private static final Charset CHARSET = StandardCharsets.UTF_8;
private static final String DEFAULT_XRO_KEY = "BC614E";
/**
* 16进制字符串 使用 SM3 生成 HASH 签名值算法
*
* @param hexString 16进制字符串
* @return
*/
public static String hexEncrypt(String hexString) {
byte[] srcData = Hex.decode(hexString);
byte[] encrypt = encrypt(srcData);
return Hex.toHexString(encrypt);
}
/**
* 16进制字符串 使用 SM3 生成 HASH 签名值算法
*
* @param hexKey 16进制密钥
* @param hexString 16进制字符串
* @return
*/
public static String hexEncrypt(String hexKey, String hexString) {
byte[] key = Hex.decode(hexKey);
byte[] srcData = Hex.decode(hexString);
byte[] encrypt = encrypt(key, srcData);
return Hex.toHexString(encrypt);
}
/**
* 普通文本 使用 SM3 生成 HASH 签名值算法
*
* @param plain 普通文本
* @return
*/
public static String plainEncrypt(String plain) {
byte[] plainBytes = plain.getBytes();
byte[] encrypt = encrypt(plainBytes);
return Hex.toHexString(encrypt);
}
/**
* 普通文本 使用 SM3 生成 HASH 签名值算法
*
* @param hexKey 密钥
* @param plain 普通文本
* @return
*/
public static String plainEncrypt(String hexKey, String plain) {
byte[] key = Hex.decode(hexKey);
byte[] plainBytes = plain.getBytes();
byte[] encrypt = encrypt(key, plainBytes);
return Hex.toHexString(encrypt);
}
/**
* SM3 计算 Hash数据
*
* @param srcData 数据
* @return
*/
public static byte[] encrypt(byte[] srcData) {
SM3Digest sm3Digest = new SM3Digest();
sm3Digest.update(srcData, 0, srcData.length);
byte[] encrypt = new byte[sm3Digest.getDigestSize()];
sm3Digest.doFinal(encrypt, 0);
return encrypt;
}
/**
* SM3 计算 Hash数据
*
* @param srcData 数据
* @return
*/
public static byte[] hash(byte[] srcData) {
return encrypt(srcData);
}
/**
* SM3 计算 Hash数据
*
* @param srcData 数据
* @return
*/
public static byte[] encrypt(byte[] key, byte[] srcData) {
KeyParameter keyParameter = new KeyParameter(key);
SM3Digest sm3Digest = new SM3Digest();
HMac hMac = new HMac(sm3Digest);
hMac.init(keyParameter);
hMac.update(srcData, 0, srcData.length);
sm3Digest.update(srcData, 0, srcData.length);
byte[] encrypt = new byte[hMac.getMacSize()];
sm3Digest.doFinal(encrypt, 0);
return encrypt;
}
}