当前位置: 移动技术网 > IT编程>开发语言>Java > java常用工具类之DES和Base64加密解密类

java常用工具类之DES和Base64加密解密类

2019年07月22日  | 移动技术网IT编程  | 我要评论

一、des加密和解密

package com.itjh.javautil;

import java.io.unsupportedencodingexception;
import java.security.invalidkeyexception;
import java.security.nosuchalgorithmexception;
import java.security.securerandom;
import java.security.spec.invalidkeyspecexception;

import javax.crypto.badpaddingexception;
import javax.crypto.cipher;
import javax.crypto.illegalblocksizeexception;
import javax.crypto.keygenerator;
import javax.crypto.nosuchpaddingexception;
import javax.crypto.secretkey;
import javax.crypto.secretkeyfactory;
import javax.crypto.spec.deskeyspec;

/**
 * des加密和解密。
 * 
 * @author 宋立君
 * @date 2014年07月03日
 */
public class desutil {

	/** 安全密钥 */
	private string keydata = "abcdefghijklmnopqrstwxyzabcdefghijklmnopqrstwxyz0123456789-_.";

	/**
	 * 功能:构造
	 * 
	 * @author 宋立君
	 * @date 2014年07月03日
	 */
	public desutil() {
	}

	/**
	 * 功能:构造
	 * 
	 * @author 宋立君
	 * @date 2014年07月03日
	 * @param keydata
	 *  key
	 */
	public desutil(string key) {
		this.keydata = key;
	}

	/**
	 * 功能:加密 (utf-8)
	 * 
	 * @author 宋立君
	 * @date 2014年07月03日
	 * @param source
	 *  源字符串
	 * @param charset
	 *  编码
	 * @return string
	 * @throws unsupportedencodingexception
	 *  编码异常
	 */
	public string encrypt(string source) throws unsupportedencodingexception {
		return encrypt(source, "utf-8");
	}

	/**
	 * 
	 * 功能:解密 (utf-8)
	 * 
	 * @author 宋立君
	 * @date 2014年07月03日
	 * @param encrypteddata
	 *  被加密后的字符串
	 * @return string
	 * @throws unsupportedencodingexception
	 *  编码异常
	 */
	public string decrypt(string encrypteddata)
			throws unsupportedencodingexception {
		return decrypt(encrypteddata, "utf-8");
	}

	/**
	 * 功能:加密
	 * 
	 * @author 宋立君
	 * @date 2014年07月03日
	 * @param source
	 *  源字符串
	 * @param charset
	 *  编码
	 * @return string
	 * @throws unsupportedencodingexception
	 *  编码异常
	 */
	public string encrypt(string source, string charset)
			throws unsupportedencodingexception {
		string encrypt = null;
		byte[] ret = encrypt(source.getbytes(charset));
		encrypt = new string(base64.encode(ret));
		return encrypt;
	}

	/**
	 * 
	 * 功能:解密
	 * 
	 * @author 宋立君
	 * @date 2014年07月03日
	 * @param encrypteddata
	 *  被加密后的字符串
	 * @param charset
	 *  编码
	 * @return string
	 * @throws unsupportedencodingexception
	 *  编码异常
	 */
	public string decrypt(string encrypteddata, string charset)
			throws unsupportedencodingexception {
		string descrypteddata = null;
		byte[] ret = descrypt(base64.decode(encrypteddata.tochararray()));
		descrypteddata = new string(ret, charset);
		return descrypteddata;
	}

