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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。