package com.test;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.security.NoSuchAlgorithmException;
import java.security.Provider;
import java.security.Security;
import java.util.Arrays;
import javax.crypto.Cipher;
import javax.crypto.CipherOutputStream;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import junit.framework.TestCase;
/**
*
* @author 杜东辉 2006年9月15日
*
*/
public class TestEncrypt extends TestCase {
/**
* 日志
*/
public static final Log log = LogFactory.getLog(TestEncrypt.class);
/**
* 创建一个文件
*/
static File keyfile = new File("G://key.txt");
/**
* 测试加密
*
* @throws Exception
*/
public void testEncrypt() throws Exception {
try {
// 检测是否有加密程序
// 此类提供加密和解密功能
Cipher cipher = Cipher.getInstance("DESede");
} catch (Exception e) {
// 安装JCE提供程序
Provider sunjce = new com.sun.crypto.provider.SunJCE();
Security.addProvider(sunjce);
}
// 生成密钥并保存到文件
if (keyfile.length() == 0) {
SecretKey key = this.generateKey();
this.writeKey(key, keyfile);
}
// 读密钥文件
SecretKey key = this.readKey(keyfile);
String testText = "ddh";
// 加密
byte[] bytes = this.encrypt(key, testText);
// 解密
String text = this.decrypt(key, bytes);
if (log.isInfoEnabled()) {
log.info("加密前: " + testText);
log.info("加密后:" + bytes);
log.info("解密后:" + text);
}
}
/**
* 生成密钥
*
* @return SecretKey
* @throws Exception
*/
public static SecretKey generateKey() throws Exception {
// 获取密钥生成器
KeyGenerator keyGen = KeyGenerator.getInstance("DESede");
// 产生密钥
SecretKey key = keyGen.generateKey();
return key;
}
/**
* 保存密钥到指定文件
*
* @param key
* @param f
* @throws Exception
*/
public static void writeKey(SecretKey key, File f) throws Exception {
// 将密钥转换为字节数据
SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("DESede");
DESedeKeySpec keyspec = (DESedeKeySpec) keyfactory.getKeySpec(key,
DESedeKeySpec.class);
byte[] rawkey = keyspec.getKey();
// 将原始密钥写入文件
FileOutputStream out = new FileOutputStream(keyfile);
out.write(rawkey);
out.close();
}
/**
*
* 从指定文件读入密钥
*
* @param f
* @return
* @throws Exception
*/
public static SecretKey readKey(File f) throws Exception {
// 读入原始字节
DataInputStream in = new DataInputStream(new FileInputStream(f));
byte[] rawKey = new byte[(int) f.length()];
in.readFully(rawKey);
in.close();
// 将原始字节转换为密钥
DESedeKeySpec keyspec = new DESedeKeySpec(rawKey);
SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("DESede");
SecretKey key = keyfactory.generateSecret(keyspec);
return key;
}
/**
* 加密
*
* @param key
* @param text
* @return byte[]
* @throws Exception
*/
public static byte[] encrypt(SecretKey key, String text) throws Exception {
// 创建和初始化加密引擎
Cipher cipher = Cipher.getInstance("DESede");
cipher.init(Cipher.ENCRYPT_MODE, key);
// 创建特殊的输出流
// CipherOutputStream cos=new CipherOutputStream();
byte[] buffer = text.getBytes();
byte[] bytes = cipher.doFinal(buffer);
// 安全起见,清除内存中的普通文本
java.util.Arrays.fill(buffer, (byte) 0);
return bytes;
}
/**
* 解密
*
* @param key
* @param bytes
* @return String
* @throws Exception
*/
public static String decrypt(SecretKey key, byte[] bytes) throws Exception {
// 初始化解密引擎
Cipher cipher = Cipher.getInstance("DESede");
cipher.init(Cipher.DECRYPT_MODE, key);
// 解密
byte[] buffer = cipher.doFinal(bytes);
String text = new String(buffer);
// 为保证安全,清除内存
java.util.Arrays.fill(buffer, (byte) 0);
return text;
}
}