Java实现MD5和国密SM3摘要算法

一、JDK提供的默认MD5算法工具

MD5算法类型枚举

/**  * JDK提供的默认摘要算法.  *  * @author linzp  * @date 2022/2/8 16:46  */publicenumDigestAlgorithmEnum{/**      * MD5      */MD5("MD5"),/**      * MD2      */MD2("MD2"),/**      * SHA      */SHA("SHA"),/**      * SHA      */SHA1("SHA-1"),/**      * SHA2      */SHA224("SHA-224"),/**      * SHA2      */SHA256("SHA-256"),/**      * SHA5      */SHA384("SHA-384"),/**      * SHA5      */SHA512("SHA-512");/**      * 算法编码.      */privateString code;/**      * 无参      */DigestAlgorithmEnum(){}/**      * 构造.      * @param code      */DigestAlgorithmEnum(String code){this.code= code;}publicStringgetCode(){return code;}publicvoidsetCode(String code){this.code= code;}}

MD5算法工具类

importio.sugo.cloud.data.security.enums.DigestAlgorithmEnum;importjava.security.MessageDigest;importjava.security.NoSuchAlgorithmException;/**  * 常规摘要算法:MD5、SHA实现  *  * @author linzp  * @date 2022/2/8 16:44  */publicfinalclassMD5Util{/**      * 16进制      */privatestaticfinalString[] HEX_DIGITS={"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};/**      * 私有构造      */privateMD5Util(){}/**      * md5加密      *      * @param srcData      * @return      */publicstaticStringentrypt(DigestAlgorithmEnum digestAlgorithmEnum,byte[] srcData){byte[] secretBytes=null;try{             secretBytes=MessageDigest.getInstance(digestAlgorithmEnum.getCode()).digest(srcData);}catch(NoSuchAlgorithmException e){thrownewRuntimeException("this digest algorithm is not exists!");}returnbyteToHexString(secretBytes);}/**      * 转换16进制.      *      * @param bs      * @return      */publicstaticStringbyteToHexString(byte[] bs){StringBuffer sb=newStringBuffer();for(byte b: bs){             sb.append(byteToHexString(b));}return sb.toString();}/**      * 转换16进制.      *      * @param b      * @return      */privatestaticStringbyteToHexString(byte b){int n= b;if(n<0){             n=256+ n;}int d1= n/16;int d2= n%16;return HEX_DIGITS[d1]+ HEX_DIGITS[d2];}}

二、国密SM3摘要算法实现工具类

需要导入maven依赖

<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on --><dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.69</version></dependency>

国密SM3实现摘要算法加密工具类,可实现对文件的MD5加密

importorg.bouncycastle.crypto.digests.SM3Digest;importorg.bouncycastle.crypto.macs.HMac;importorg.bouncycastle.crypto.params.KeyParameter;importorg.bouncycastle.jce.provider.BouncyCastleProvider;importorg.bouncycastle.util.encoders.Hex;importjava.io.ByteArrayOutputStream;importjava.io.File;importjava.io.FileInputStream;importjava.io.IOException;importjava.security.MessageDigest;importjava.security.Security;/**  * 国密SM3摘要算法实现工具.  * 用于替换MD5、SHA算法  *  * @author linzp  * @date 2022/2/8 10:48  */publicfinalclassSM3Util{/**      * 私有构造器.      */privateSM3Util(){}// 拓展算法提供方,加载BC库.static{Security.addProvider(newBouncyCastleProvider());}/**      * SM3摘要算法逻辑      *      * @param srcData 待加密byte[]      * @return      */privatestaticbyte[]sm3(byte[] srcData){SM3Digest sm3Digest=newSM3Digest();         sm3Digest.update(srcData,0, srcData.length);byte[] hash=newbyte[sm3Digest.getDigestSize()];         sm3Digest.doFinal(hash,0);return hash;}/**      * 摘要算法加密      *      * @param srcData 待加密byte[]      * @return      */publicstaticStringencrypt(byte[] srcData){byte[] hash=sm3(srcData);String hexString=Hex.toHexString(hash);return hexString;}/**      * 指定密钥进行加密.      *      * @param key     密钥      * @param srcData 待加密byte[]      * @return      */privatestaticbyte[]hmacSm3(byte[] key,byte[] srcData){KeyParameter keyParameter=newKeyParameter(key);SM3Digest digest=newSM3Digest();HMac mac=newHMac(digest);         mac.init(keyParameter);         mac.update(srcData,0, srcData.length);byte[] hash=newbyte[mac.getMacSize()];         mac.doFinal(hash,0);return hash;}/**      * 指定密钥进行加密.      *      * @param key     密钥      * @param srcData 待加密byte[]      * @return      */publicstaticStringencrypt(byte[] key,byte[] srcData){byte[] hash=hmacSm3(key, srcData);String hexString=Hex.toHexString(hash);return hexString;}/**      * 基于BC库的摘要算法加密      *      * @param srcData 待加密byte[]      * @return      * @throws Exception      */privatestaticbyte[]sm3bc(byte[] srcData)throwsException{MessageDigest messageDigest=MessageDigest.getInstance("SM3","BC");byte[] digest= messageDigest.digest(srcData);return digest;}/**      * 基于BC库的摘要算法加密      *      * @param srcData 待加密byte[]      * @return      * @throws Exception      */publicstaticStringencryptBC(byte[] srcData)throwsException{byte[] hash=sm3bc(srcData);String hexString=Hex.toHexString(hash);return hexString;}/**      * 对文件进行摘要算法加密.      *      * @param file      * @return      */publicstaticStringencrypt(File file){//TODO-linzp 如使用大文件应该对此方法进行优化,避免出现OOMbyte[] srcData;FileInputStream fis=null;ByteArrayOutputStream bos=newByteArrayOutputStream();try{             fis=newFileInputStream(file);byte[] b=newbyte[1024];int n;while((n= fis.read(b))!=-1){                 bos.write(b,0, n);}             srcData= bos.toByteArray();}catch(Exception e){             e.printStackTrace();thrownewRuntimeException("file not found!");}finally{closeResoruce(fis, bos);}returnencrypt(srcData);}/**      * 关闭资源.      *      * @param fis      * @param bos      */privatestaticvoidcloseResoruce(FileInputStream fis,ByteArrayOutputStream bos){if(null!= fis){try{                 fis.close();}catch(IOException e){                 e.printStackTrace();}}if(null!= bos){try{                 bos.close();}catch(IOException e){                 e.printStackTrace();}}}}