首页 文章资讯内容详情

java sm3加密算法

2026-06-01 4 花语

本文内容纲要:

-1.准备工作 -3.加密数据校验 -4.测试 -相关推荐:

1.准备工作

所需jar包:

bcprov-jdk15on-1.59.jar

commons-lang3-3.1.jar

20200901

对应的maven依赖

<!--sm3,sm4加密算法--> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.66</version> </dependency> importorg.bouncycastle.crypto.digests.SM3Digest; importorg.bouncycastle.crypto.macs.HMac; importorg.bouncycastle.crypto.params.KeyParameter; importorg.bouncycastle.jce.provider.BouncyCastleProvider; importorg.bouncycastle.pqc.math.linearalgebra.ByteUtils; importjava.io.UnsupportedEncodingException; importjava.security.Security; importjava.util.Arrays; /** *sm3加密算法工具类 *@explain加密与加密结果验证(不可逆算法) *@authorMarydon *@creationTime2018年7月5日上午10:01:24 *@version1.0 *@since *@emailmarydon20170307@163.com */ publicclassSm3Utils{ privatestaticfinalStringENCODING="UTF-8"; static{ Security.addProvider(newBouncyCastleProvider()); } }

2.SM3加密

方式一:不提供密钥

/** *sm3算法加密 *@explain *@paramparamStr *待加密字符串 *@return返回加密后,固定长度=32的16进制字符串 */ publicstaticStringencrypt(StringparamStr){ //将返回的hash值转换成16进制字符串 StringresultHexString=""; try{ //将字符串转换成byte数组 byte[]srcData=paramStr.getBytes(ENCODING); //调用hash() byte[]resultHash=hash(srcData); //将返回的hash值转换成16进制字符串 resultHexString=ByteUtils.toHexString(resultHash); }catch(UnsupportedEncodingExceptione){ e.printStackTrace(); } returnresultHexString; } /** *返回长度=32的byte数组 *@explain生成对应的hash值 *@paramsrcData *@return */ publicstaticbyte[]hash(byte[]srcData){ SM3Digestdigest=newSM3Digest(); digest.update(srcData,0,srcData.length); byte[]hash=newbyte[digest.getDigestSize()]; digest.doFinal(hash,0); returnhash; }

方式二:自定义密钥

/** *通过密钥进行加密 *@explain指定密钥进行加密 *@paramkey *密钥 *@paramsrcData *被加密的byte数组 *@return */ publicstaticbyte[]hmac(byte[]key,byte[]srcData){ KeyParameterkeyParameter=newKeyParameter(key); SM3Digestdigest=newSM3Digest(); HMacmac=newHMac(digest); mac.init(keyParameter); mac.update(srcData,0,srcData.length); byte[]result=newbyte[mac.getMacSize()]; mac.doFinal(result,0); returnresult; }

3.加密数据校验

/** *判断源数据与加密数据是否一致 *@explain通过验证原数组和生成的hash数组是否为同一数组,验证2者是否为同一数据 *@paramsrcStr *原字符串 *@paramsm3HexString *16进制字符串 *@return校验结果 */ publicstaticbooleanverify(StringsrcStr,Stringsm3HexString){ booleanflag=false; try{ byte[]srcData=srcStr.getBytes(ENCODING); byte[]sm3Hash=ByteUtils.fromHexString(sm3HexString); byte[]newHash=hash(srcData); if(Arrays.equals(newHash,sm3Hash)) flag=true; }catch(UnsupportedEncodingExceptione){ e.printStackTrace(); } returnflag; }

4.测试

publicstaticvoidmain(String[]args){ //测试二:json Stringjson="{\"name\":\"Marydon\",\"website\":\"http://www.cnblogs.com/Marydon20170307\"}"; Stringhex=Sm3Utils.encrypt(json); System.out.println(hex);//0b0880f6f2ccd817809a432420e42b66d3772dc18d80789049d0f9654efeae5c //验证加密后的16进制字符串与加密前的字符串是否相同 booleanflag=Sm3Utils.verify(json,hex); System.out.println(flag);//true }

相关推荐:

javasm4国密算法加密、解密 javaAES加密、解密 javaHMAC_SHA1加密算法

本文内容总结:1.准备工作,3.加密数据校验,4.测试,相关推荐:,

原文链接:https://www.cnblogs.com/Marydon20170307/p/9303233.html