欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-29 13:49:34
一、des加密和解密 package com.itjh.javautil; import java.io.unsupportedencodingexcept...

一、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在线加密工具:http://tools.jb51.net/password/createmd5password

escape加密/解密工具:

在线sha1加密工具:

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

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

高强度密码生成器:http://tools.jb51.net/password/createstrongpassword