Java sm3加密算法的实现
1.准备工作
所需jar包:
bcprov-jdk15on-1.59.jar
commons-lang3-3.1.jar
对应的maven依赖
org.bouncycastle bcprov-jdk15on 1.66
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 }
以上就是Javasm3加密算法的实现的详细内容,更多关于Javasm3加密算法的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。