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;
	}
}
相关推荐
一只爱打拳的程序猿9 分钟前
【Spring】更加简单的将对象存入Spring中并使用
java·后端·spring
杨荧11 分钟前
【JAVA毕业设计】基于Vue和SpringBoot的服装商城系统学科竞赛管理系统
java·开发语言·vue.js·spring boot·spring cloud·java-ee·kafka
minDuck13 分钟前
ruoyi-vue集成tianai-captcha验证码
java·前端·vue.js
为将者,自当识天晓地。31 分钟前
c++多线程
java·开发语言
daqinzl39 分钟前
java获取机器ip、mac
java·mac·ip
激流丶1 小时前
【Kafka 实战】如何解决Kafka Topic数量过多带来的性能问题?
java·大数据·kafka·topic
Themberfue1 小时前
Java多线程详解⑤(全程干货!!!)线程安全问题 || 锁 || synchronized
java·开发语言·线程·多线程·synchronized·
让学习成为一种生活方式1 小时前
R包下载太慢安装中止的解决策略-R语言003
java·数据库·r语言
晨曦_子画1 小时前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
南宫生2 小时前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法