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

2022年9月22日12:13:17

一、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();}}}}
  • 作者:林志鹏JAVA
  • 原文链接:https://blog.csdn.net/m4330187/article/details/122828273
    更新时间:2022年9月22日12:13:17 ,共 4543 字。