d43d84f434580d762f3a0920fade44b8e5953459.svn-base 5.5 KB
package com.espeed.tool;


import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

import sun.misc.BASE64Encoder;
public class Encrypt {
	 /**  
     * 密钥算法  
    */   
    private static final String KEY_ALGORITHM = "DES";   
       
    private static final String DEFAULT_CIPHER_ALGORITHM = "DES/ECB/PKCS5Padding";   
   static byte[] byteArray=null;
	  /**  
     * 初始化密钥  
     *   
     * @return byte[] 密钥   
     * @throws Exception  
     */   
    public static byte[] initSecretKey() throws Exception{   
        //返回生成指定算法的秘密密钥的 KeyGenerator 对象   
        KeyGenerator kg = KeyGenerator.getInstance("DES");   
        //初始化此密钥生成器,使其具有确定的密钥大小   
        kg.init(56);   
        //生成一个密钥   
        SecretKey  secretKey = kg.generateKey(); 
        byteArray=secretKey.getEncoded();
        return secretKey.getEncoded();   
    }  
 
 /**  
  * 转换密钥  
  *   
  * @param key   二进制密钥  
  * @return Key  密钥  
  * @throws Exception  
  */   
 private static Key toKey() throws Exception{   
     //实例化DES密钥规则   
     DESKeySpec dks = new DESKeySpec(byteArray);   
     //实例化密钥工厂   
     SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");   
     //生成密钥  ,工厂中对密钥进行处理加工
     SecretKey  secretKey = skf.generateSecret(dks);   
     return secretKey;   
 }  
 
 //获得密钥
 public static Key getKey() throws Exception {
  Key kp =toKey();
  return kp;
 }
 
 
//文件加密需要传入一个流跟一个文件保存的路径
 public static Object encrypt(InputStream is, String dest) throws Exception {
	 Cipher cipher = Cipher.getInstance("DES");
	 //初始化密钥
	 initSecretKey();
	 //获得密钥
	 Object key =getKey();
	 cipher.init(Cipher.ENCRYPT_MODE,(Key)key);
	 //写入文件
	 OutputStream out = new FileOutputStream(dest);
	 CipherInputStream cis = new CipherInputStream(is, cipher);
	 byte[] buffer = new byte[1024];
	 int r;
	 while ((r = cis.read(buffer)) > 0) {
		 out.write(buffer, 0, r);
	 }
	 //数据库保存需要一个字符
	 BASE64Encoder enc=new BASE64Encoder();
	 String string=enc.encode(byteArray);
	 cis.close();
	 is.close();
	 out.close();
	 return string;
 }
 //文件解密返回一个流
 public static InputStream decrypt(String file,Key key) throws IOException {
	 CipherInputStream cis = null;
	 InputStream is =null;
	  try {
		  Cipher cipher = Cipher.getInstance("DES");
		  cipher.init(Cipher.DECRYPT_MODE,key);
		   is = new FileInputStream(file);
		   cis = new CipherInputStream(is, cipher);
		   
	} catch (Exception e) {
		e.printStackTrace();
		return null;
		// TODO: handle exception
	}	
  return cis; 
 }
 
 
//通过传过来的流生成文件
 public static void createFile(String outfile,String fileName,InputStream in) throws Exception {
	 File file=new File(outfile);
	 if(!file.exists()){
		 file.mkdirs();
	 }
	 OutputStream out = new FileOutputStream(outfile+fileName);
	  byte[] buffer = new byte[1024];
	  int r;
	  while ((r = in.read(buffer)) >= 0) {
		  out.write(buffer, 0, r);
	  }
	  out.close();
	  in.close();  
	 }
 
 //文件解密返回一个字符串
 public static String decryptAndGetString(String file,Key key) throws Exception {
  Cipher cipher = Cipher.getInstance("DES");
  cipher.init(Cipher.DECRYPT_MODE,key);
  InputStream is = new FileInputStream(file);
  CipherInputStream cis = new CipherInputStream(is, cipher);
  
  return convertStreamToString(cis);
  
 }
 public static String inputStream2String(InputStream is) throws IOException{
	 ByteArrayOutputStream baos = new ByteArrayOutputStream();
	 int i=-1;
	 while((i=is.read())!=-1){
	 baos.write(i);
	 }
	 return baos.toString();
	 }
 
 public static String convertStreamToString(InputStream is) {   

	   BufferedReader reader = new BufferedReader(new InputStreamReader(is));   

	        StringBuilder sb = new StringBuilder();   
	        String line = null;   

	        try {   

	            while ((line = reader.readLine()) != null) {   

	                sb.append(line + "/n");   

	            }   

	        } catch (IOException e) {   

	            e.printStackTrace();   

	        } finally {   

	            try {   

	                is.close();   

	            } catch (IOException e) {   

	                e.printStackTrace();   

	            }   

	        }   

	    

	        return sb.toString();   

	    }    
 
 /**  
  * 转换密钥  
  *   
  * @param key   二进制密钥  
  * @return Key  密钥  
  * @throws Exception  
  */   
 //com.sun.crypto.provider.DESKey@fffe78d9
 public static Key toKey(byte[] key) throws Exception{   
     //实例化DES密钥规则   
     DESKeySpec dks = new DESKeySpec(key);   
     //实例化密钥工厂   
     SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");   
     //生成密钥  ,工厂中对密钥进行处理加工
     SecretKey  secretKey = skf.generateSecret(dks);   
     return secretKey;   
 }
 
 
}