importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.InputStream;importjava.io.OutputStream;importjava.security.Key;importjava.security.SecureRandom;importjavax.crypto.Cipher;importjavax.crypto.CipherInputStream;importjavax.crypto.CipherOutputStream;importjavax.crypto.KeyGenerator;importsun.misc.BASE64Decoder;importsun.misc.BASE64Encoder;public classDESUtil {
Key key ;publicDESUtil() {
}publicDESUtil(String str) {
setKey(str);//生成密匙
}publicKey getKey() {returnkey ;
}public voidsetKey(Key key) {this . key =key;
}///**//* 根据参数生成 KEY//*///public void setKey(String strKey) {//try {//KeyGenerator _generator = KeyGenerator.getInstance ( "DES" );//_generator.init( new SecureRandom(strKey.getBytes()));//this . key = _generator.generateKey();//_generator = null ;//} catch (Exception e) {//throw new RuntimeException(//"Error initializing SqlMap class. Cause: " + e);//}//}
/*** 根据参数生成 KEY*/
public voidsetKey(String strKey) {try{
KeyGenerator _generator= KeyGenerator.getInstance ( "DES");
_generator.init(new SecureRandom(strKey.getBytes("utf-8")));
SecureRandom secureRandom=SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(strKey.getBytes());
_generator.init(56, secureRandom);this . key =_generator.generateKey();
_generator= null;
}catch(Exception e) {throw newRuntimeException("Error initializing SqlMap class. Cause: " +e);
}
}/*** 加密 String 明文输入 ,String 密文输出*/
publicString encryptStr(String strMing) {byte [] byteMi = null;byte [] byteMing = null;
String strMi= "";
BASE64Encoder base64en= newBASE64Encoder();try{
byteMing= strMing.getBytes( "UTF-8");
byteMi= this.encryptByte(byteMing);
strMi=base64en.encode(byteMi);
}catch(Exception e) {throw newRuntimeException("Error initializing SqlMap class. Cause: " +e);
}finally{
base64en= null;
byteMing= null;
byteMi= null;
}returnstrMi;
}/*** 解密 以 String 密文输入 ,String 明文输出
*
*@paramstrMi
*@return
*/
publicString decryptStr(String strMi) {
BASE64Decoder base64De= newBASE64Decoder();byte [] byteMing = null;byte [] byteMi = null;
String strMing= "";try{
byteMi=base64De.decodeBuffer(strMi);
byteMing= this.decryptByte(byteMi);
strMing= new String(byteMing, "UTF-8");
}catch(Exception e) {throw newRuntimeException("Error initializing SqlMap class. Cause: " +e);
}finally{
base64De= null;
byteMing= null;
byteMi= null;
}returnstrMing;
}/*** 加密以 byte[] 明文输入 ,byte[] 密文输出
*
*@parambyteS
*@return
*/
private byte [] encryptByte( byte[] byteS) {byte [] byteFina = null;
Cipher cipher;try{
cipher= Cipher.getInstance ( "DES");
cipher.init(Cipher. ENCRYPT_MODE , key );
byteFina=cipher.doFinal(byteS);
}catch(Exception e) {throw newRuntimeException("Error initializing SqlMap class. Cause: " +e);
}finally{
cipher= null;
}returnbyteFina;
}/*** 解密以 byte[] 密文输入 , 以 byte[] 明文输出
*
*@parambyteD
*@return
*/
private byte [] decryptByte( byte[] byteD) {
Cipher cipher;byte [] byteFina = null;try{
cipher= Cipher.getInstance ( "DES");
cipher.init(Cipher. DECRYPT_MODE , key );
byteFina=cipher.doFinal(byteD);
}catch(Exception e) {throw newRuntimeException("Error initializing SqlMap class. Cause: " +e);
}finally{
cipher= null;
}returnbyteFina;
}/*** 文件 file 进行加密并保存目标文件 destFile 中
*
*@paramfile
* 要加密的文件 如 c:/test/srcFile.txt
*@paramdestFile
* 加密后存放的文件名 如 c:/ 加密后文件 .txt*/
public void encryptFile(String file, String destFile) throwsException {
Cipher cipher= Cipher.getInstance ( "DES");//cipher.init(Cipher.ENCRYPT_MODE, getKey());
cipher.init(Cipher. ENCRYPT_MODE , this. key );
InputStream is= newFileInputStream(file);
OutputStream out= newFileOutputStream(destFile);
CipherInputStream cis= newCipherInputStream(is, cipher);byte [] buffer = new byte [1024];intr;while ((r = cis.read(buffer)) > 0) {
out.write(buffer,0, r);
}
cis.close();
is.close();
out.close();
}/*** 文件采用 DES 算法解密文件
*
*@paramfile
* 已加密的文件 如 c:/ 加密后文件 .txt *
*@paramdestFile
* 解密后存放的文件名 如 c:/ test/ 解密后文件 .txt*/
public void decryptFile(String file, String dest) throwsException {
Cipher cipher= Cipher.getInstance ( "DES");
cipher.init(Cipher. DECRYPT_MODE ,this. key );
InputStream is= newFileInputStream(file);
OutputStream out= newFileOutputStream(dest);
CipherOutputStream cos= newCipherOutputStream(out, cipher);byte [] buffer = new byte [1024];intr;while ((r = is.read(buffer)) >= 0) {
cos.write(buffer,0, r);
}
cos.close();
out.close();
is.close();
}public static void main(String[] args) throwsException {
DESUtil des= new DESUtil("jrkj123");//DES 加密文件//des.encryptFile("G:/test.doc", "G:/ 加密 test.doc");//DES 解密文件//des.decryptFile("G:/ 加密 test.doc", "G:/ 解密 test.doc");
String str1 = "taskId=68&correctDate=2015-04-13&flag=1";//DES 加密字符串
String str2 =des.encryptStr(str1);//DES 解密字符串
String deStr =des.decryptStr(str2);
System. out .println(" 加密前: " +str1);
System. out .println(" 加密后: " +str2);
System. out .println(" 解密后: " +deStr);
}
}