/*
 * Created on 
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package com.csc.library.security;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.security.spec.AlgorithmParameterSpec;

import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;

import com.csc.library.utilities.MyLog;
/**
 * @author Administrator
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class EncryptText {
	 Cipher ecipher;
     Cipher dcipher;
 
     public EncryptText(SecretKey key) {
         // Create an 8-byte initialization vector
         byte[] iv = new byte[]{
             (byte)0x8E, 0x12, 0x39, (byte)0x9C,
             0x07, 0x72, 0x6F, 0x5A
         };
         AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv);
         try {
             ecipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
             dcipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
 
             // CBC requires an initialization vector
             ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
             dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
         } catch (java.security.InvalidAlgorithmParameterException e) {
         	MyLog.error(this, e);
         } catch (javax.crypto.NoSuchPaddingException e) {
         	MyLog.error(this, e);
         } catch (java.security.NoSuchAlgorithmException e) {
         	MyLog.error(this, e);
         } catch (java.security.InvalidKeyException e) {
         	MyLog.error(this, e);
         }
     }
 
     // Buffer used to transport the bytes from one stream to another
     byte[] buf = new byte[1024];
 
     public void encrypt(InputStream in, OutputStream out) {
         try {
             // Bytes written to out will be encrypted
             out = new CipherOutputStream(out, ecipher);	
             // Read in the cleartext bytes and write to out to encrypt
             int numRead = 0;
             while ((numRead = in.read(buf)) >= 0) {
                 out.write(buf, 0, numRead);
             }
             out.close();
         } catch (java.io.IOException e) {
         	MyLog.error(this, e);
        }
     }
 
     public void decrypt(InputStream in, OutputStream out) {
         try {
             // Bytes read from in will be decrypted
             in = new CipherInputStream(in, dcipher);
 
             // Read in the decrypted bytes and write the cleartext to out
             int numRead = 0;
             while ((numRead = in.read(buf)) >= 0) {
                 out.write(buf, 0, numRead);
             }
             out.close();
         } catch (java.io.IOException e) {
         	MyLog.error(this, e);
        }
     }

	public static void main(String args[]){
		try {
			
	        // Generate a temporary key. In practice, you would save this key.
	        // See also e464 Encrypting with DES Using a Pass Phrase.
	        /*SecretKey key = KeyGenerator.getInstance("DES").generateKey();
	        System.out.println("Algorithm "+key.getAlgorithm());
	        System.out.println("Format "+key.getFormat());	      
	    */
	        FileInputStream fu=new FileInputStream("C:/myen/TEMPLATE/key.ser");
	        ObjectInputStream ou=new ObjectInputStream(fu);
	        SecretKey key=(SecretKey)ou.readObject();
	        ou.close();
	        
	        
	        // Create encrypter/decrypter class
	        EncryptText encrypter = new EncryptText(key);
	    
	        // Encrypt
	       //encrypter.encrypt(new FileInputStream("C:/myen/TEMPLATE/DB_SECURITY.xml"),
	        //    new FileOutputStream("C:/myen/SECURITY/test.txt"));
	    
	        // Decrypt
	        encrypter.decrypt(new FileInputStream("C:/myen/SECURITY/test.txt"),
	            new FileOutputStream("C:/myen/SECURITY/test2.txt"));
	            
	    } catch (Exception e) {
	    	e.printStackTrace();
	    }

		
	}
}