说明
由于本人并不专于算法和密码学,所以如果发现工具类存在问题或者可优化地方,欢迎评论处提出。
工具类也可以直接使用封装过的依赖:https://github.com/notsayyu/dsy-sm-cipher/packages/1332757
maven依赖
<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on--><dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.54</version></dependency>
完整代码
packagecom.example.pass.common.utils;importorg.bouncycastle.crypto.digests.SM3Digest;importorg.bouncycastle.jce.provider.BouncyCastleProvider;importorg.bouncycastle.pqc.math.linearalgebra.ByteUtils;importjava.io.UnsupportedEncodingException;importjava.security.Security;importjava.util.Arrays;/**
* @description:
* @author: dsy
* @date: 2021/2/25 14:39
*/publicclassSm3Utils{privatestaticfinalString ENCODING="UTF-8";static{Security.addProvider(newBouncyCastleProvider());}/**
* sm3算法加密
*
* @param paramStr 待加密字符串
* @return 返回加密后,固定长度=32的16进制字符串
* @explain
*/publicstaticStringencrypt(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数组
*
* @param srcData
* @return
* @explain 生成对应的hash值
*/publicstaticbyte[]hash(byte[] srcData){SM3Digest digest=newSM3Digest();
digest.update(srcData,0, srcData.length);byte[] hash=newbyte[digest.getDigestSize()];
digest.doFinal(hash,0);return hash;}/**
* 判断源数据与加密数据是否一致
*
* @param srcStr 原字符串
* @param sm3HexString 16进制字符串
* @return 校验结果
* @explain 通过验证原数组和生成的hash数组是否为同一数组,验证2者是否为同一数据
*/publicstaticbooleanverify(String srcStr,String sm3HexString){boolean flag=false;try{byte[] srcData= srcStr.getBytes(ENCODING);byte[] sm3Hash=ByteUtils.fromHexString(sm3HexString);byte[] newHash=hash(srcData);if(Arrays.equals(newHash, sm3Hash)){
flag=true;}}catch(UnsupportedEncodingException e){
e.printStackTrace();}return flag;}