所需jar包:
bcprov-jdk15on-1.59.jar
commons-lang3-3.1.jar
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 java.io.UnsupportedEncodingException; import java.security.Security; import java.util.Arrays; /** * sm3加密算法工具类 * @explain 加密与加密结果验证(不可逆算法) * @author Marydon * @creationTime 2018年7月5日上午10:01:24 * @version 1.0 * @since * @email marydon20170307@163.com */ public class Sm3Utils { private static final String ENCODING = "UTF-8"; static { Security.addProvider(new BouncyCastleProvider()); } }2.SM3加密
方式一:不提供密钥
/** * sm3算法加密 * @explain * @param paramStr * 待加密字符串 * @return 返回加密后,固定长度=32的16进制字符串 */ public static String encrypt(String paramStr){ // 将返回的hash值转换成16进制字符串 String resultHexString = ""; try { // 将字符串转换成byte数组 byte[] srcData = paramStr.getBytes(ENCODING); // 调用hash() byte[] resultHash = hash(srcData); // 将返回的hash值转换成16进制字符串 resultHexString = ByteUtils.toHexString(resultHash); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return resultHexString; } /** * 返回长度=32的byte数组 * @explain 生成对应的hash值 * @param srcData * @return */ public static byte[] hash(byte[] srcData) { SM3Digest digest = new SM3Digest(); digest.update(srcData, 0, srcData.length); byte[] hash = new byte[digest.getDigestSize()]; digest.doFinal(hash, 0); return hash; }方式二:自定义密钥
/** * 通过密钥进行加密 * @explain 指定密钥进行加密 * @param key * 密钥 * @param srcData * 被加密的byte数组 * @return */ public static byte[] hmac(byte[] key, byte[] srcData) { KeyParameter keyParameter = new KeyParameter(key); SM3Digest digest = new SM3Digest(); HMac mac = new HMac(digest); mac.init(keyParameter); mac.update(srcData, 0, srcData.length); byte[] result = new byte[mac.getMacSize()]; mac.doFinal(result, 0); return result; }
转载于:https://www.cnblogs.com/Marydon20170307/p/9303233.html
相关资源:SM2&SM3&SM4国密算法Java实现(含详细测试代码)