	/**
	 * 加密数据 用生成的密钥加密原始数据
	 * 
	 * @param primarydata
	 *  原始数据
	 * @return byte[]
	 * @author 宋立君
	 * @date 2014年07月03日
	 */
	private byte[] encrypt(byte[] primarydata) {

		/** 取得安全密钥 */
		byte rawkeydata[] = getkey();

		/** des算法要求有一个可信任的随机数源 */
		securerandom sr = new securerandom();

		/** 使用原始密钥数据创建deskeyspec对象 */
		deskeyspec dks = null;
		try {
			dks = new deskeyspec(keydata.getbytes());
		} catch (invalidkeyexception e) {
			e.printstacktrace();
		}

		/** 创建一个密钥工厂 */
		secretkeyfactory keyfactory = null;
		try {
			keyfactory = secretkeyfactory.getinstance("des");
		} catch (nosuchalgorithmexception e) {
			e.printstacktrace();
		}

		/** 用密钥工厂把deskeyspec转换成一个secretkey对象 */
		secretkey key = null;
		try {
			key = keyfactory.generatesecret(dks);
		} catch (invalidkeyspecexception e) {
			e.printstacktrace();
		}

		/** cipher对象实际完成加密操作 */
		cipher cipher = null;
		try {
			cipher = cipher.getinstance("des");
		} catch (nosuchalgorithmexception e) {
			e.printstacktrace();
		} catch (nosuchpaddingexception e) {
			e.printstacktrace();
		}

		/** 用密钥初始化cipher对象 */
		try {
			cipher.init(cipher.encrypt_mode, key, sr);
		} catch (invalidkeyexception e) {
			e.printstacktrace();
		}

		/** 正式执行加密操作 */
		byte encrypteddata[] = null;
		try {
			encrypteddata = cipher.dofinal(primarydata);
		} catch (illegalstateexception e) {
			e.printstacktrace();
		} catch (illegalblocksizeexception e) {
			e.printstacktrace();
		} catch (badpaddingexception e) {
			e.printstacktrace();
		}

		/** 返回加密数据 */
		return encrypteddata;
	}

	/**
	 * 用密钥解密数据
	 * 
	 * @param encrypteddata
	 *  加密后的数据
	 * @return byte[]
	 * @author 宋立君
	 * @date 2014年07月03日
	 */
	private byte[] descrypt(byte[] encrypteddata) {

		/** des算法要求有一个可信任的随机数源 */
		securerandom sr = new securerandom();

		/** 取得安全密钥 */
		byte rawkeydata[] = getkey();

		/** 使用原始密钥数据创建deskeyspec对象 */
		deskeyspec dks = null;
		try {
			dks = new deskeyspec(keydata.getbytes());
		} catch (invalidkeyexception e) {
			e.printstacktrace();
		}

		/** 创建一个密钥工厂 */
		secretkeyfactory keyfactory = null;
		try {
			keyfactory = secretkeyfactory.getinstance("des");
		} catch (nosuchalgorithmexception e) {
			e.printstacktrace();
		}

		/** 用密钥工厂把deskeyspec转换成一个secretkey对象 */
		secretkey key = null;
		try {
			key = keyfactory.generatesecret(dks);
		} catch (invalidkeyspecexception e) {
			e.printstacktrace();
		}

		/** cipher对象实际完成加密操作 */
		cipher cipher = null;
		try {
			cipher = cipher.getinstance("des");
		} catch (nosuchalgorithmexception e) {
			e.printstacktrace();
		} catch (nosuchpaddingexception e) {
			e.printstacktrace();
		}

		/** 用密钥初始化cipher对象 */
		try {
			cipher.init(cipher.decrypt_mode, key, sr);
		} catch (invalidkeyexception e) {
			e.printstacktrace();
		}

		/** 正式执行解密操作 */
		byte decrypteddata[] = null;
		try {
			decrypteddata = cipher.dofinal(encrypteddata);
		} catch (illegalstateexception e) {
			e.printstacktrace();
		} catch (illegalblocksizeexception e) {
			e.printstacktrace();
		} catch (badpaddingexception e) {
			e.printstacktrace();
		}

		return decrypteddata;
	}

	/**
	 * 取得安全密钥 此方法作废,因为每次key生成都不一样导致解密加密用的密钥都不一样, 从而导致given final block not
	 * properly padded错误.
	 * 
	 * @return byte数组
	 * @author 宋立君
	 * @date 2014年07月03日
	 */
	private byte[] getkey() {

		/** des算法要求有一个可信任的随机数源 */
		securerandom sr = new securerandom();

		/** 为我们选择的des算法生成一个密钥生成器对象 */
		keygenerator kg = null;
		try {
			kg = keygenerator.getinstance("des");
		} catch (nosuchalgorithmexception e) {
			e.printstacktrace();
		}
		kg.init(sr);

		/** 生成密钥工具类 */
		secretkey key = kg.generatekey();

		/** 生成密钥byte数组 */
		byte rawkeydata[] = key.getencoded();

		return rawkeydata;
	}

}

