Java封装实现国密SM3摘要计算

2022-09-03 14:09:14

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

使用工具看一下计算出来的数据

  • 作者:洒家肉山大魔王
  • 原文链接:https://blog.csdn.net/qq_27706119/article/details/125926493
    更新时间:2022-09-03 14:09:14