Java封装实现SM3摘要计算
pom依赖
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-ext-jdk15on</artifactId>
<version>1.65</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
SM3算法工具类
package com.hl.magic.cipher.digest;
import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.crypto.macs.HMac;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
import org.junit.jupiter.api.Test;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.Security;
import java.util.UUID;
/**
* 自定义的摘要运算工具类
*
* @Author administrator
* @Date 2022/7/22 9:03
*/
public class DigestSm3Demo {
public static class Sm3Digest {
/**
* 对输入的原文做摘要
*
* @param srcData 输入的原文
* @return 摘要值(32字节)
*/
public static String digest(byte[] srcData) {
try {
SM3Digest sm3Digest = new SM3Digest();
sm3Digest.update(srcData, 0, srcData.length);
byte[] hashData = new byte[sm3Digest.getDigestSize()];
sm3Digest.doFinal(hashData, 0);
return ByteUtils.toHexString(hashData);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 使用随机密钥保护输入原文,并产生摘要结果
*
* @param srcData 输入的原文
* @param key 密钥(可以是随机密钥)
* @return 摘要值(32字节)
*/
private static String digestByKey(byte[] srcData, byte[] key) {
try {
KeyParameter keyParameter = new KeyParameter(key);
SM3Digest sm3Digest = new SM3Digest();
HMac mac = new HMac(sm3Digest);
mac.init(keyParameter);
mac.update(srcData, 0, srcData.length);
byte[] result = new byte[mac.getMacSize()];
mac.doFinal(result, 0);
return ByteUtils.toHexString(result);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
/**
* 通用型的摘要运算工具类,可以指定算法类对输入原文做相关摘要计算
* (关于算法类型,详见BouncyCastleProvider类的常量数组DIGESTS的定义值即可)
*/
public static class CommonDigest {
/**
* BC库计算SM3摘要
*
* @param algFlag 算法标识
* @param srcData 输入的原文
* @return 摘要值
*/
public static String digest(String algFlag, String srcData) {
try {
Security.addProvider(new BouncyCastleProvider());
MessageDigest msgDigest = MessageDigest.getInstance(algFlag, BouncyCastleProvider.PROVIDER_NAME);
byte[] digest = msgDigest.digest(srcData.getBytes(StandardCharsets.UTF_8));
return ByteUtils.toHexString(digest);
} catch (NoSuchAlgorithmException | NoSuchProviderException e) {
e.printStackTrace();
}
return null;
}
}
}
测试用例
@Test
public void digestTest() {
String srcData = "JAVA";
String digest = Sm3Digest.digest(srcData.getBytes(StandardCharsets.UTF_8));
System.out.println("Sm3Digest类中摘要运算结果:" + digest);
final String key = UUID.randomUUID().toString().replaceAll("-", "");
String digestByKey = Sm3Digest.digestByKey(srcData.getBytes(StandardCharsets.UTF_8), key.getBytes(StandardCharsets.UTF_8));
System.out.println("Sm3Digest类中摘要运算结果(key加密):" + digestByKey);
String doHash = CommonDigest.digest("SM3", srcData);
System.out.println("CommonDigest类的摘要运算结果:" + doHash);
}
输出结果
Sm3Digest类中摘要运算结果:41db8aa52383e49250bd5fd35f42cc011c45c40e964f526ca9a8294f4379e3b7
Sm3Digest类中摘要运算结果(key加密):3a453bd781cf2891709784f97940a4e29c08f2750be0643f093240a1429b9a4e
CommonDigest类的摘要运算结果:41db8aa52383e49250bd5fd35f42cc011c45c40e964f526ca9a8294f4379e3b7
使用工具看一下计算出来的数据