二、base64加密和解密

package com.itjh.javautil;

import java.io.*;

/**
 * base64 编码和解码。
 * 
 * @author 宋立君
 * @date 2014年07月03日
 */
public class base64 {

	public base64() {
	}

	/**
	 * 功能:编码字符串
	 * 
	 * @author 宋立君
	 * @date 2014年07月03日
	 * @param data
	 *  源字符串
	 * @return string
	 */
	public static string encode(string data) {
		return new string(encode(data.getbytes()));
	}

	/**
	 * 功能:解码字符串
	 * 
	 * @author 宋立君
	 * @date 2014年07月03日
	 * @param data
	 *  源字符串
	 * @return string
	 */
	public static string decode(string data) {
		return new string(decode(data.tochararray()));
	}

	/**
	 * 功能:编码byte[]
	 * 
	 * @author 宋立君
	 * @date 2014年07月03日
	 * @param data
	 *  源
	 * @return char[]
	 */
	public static char[] encode(byte[] data) {
		char[] out = new char[((data.length + 2) / 3) * 4];
		for (int i = 0, index = 0; i < data.length; i += 3, index += 4) {
			boolean quad = false;
			boolean trip = false;

			int val = (0xff & (int) data[i]);
			val <<= 8;
			if ((i + 1) < data.length) {
				val |= (0xff & (int) data[i + 1]);
				trip = true;
			}
			val <<= 8;
			if ((i + 2) < data.length) {
				val |= (0xff & (int) data[i + 2]);
				quad = true;
			}
			out[index + 3] = alphabet[(quad ? (val & 0x3f) : 64)];
			val >>= 6;
			out[index + 2] = alphabet[(trip ? (val & 0x3f) : 64)];
			val >>= 6;
			out[index + 1] = alphabet[val & 0x3f];
			val >>= 6;
			out[index + 0] = alphabet[val & 0x3f];
		}
		return out;
	}

	/**
	 * 功能:解码
	 * 
	 * @author 宋立君
	 * @date 2014年07月03日
	 * @param data
	 *  编码后的字符数组
	 * @return byte[]
	 */
	public static byte[] decode(char[] data) {

		int templen = data.length;
		for (int ix = 0; ix < data.length; ix++) {
			if ((data[ix] > 255) || codes[data[ix]] < 0) {
				--templen; // ignore non-valid chars and padding
			}
		}
		// calculate required length:
		// -- 3 bytes for every 4 valid base64 chars
		// -- plus 2 bytes if there are 3 extra base64 chars,
		// or plus 1 byte if there are 2 extra.

		int len = (templen / 4) * 3;
		if ((templen % 4) == 3) {
			len += 2;
		}
		if ((templen % 4) == 2) {
			len += 1;

		}
		byte[] out = new byte[len];

		int shift = 0; // # of excess bits stored in accum
		int accum = 0; // excess bits
		int index = 0;

		// we now go through the entire array (not using the 'templen' value)
		for (int ix = 0; ix < data.length; ix++) {
			int value = (data[ix] > 255) ? -1 : codes[data[ix]];

			if (value >= 0) { // skip over non-code
				accum <<= 6; // bits shift up by 6 each time thru
				shift += 6; // loop, with new bits being put in
				accum |= value; // at the bottom.
				if (shift >= 8) { // whenever there are 8 or more shifted in,
					shift -= 8; // write them out (from the top, leaving any
					out[index++] = // excess at the bottom for next iteration.
					(byte) ((accum >> shift) & 0xff);
				}
			}
		}

		// if there is still something wrong we just have to throw up now!
		if (index != out.length) {
			throw new error("miscalculated data length (wrote " + index
					+ " instead of " + out.length + ")");
		}

		return out;
	}

	/**
	 * 功能:编码文件
	 * 
	 * @author 宋立君
	 * @date 2014年07月03日
	 * @param file
	 *  源文件
	 */
	public static void encode(file file) throws ioexception {
		if (!file.exists()) {
			system.exit(0);
		}

		else {
			byte[] decoded = readbytes(file);
			char[] encoded = encode(decoded);
			writechars(file, encoded);
		}
		file = null;
	}

