java sm3加密算法
本文内容纲要:
-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