⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 doubledesutil.java

📁 文件的加密解密代码主要是针对于DES和3DES MD5加密解密算法的功能实现
💻 JAVA
字号:
package com.zrx.Util;


import java.io.*;
import java.security.*;

import javax.crypto.*;
import javax.crypto.spec.*;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;

public class DoubleDesUtil {
	public static void main(String[] args) {
		String files = "e://test.txt.tdes";
		File file = new File(files);
		try {
			String key = getKeyAuto();
			System.out.println(key);
//			DesUtil.decrypt(file,
//					"F286378AAE43C24C07A2E9CBB04AA1455EB919F75D9B4ABF");
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
	}

	public static void encrypt(File fileIn, String sKey) {
		try {
			if (sKey.length() == 32) {
				byte[] bytK1 = getKeyByStr(sKey.substring(0, 16));
				byte[] bytK2 = getKeyByStr(sKey.substring(16, 32));

				FileInputStream fis = new FileInputStream(fileIn);
				byte[] bytIn = new byte[(int) fileIn.length()];
				for (int i = 0; i < fileIn.length(); i++) {
					bytIn[i] = (byte) fis.read();
				}
				// 加密,双重加密
				byte[] bytOut = encryptByDES(encryptByDES(bytIn,
						bytK1), bytK2);
				String fileOut = fileIn.getPath() + ".tdes";
				FileOutputStream fos = new FileOutputStream(fileOut);
				for (int i = 0; i < bytOut.length; i++) {
					fos.write((int) bytOut[i]);
				}
				fos.close();
				// 加密成功
			} else {
				// 加密失败
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 解密函数 输入: 要解密的文件,密码(由0-F组成,共48个字符,表示3个8位的密码)如:
	 * AD67EA2F3BE6E5ADD368DFE03120B5DF92A8FD8FEC2F0746 其中: AD67EA2F3BE6E5AD
	 * DES密码一 D368DFE03120B5DF DES密码二 92A8FD8FEC2F0746 DES密码三 输出:
	 * 对输入的文件解密后,保存到用户指定的文件中。
	 */
	public static void decrypt(File fileIn, String sKey,String fileOuts) {
		try {
			if (sKey.length() == 32) {
				String strPath = fileIn.getPath();
				if (strPath.substring(strPath.length() - 5).toLowerCase()
						.equals(".tdes")) {
					strPath = strPath.substring(0, strPath.length() - 5);
				} else {
					// 不是合法的加密文件
					return;
				}
				byte[] bytK1 = getKeyByStr(sKey.substring(0, 16));
				byte[] bytK2 = getKeyByStr(sKey.substring(16, 32));

				FileInputStream fis = new FileInputStream(fileIn);
				byte[] bytIn = new byte[(int) fileIn.length()];
				for (int i = 0; i < fileIn.length(); i++) {
					bytIn[i] = (byte) fis.read();
				}
				// 解密
				byte[] bytOut = decryptByDES(decryptByDES(bytIn,
						bytK2), bytK1);

				// 定义一个解密路径
				File fileOut = new File(fileOuts);
				fileOut.createNewFile();
				FileOutputStream fos = new FileOutputStream(fileOut);
				for (int i = 0; i < bytOut.length; i++) {
					fos.write((int) bytOut[i]);
				}
				fos.close();
				// 提示成功
			} else {
				// 提示失败
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 用DES方法加密输入的字节 bytKey需为8字节长,是加密的密码
	 */
	public static byte[] encryptByDES(byte[] bytP, byte[] bytKey)
			throws Exception {
		DESKeySpec desKS = new DESKeySpec(bytKey);
		SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
		SecretKey sk = skf.generateSecret(desKS);
		Cipher cip = Cipher.getInstance("DES");
		cip.init(Cipher.ENCRYPT_MODE, sk);
		return cip.doFinal(bytP);
	}

	/**
	 * 用DES方法解密输入的字节 bytKey需为8字节长,是解密的密码
	 */
	public static byte[] decryptByDES(byte[] bytE, byte[] bytKey)
			throws Exception {
		DESKeySpec desKS = new DESKeySpec(bytKey);
		SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
		SecretKey sk = skf.generateSecret(desKS);
		Cipher cip = Cipher.getInstance("DES");
		cip.init(Cipher.DECRYPT_MODE, sk);
		return cip.doFinal(bytE);
	}

	/**
	 * 输入密码的字符形式,返回字节数组形式。 如输入字符串:AD67EA2F3BE6E5AD
	 * 返回字节数组:{173,103,234,47,59,230,229,173}
	 */
	public static byte[] getKeyByStr(String str) {
		byte[] bRet = new byte[str.length() / 2];
		for (int i = 0; i < str.length() / 2; i++) {
			Integer itg = new Integer(16 * getChrInt(str.charAt(2 * i))
					+ getChrInt(str.charAt(2 * i + 1)));
			bRet[i] = itg.byteValue();
		}
		return bRet;
	}

	/**
	 * 计算一个16进制字符的10进制值 输入:0-F
	 */
	public static int getChrInt(char chr) {
		int iRet = 0;
		if (chr == "0".charAt(0))
			iRet = 0;
		if (chr == "1".charAt(0))
			iRet = 1;
		if (chr == "2".charAt(0))
			iRet = 2;
		if (chr == "3".charAt(0))
			iRet = 3;
		if (chr == "4".charAt(0))
			iRet = 4;
		if (chr == "5".charAt(0))
			iRet = 5;
		if (chr == "6".charAt(0))
			iRet = 6;
		if (chr == "7".charAt(0))
			iRet = 7;
		if (chr == "8".charAt(0))
			iRet = 8;
		if (chr == "9".charAt(0))
			iRet = 9;
		if (chr == "A".charAt(0))
			iRet = 10;
		if (chr == "B".charAt(0))
			iRet = 11;
		if (chr == "C".charAt(0))
			iRet = 12;
		if (chr == "D".charAt(0))
			iRet = 13;
		if (chr == "E".charAt(0))
			iRet = 14;
		if (chr == "F".charAt(0))
			iRet = 15;
		return iRet;
	}

	private static String getByteStr(byte[] byt) {
		String strRet = "";
		for (int i = 0; i < byt.length; i++) {
			// System.out.println(byt[i]);
			strRet += getHexValue((byt[i] & 240) / 16);
			strRet += getHexValue(byt[i] & 15);
		}
		return strRet;
	}

	private static String getHexValue(int s) {
		String sRet = null;
		switch (s) {
		case 0:
			sRet = "0";
			break;
		case 1:
			sRet = "1";
			break;
		case 2:
			sRet = "2";
			break;
		case 3:
			sRet = "3";
			break;
		case 4:
			sRet = "4";
			break;
		case 5:
			sRet = "5";
			break;
		case 6:
			sRet = "6";
			break;
		case 7:
			sRet = "7";
			break;
		case 8:
			sRet = "8";
			break;
		case 9:
			sRet = "9";
			break;
		case 10:
			sRet = "A";
			break;
		case 11:
			sRet = "B";
			break;
		case 12:
			sRet = "C";
			break;
		case 13:
			sRet = "D";
			break;
		case 14:
			sRet = "E";
			break;
		case 15:
			sRet = "F";
		}
		return sRet;
	}

	/***************************************************************************
	 * 自动生成序列值
	 * 
	 * @throws NoSuchAlgorithmException
	 */
	public static String getKeyAuto() throws NoSuchAlgorithmException {
		KeyGenerator kg = KeyGenerator.getInstance("DES");
		kg.init(56);
		Key ke = kg.generateKey();
		byte[] bytK1 = ke.getEncoded();
		ke = kg.generateKey();
		byte[] bytK2 = ke.getEncoded();
		return getByteStr(bytK1) + getByteStr(bytK2);
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -