www.pudn.com > DestTest.rar > EncryptTool.java


package com.des.test; 
 
import java.io.*; 
import java.security.*; 
import javax.crypto.*; 
import javax.crypto.spec.SecretKeySpec; 
 
import sun.misc.BASE64Decoder; 
import sun.misc.BASE64Encoder; 
 
/** 
 *  
 *  
 * CryptTool 封装了一些加密工具方法, 包括 3DES, MD5 等. 
 *  
 *  
 * @author BeanSoft 
 * @version 1.0 2004-05-12 
 */ 
public class EncryptTool { 
	public EncryptTool() { 
	} 
 
	/** 
	 * 生成3DES密钥. 
	 *  
	 * @param key_byte 
	 *            seed key 
	 * @throws Exception 
	 * @return javax.crypto.SecretKey Generated DES key 
	 */ 
	public static javax.crypto.SecretKey genDESKey(byte[] key_byte) 
			throws Exception { 
		SecretKey k = null; 
		k = new SecretKeySpec(key_byte, "DESede"); 
		return k; 
	} 
 
	/** 
	 * 3DES 解密(byte[]). 
	 *  
	 * @param key 
	 *            SecretKey 
	 * @param crypt 
	 *            byte[] 
	 * @throws Exception 
	 * @return byte[] 
	 */ 
	public static byte[] desDecrypt(javax.crypto.SecretKey key, byte[] crypt) 
			throws Exception { 
		javax.crypto.Cipher cipher = javax.crypto.Cipher.getInstance("DESede", 
				"SunJCE"); 
		cipher.init(javax.crypto.Cipher.DECRYPT_MODE, key); 
		return cipher.doFinal(crypt); 
	} 
 
	/** 
	 * 3DES 解密(String). 
	 *  
	 * @param key 
	 *            SecretKey 
	 * @param crypt 
	 *            byte[] 
	 * @throws Exception 
	 * @return byte[] 
	 */ 
	public static String desDecrypt(javax.crypto.SecretKey key, String crypt) 
			throws Exception { 
		return new String(desDecrypt(key, crypt.getBytes())); 
	} 
 
	/** 
	 * 3DES加密(byte[]). 
	 *  
	 * @param key 
	 *            SecretKey 
	 * @param src 
	 *            byte[] 
	 * @throws Exception 
	 * @return byte[] 
	 */ 
	public static byte[] desEncrypt(javax.crypto.SecretKey key, byte[] src) 
			throws Exception { 
 
		javax.crypto.Cipher cipher = javax.crypto.Cipher.getInstance("DESede", 
				"SunJCE"); 
		cipher.init(javax.crypto.Cipher.ENCRYPT_MODE, key); 
		return cipher.doFinal(src); 
	} 
 
	/** 
	 * 3DES加密(String). 
	 *  
	 * @param key 
	 *            SecretKey 
	 * @param src 
	 *            byte[] 
	 * @throws Exception 
	 * @return byte[] 
	 */ 
	public static String desEncrypt(javax.crypto.SecretKey key, String src) 
			throws Exception { 
		return new String(desEncrypt(key, src.getBytes())); 
	} 
 
	/** Test crypt */ 
	public static void main(String[] args) { 
		// Security.addProvider(new com.sun.crypto.provider.SunJCE()); 
		// 明文 
 
		String src_string = "1362223434"; 
		byte src_byte[] = src_string.getBytes(); 
		System.out.println("明文:" + src_string); 
		System.out.println("明文长度:" + src_byte.length); 
		// 密钥 
		String key_string = "333456781234567812345678"; 
		// Lc2F4Wi130TSr/J2WAH8zw== 
		// nxkysZBvCVTzpNSFvrrP0w== 
		// lOOHriXpubu/Av6vBXpyHg== 
		byte key_byte[] = key_string.getBytes(); // 3DES 24 
		// bytes key 
		System.out.println("密钥内容:" + key_string); 
		System.out.println("密钥长度:" + key_byte.length); 
 
		Provider[] pd = Security.getProviders(); 
		for (int i = 1; i <= (pd.length); i++) { 
			System.out.println("Provider[" + i + "]=" + pd[i - 1].getName()); 
		} 
 
		try { 
			// 生成DES密钥 
			javax.crypto.SecretKey deskey; 
			// 生成DES密钥 
 
			deskey = genDESKey(key_byte); 
			System.out.println("生成后的密钥:Generator DES KEY OK:  " + deskey); 
 
			// DES加解密 
			byte[] encrypt, decrypt; 
			// 加密 
			encrypt = desEncrypt(deskey, src_byte); 
			// 加密后的密文 
			String enc_string = new String(encrypt); 
			System.out.println(enc_string.getBytes().length + " 加密后的密文:" 
					+ enc_string); 
 
			// BASE64Encoder通过这个类对密码进行BASE64转码,保证传输的正确性. 
			BASE64Encoder enc = new BASE64Encoder(); 
			// 经过BASE64转码后的密文 
			String base_string; 
			// base_string = new String(Base64.encode(encrypt)); 
			// 对密文进行BASE64转码. 
			base_string = enc.encode(encrypt); 
 
			String cipherString = enc.encode(encrypt); 
 
			BASE64Decoder dec = new BASE64Decoder(); 
			String ciphertext = new String(dec.decodeBuffer(base_string)); 
 
			System.out.println("BASE64 转码后的密文 length:" + base_string.length() 
					+ "   " + base_string); 
			System.out.println("BASE64 转码后的密文 length:" + base_string.length() 
					+ "   " + cipherString); 
 
			/** **************************解密****************************************** */ 
 
			// 将BASE64转码后的密文进行解码.解码后应该与加密后的密文一致. 
			String base_decode = new String(dec.decodeBuffer(base_string)); 
			byte[] bb = encrypt; 
			byte[] base = dec.decodeBuffer(base_string); 
			for (int i = 0; i < bb.length; i++) { 
				System.out.println(encrypt[i] + ":" + base[i]); 
			} 
			decrypt = desDecrypt(deskey, base_decode.getBytes()); 
			System.out.println("解密后的明文decrypt=" + new String(decrypt)); 
		} catch (Exception ex) { 
			ex.printStackTrace(); 
		} 
	} 
 
	/* 
	 * 对普通字符串进行BASE64转码 srcString :普通字符串 
	 */ 
	public static String base64Encode(byte[] srcString)// 加base64 
	{ 
		BASE64Encoder base64Encoder = new BASE64Encoder(); 
		try { 
			// 经过BASE64加密后的密文 
			String base64String = base64Encoder.encode(srcString); 
			return base64String; 
		} catch (Exception e) { 
			e.printStackTrace(); 
			return null; 
		} 
	} 
 
	/* 
	 * 将BASE64字符串解码 base64String:BASE64字符串 
	 */ 
	public static String base64Decode(String base64String)// 解base64 
	{ 
		BASE64Decoder base64Decoder = new BASE64Decoder(); 
		try { 
 
			// 将BASE64转码过的字符串进行解码,获取明文 
			String srcString = new String(base64Decoder 
					.decodeBuffer(base64String)); 
			return srcString; 
		} catch (Exception e) { 
			e.printStackTrace(); 
			return null; 
		} 
	} 
 
}