sm3/md5对文件夹加密

java 复制代码
package com.hidy.dangan.common.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.util.encoders.Hex;

public class MD5Util
{
    public static final int BUFFER = 2048;
    protected static MessageDigest messagedigest;
    protected static char[] hexDigits_5;
    private static List<File> dic;
    private static final String[] hexDigits;
    
    static {
        MD5Util.messagedigest = null;
        MD5Util.hexDigits_5 = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
        try {
            MD5Util.messagedigest = MessageDigest.getInstance("MD5");
        }
        catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        MD5Util.dic = null;
        hexDigits = new String[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
    }
    
    public static boolean isMatch(final String regex, final String orginal) {
        if (orginal == null || orginal.trim().equals("")) {
            return false;
        }
        final Pattern pattern = Pattern.compile(regex);
        final Matcher isNum = pattern.matcher(orginal);
        return isNum.matches();
    }
    
    public static boolean isNumeric(final String strValue) {
        for (int i = 0; i < strValue.length(); ++i) {
            if (!Character.isDigit(strValue.charAt(i))) {
                return false;
            }
        }
        return true;
    }
    
    public static boolean isNull(final Object obj) {
        return obj == null || "".equals(obj);
    }
    
    public static boolean notNull(final Object obj) {
        return obj != null && !"".equals(obj.toString());
    }
    
    public static String md5Encode(final byte[] b, final String algorithm) {
        String resultString = null;
        try {
            final MessageDigest md = MessageDigest.getInstance(algorithm);
            resultString = byteArrayToHexString(md.digest(b));
        }
        catch (Exception ex) {
            resultString = null;
        }
        return resultString;
    }
    
    public static String md5Encode(final String str, final String algorithm) {
        return md5Encode(str.getBytes(), algorithm);
    }
    
    public static String md5Encode(final File file, final String algorithm) {
        String md5 = "";
        if (file.exists() && file.isFile()) {
            md5 = getFileMD5String(file);
        }
        else if (file.exists() && file.isDirectory()) {
            MD5Util.dic = new ArrayList<File>();
            readDirectory(file);
            FileInputStream in = null;
            try {
                final byte[] b = new byte[1024];
                final MessageDigest md6 = MessageDigest.getInstance(algorithm);
                for (final File f : MD5Util.dic) {
                    if (!"\u8bf4\u660e\u6587\u4ef6".equals(f.getName())) {
                        in = new FileInputStream(f);
                        while (in.read(b) != -1) {
                            md6.update(b);
                        }
                        in.close();
                    }
                }
                md5 = byteArrayToHexString(md6.digest());
            }
            catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
            catch (FileNotFoundException e2) {
                e2.printStackTrace();
            }
            catch (IOException e3) {
                e3.printStackTrace();
            }
            finally {
                try {
                    if (in != null) {
                        in.close();
                        in = null;
                    }
                }
                catch (Exception e4) {
                    e4.printStackTrace();
                }
            }
            try {
                if (in != null) {
                    in.close();
                    in = null;
                }
            }
            catch (Exception e4) {
                e4.printStackTrace();
            }
        }
        return md5;
    }
    
    public static String getFileMD5String(final File file) {
        FileInputStream in = null;
        FileChannel ch = null;
        try {
            in = new FileInputStream(file);
            ch = in.getChannel();
            final MappedByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY, 0L, file.length());
            MD5Util.messagedigest.update(byteBuffer);
        }
        catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        catch (IOException e2) {
            e2.printStackTrace();
        }
        finally {
            if (notNull(in)) {
                try {
                    in.close();
                }
                catch (IOException e3) {
                    e3.printStackTrace();
                }
            }
            if (notNull(ch)) {
                try {
                    ch.close();
                }
                catch (IOException e3) {
                    e3.printStackTrace();
                }
            }
        }
        if (notNull(in)) {
            try {
                in.close();
            }
            catch (IOException e3) {
                e3.printStackTrace();
            }
        }
        if (notNull(ch)) {
            try {
                ch.close();
            }
            catch (IOException e3) {
                e3.printStackTrace();
            }
        }
        return bufferToHex(MD5Util.messagedigest.digest());
    }
    
    private static String bufferToHex(final byte[] bytes) {
        return bufferToHex(bytes, 0, bytes.length);
    }
    
    private static String bufferToHex(final byte[] bytes, final int m, final int n) {
        final StringBuffer stringbuffer = new StringBuffer(2 * n);
        for (int k = m + n, l = m; l < k; ++l) {
            appendHexPair(bytes[l], stringbuffer);
        }
        return stringbuffer.toString();
    }
    
    private static void appendHexPair(final byte bt, final StringBuffer stringbuffer) {
        final char c0 = MD5Util.hexDigits_5[(bt & 0xF0) >> 4];
        final char c2 = MD5Util.hexDigits_5[bt & 0xF];
        stringbuffer.append(c0);
        stringbuffer.append(c2);
    }
    