	/**
	 * 功能:解码文件。
	 * 
	 * @author 宋立君
	 * @date 2014年07月03日
	 * @param file
	 *  源文件
	 * @throws ioexception
	 */
	public static void decode(file file) throws ioexception {
		if (!file.exists()) {
			system.exit(0);
		} else {
			char[] encoded = readchars(file);
			byte[] decoded = decode(encoded);
			writebytes(file, decoded);
		}
		file = null;
	}

	//
	// code characters for values 0..63
	//
	private static char[] alphabet = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789+/="
			.tochararray();

	//
	// lookup table for converting base64 characters to value in range 0..63
	//
	private static byte[] codes = new byte[256];
	static {
		for (int i = 0; i < 256; i++) {
			codes[i] = -1;
			// loggerutil.debug(i + "&" + codes[i] + " ");
		}
		for (int i = 'a'; i <= 'z'; i++) {
			codes[i] = (byte) (i - 'a');
			// loggerutil.debug(i + "&" + codes[i] + " ");
		}

		for (int i = 'a'; i <= 'z'; i++) {
			codes[i] = (byte) (26 + i - 'a');
			// loggerutil.debug(i + "&" + codes[i] + " ");
		}
		for (int i = '0'; i <= '9'; i++) {
			codes[i] = (byte) (52 + i - '0');
			// loggerutil.debug(i + "&" + codes[i] + " ");
		}
		codes['+'] = 62;
		codes['/'] = 63;
	}

	private static byte[] readbytes(file file) throws ioexception {
		bytearrayoutputstream baos = new bytearrayoutputstream();
		byte[] b = null;
		inputstream fis = null;
		inputstream is = null;
		try {
			fis = new fileinputstream(file);
			is = new bufferedinputstream(fis);
			int count = 0;
			byte[] buf = new byte[16384];
			while ((count = is.read(buf)) != -1) {
				if (count > 0) {
					baos.write(buf, 0, count);
				}
			}
			b = baos.tobytearray();

		} finally {
			try {
				if (fis != null)
					fis.close();
				if (is != null)
					is.close();
				if (baos != null)
					baos.close();
			} catch (exception e) {
				system.out.println(e);
			}
		}

		return b;
	}

	private static char[] readchars(file file) throws ioexception {
		chararraywriter caw = new chararraywriter();
		reader fr = null;
		reader in = null;
		try {
			fr = new filereader(file);
			in = new bufferedreader(fr);
			int count = 0;
			char[] buf = new char[16384];
			while ((count = in.read(buf)) != -1) {
				if (count > 0) {
					caw.write(buf, 0, count);
				}
			}

		} finally {
			try {
				if (caw != null)
					caw.close();
				if (in != null)
					in.close();
				if (fr != null)
					fr.close();
			} catch (exception e) {
				system.out.println(e);
			}
		}

		return caw.tochararray();
	}

	private static void writebytes(file file, byte[] data) throws ioexception {
		outputstream fos = null;
		outputstream os = null;
		try {
			fos = new fileoutputstream(file);
			os = new bufferedoutputstream(fos);
			os.write(data);

		} finally {
			try {
				if (os != null)
					os.close();
				if (fos != null)
					fos.close();
			} catch (exception e) {
				system.out.println(e);
			}
		}
	}

	private static void writechars(file file, char[] data) throws ioexception {
		writer fos = null;
		writer os = null;
		try {
			fos = new filewriter(file);
			os = new bufferedwriter(fos);
			os.write(data);

		} finally {
			try {
				if (os != null)
					os.close();
				if (fos != null)
					fos.close();
			} catch (exception e) {
				e.printstacktrace();
			}
		}
	}

	// /////////////////////////////////////////////////
	// end of test code.
	// /////////////////////////////////////////////////

}

ps:关于加密技术,本站还提供了如下加密工具供大家参考使用:

base64编码解码工具:

md5在线加密工具:

escape加密/解密工具:

在线sha1加密工具:

短链(短网址)在线生成工具:

短链(短网址)在线还原工具:

高强度密码生成器:

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网