    private static void readDirectory(final File directory) {
        final File[] nodeFiles = directory.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(final File dir, final String name) {
                boolean result = true;
                if (name.endsWith(".md5") 
                		|| name.equalsIgnoreCase("\u6587\u4ef6\u6821\u9a8c\u7801.md5") 
                		|| name.equalsIgnoreCase("\u683c\u5f0f\u5305\u6821\u9a8c\u7801.md5") 
                		|| name.equalsIgnoreCase(".DS_Store") 
                		|| name.equalsIgnoreCase("\u7535\u5b50\u6863\u6848\u79fb\u4ea4\u4e0e\u63a5\u6536\u767b\u8bb0\u8868.pdf") 
                		|| name.equalsIgnoreCase("\u7535\u5b50\u6863\u6848\u79fb\u4ea4\u4e0e\u63a5\u6536\u767b\u8bb0\u8868.xml")
                		||name.endsWith(".sm3") 
                		|| name.equalsIgnoreCase("\u6587\u4ef6\u6821\u9a8c\u7801.sm3") 
                		|| name.equalsIgnoreCase("\u683c\u5f0f\u5305\u6821\u9a8c\u7801.sm3") 
                		) {
                    result = false;
                }
                return result;
            }
        });
        final List<File> fileList = new ArrayList<File>();
        Collections.addAll(fileList, nodeFiles);
        Collections.sort(fileList, new Comparator<File>() {
            @Override
            public int compare(final File o1, final File o2) {
                return o1.getName().compareTo(o2.getName());
            }
        });
        for (final File file : fileList) {
            if (file.isDirectory()) {
                readDirectory(file);
            }
            else {
                MD5Util.dic.add(file);
            }
        }
    }
    
    public static String byteArrayToHexString(final byte[] b) {
        final StringBuffer resultSb = new StringBuffer();
        for (int i = 0; i < b.length; ++i) {
            resultSb.append(byteToHexString(b[i]));
        }
        return resultSb.toString();
    }
    
    private static String byteToHexString(final byte b) {
        int n = b;
        if (n < 0) {
            n += 256;
        }
        final int d1 = n / 16;
        final int d2 = n % 16;
        return String.valueOf(MD5Util.hexDigits[d1]) + MD5Util.hexDigits[d2];
    }
    
    public static boolean isAcronym(final String word) {
        for (int i = 0; i < word.length(); ++i) {
            final char c = word.charAt(i);
            if (!Character.isLowerCase(c)) {
                return false;
            }
        }
        return true;
    }
    
    public static boolean isNotAcronym(final String word) {
        for (int i = 0; i < word.length(); ++i) {
            final char c = word.charAt(i);
            if (Character.isLowerCase(c)) {
                return false;
            }
        }
        return true;
    }
    
    public static boolean isChineseChar(final String str) {
        boolean temp = false;
        final Pattern p = Pattern.compile("[\u4e00-\u9fa5]");
        final Matcher m = p.matcher(str);
        if (m.find()) {
            temp = true;
        }
        return temp;
    }
    
    public static Map<String, String> readProp(final File file) {
        final Map<String, String> prop = new HashMap<String, String>();
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "gbk"));
            String line = null;
            while ((line = reader.readLine()) != null) {
                final String str = line.trim();
                if (!"".equals(str) && str.split("=").length == 2) {
                    prop.put(str.split("=")[0].trim(), str.split("=")[1].trim());
                }
                else {
                    if ("".equals(str) || str.split("=").length != 1) {
                        continue;
                    }
                    prop.put(str.split("=")[0].trim(), "");
                }
            }
        }
        catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        catch (Exception e2) {
            e2.printStackTrace();
        }
        finally {
            try {
                if (reader != null) {
                    reader.close();
                    reader = null;
                }
            }
            catch (IOException e3) {
                e3.printStackTrace();
            }
        }
        try {
            if (reader != null) {
                reader.close();
                reader = null;
            }
        }
        catch (IOException e3) {
            e3.printStackTrace();
        }
        return prop;
    }
    
    public static String md5Encode(final byte[] b) {
        String resultString = null;
        try {
            final MessageDigest md = MessageDigest.getInstance("MD5");
            resultString = byteArrayToHexString(md.digest(b));
        }
        catch (Exception ex) {
            resultString = null;
        }
        return resultString;
    }
    
    public static String md5Encode(final String str) {
        return md5Encode(str.getBytes());
    }

	public static String sm3Encode(final File file) {
        String md5 = "";
        if (file.exists() && file.isFile()) {
            md5 = getFileSM3String(file);
        }
        else if (file.exists() && file.isDirectory()) {
            MD5Util.dic = new ArrayList<File>();
            readDirectory(file);
            FileInputStream in = null;
            try {
                final byte[] b = new byte[1024];
                SM3Digest sm3Digest = new SM3Digest();
                byte[] digest = new byte[new SM3Digest().getDigestSize()];
                for (final File f : MD5Util.dic) {
                    if (!"\u8bf4\u660e\u6587\u4ef6".equals(f.getName())) {
                        in = new FileInputStream(f);
                        while (in.read(b) != -1) {
                        	sm3Digest.update(b,0,b.length);
                        	sm3Digest.doFinal(digest, 0);
                        }
                        in.close();
                    }
                }
                md5 = new String(Hex.encode(digest));
            }
            catch (FileNotFoundException e2) {
                e2.printStackTrace();
            }
            catch (IOException e3) {
                e3.printStackTrace();
            }
            finally {
                try {
                    if (in != null) {
                        in.close();
                        in = null;
                    }
                }
                catch (Exception e4) {
                    e4.printStackTrace();
                }
            }
            try {
                if (in != null) {
                    in.close();
                    in = null;
                }
            }
            catch (Exception e4) {
                e4.printStackTrace();
            }
        }
        return md5;
    }
	public static String getFileSM3String(final File file) {
        FileInputStream in = null;
        final byte[] b = new byte[1024];
        FileChannel ch = null;
        SM3Digest sm3Digest = new SM3Digest();
        byte[] digest = new byte[new SM3Digest().getDigestSize()];
        try {
        	in = new FileInputStream(file);
            while (in.read(b) != -1) {
            	sm3Digest.update(b,0,b.length);
            	sm3Digest.doFinal(digest, 0);
            }
            in.close();
        }
        catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        catch (IOException e2) {
            e2.printStackTrace();
        }
        finally {
            if (notNull(in)) {
                try {
                    in.close();
                }
                catch (IOException e3) {
                    e3.printStackTrace();
                }
            }
            if (notNull(ch)) {
                try {
                    ch.close();
                }
                catch (IOException e3) {
                    e3.printStackTrace();
                }
            }
        }
        if (notNull(in)) {
            try {
                in.close();
            }
            catch (IOException e3) {
                e3.printStackTrace();
            }
        }
        if (notNull(ch)) {
            try {
                ch.close();
            }
            catch (IOException e3) {
                e3.printStackTrace();
            }
        }
        return new String(Hex.encode(digest));
    }
	
	public static void main(String[] args) throws Exception {
		
		/*
		 * String md5 = sm3Encode(new
		 * File("C:\\home\\bjyq\\apps\\dag\\gdb\\002-WS-2024-D30-0001")); File md5XML =
		 * new
		 * File("C:\\home\\bjyq\\apps\\dag\\gdb\\002-WS-2024-D30-0001"+"/格式包校验码.sm3");
		 * if (!md5XML.exists()) { md5XML.createNewFile(); } FileWriter resultFile = new
		 * FileWriter(md5XML); PrintWriter myFile = new PrintWriter(resultFile);
		 * myFile.println(md5); myFile.close(); myFile = null; resultFile.close();
		 * resultFile = null;
		 */
		verify("C:\\home\\bjyq\\apps\\dag\\gdb\\002-WS-2024-D30-0001");
	}
	public static boolean verify(String filepath) {
		String md5 = sm3Encode(new File(filepath));
		String readfilesm3=readfilesm3(new File(filepath));
		System.out.println("md5===="+md5);
		System.out.println("readfilesm3===="+readfilesm3);
		System.out.println(md5.equalsIgnoreCase(readfilesm3));
		return md5.equalsIgnoreCase(readfilesm3);
		
	}

	private static String readfilesm3(File folderfile) {
		String sm3str="";
		if(!folderfile.exists()) {
			return "文件不存在!";
		}
		if(folderfile.isDirectory()) {
			for (File file : folderfile.listFiles()) {
                if (file.isDirectory()) {
                	readfilesm3(file);
                } else {
                    if(("\u002f\u683c\u5f0f\u5305\u6821\u9a8c\u7801"+".sm3").equalsIgnoreCase(file.getName())||"格式包校验码.sm3".equalsIgnoreCase(file.getName())) {
                    	try (Scanner sc = new Scanner(new FileReader(file))) {
                    	      while (sc.hasNextLine()) {  //按行读取字符串
                    	         String line = sc.nextLine();
                    	         sm3str+=line;
                    	      }
                    	   } catch (IOException e) {
							e.printStackTrace();
						}
                    }
                }
            }
		}
		return sm3str;
	}
}
相关推荐
Seven972 分钟前
Mybatis基础操作
java
希望永不加班9 分钟前
SpringBoot 多模块项目搭建:service/dao/web分层设计
java·前端·spring boot·后端·spring
星晨雪海11 分钟前
springboot 增删改查全套流程
java·spring boot·spring
Devin~Y12 分钟前
高并发内容社区实战面试:从 Java 基础到 Spring Cloud、Kafka、Redis、RAG 搜索全解析
java·spring boot·redis·spring cloud·kafka·向量数据库·rag
C雨后彩虹14 分钟前
箱子之字形摆放
java·数据结构·算法·华为·面试
star-yp22 分钟前
vibe coding 博客管理系统
java·spring boot·spring·ai·ai编程
小江的记录本23 分钟前
【JEECG Boot】JEECG Boot 系统性知识体系全方位结构化总结
java·前端·spring boot·后端·python·spring·spring cloud
Mr.wangh24 分钟前
Spring原理(Bean的生命周期)
java·前端·spring
派大星酷27 分钟前
Java 多线程创建方式
java·开发语言·多线程
棉花骑士10 小时前
【AI Agent】面向 Java 工程师的Claude Code Harness 学习指南
java·开发语言