Tuesday, May 10, 2011

Using AES ( CFB ) Encryption in java with Client Server

//File : AesClient.java
//AesClient
//Developed by Malhar Vora
//Developed on : 9-5-2011
import java.io.*;
import java.net.*;
import java.util.*;
import java.math.*;
import javax.crypto.*;
import java.security.*;
import javax.crypto.spec.*;




public class AesClient
{
    static KeyGenerator kg = null;
 static Cipher c = null;
 static Key k = null;
 static byte[] ivector=null;
 public static void main(String []str)
 {
  
  String datatosend=null;
     try
  {
      datatosend = encryptString(getDataFromFile("Data.txt"));
   Frame f = new Frame(datatosend,k,ivector);
   
   
   
   sendFrame("localhost",5656,f);
    
  }
  catch(Exception e)
  {
   System.out.println(e);
  }
  
 }
 
 static String getDataFromFile(String filename) throws Exception 
 {
     String str="";
  Scanner sc  = new Scanner(new File(filename));
  while(sc.hasNextLine())
  {
   str=str + sc.nextLine();
  }
  sc.close();
  return str;
  
 }
 
 static String encryptString(String data) throws Exception
 {
     kg = KeyGenerator.getInstance("AES");
  //kg.init(128);
  c = Cipher.getInstance("AES/CFB/PKCS5Padding");
  k = kg.generateKey();
  
    
  c.init(Cipher.ENCRYPT_MODE,new SecretKeySpec("1234512345123451".getBytes(),"AES"));
  byte[] plaintext = data.getBytes();
  byte[] ciphertext = c.doFinal(plaintext);
  
  ivector = c.getIV();
          
  return new String(ciphertext);
  
 }
 
 static void sendFrame(String remoteaddress,int port,Frame f) throws Exception
 {
     Socket s = new Socket(remoteaddress,port);
  OutputStream os = s.getOutputStream();
  ObjectOutputStream ous = new ObjectOutputStream(os);
  
  ous.writeObject(f);
  
  ous.close();
  os.close();
  s.close();       
 
 }
 
}

/***************************************************************************/

//File : AesServer.java
//AESReceiver
//Developed by Malhar Vora
//Developed on : 9-5-2011
import java.io.*;
import java.net.*;
import java.util.*;
import java.math.*;
import javax.crypto.*;
import java.security.*;
import javax.crypto.spec.*;

public class AesServer
{

 public static void main(String []str)throws Exception
 {
    ServerSocket ss = new ServerSocket(5656);
    Socket s = null;
    InputStream is = null;
    ObjectInputStream ois = null;
    Frame f =null;
    
    while(true)
    {
    s=ss.accept();
    is = s.getInputStream();
    ois = new ObjectInputStream(is);
    f = (Frame)ois.readObject(); 
    
    System.out.println(decryptString(f.data,f.k,new IvParameterSpec(f.iv)));    
           
    break;
    }
    
    ois.close();
    is.close();
    s.close();
    ss.close();  
  
 }
 
  
 
 static String decryptString(String data,Key key,IvParameterSpec ivspec)throws Exception
 {
     KeyGenerator kg = KeyGenerator.getInstance("AES");
  //kg.init(128);
  Cipher c = Cipher.getInstance("AES/CFB/PKCS5Padding");
  Key k = key;
  
  c.init(Cipher.DECRYPT_MODE,new SecretKeySpec("1234512345123451".getBytes(),"AES"),ivspec);
  
  
  
  byte[] plaintext = c.doFinal(data.getBytes());
  
  return new String(plaintext);
 }
 
}

/*************************************************************************/

//File : Frame.java
//Frame Class
//Developed by Malhar Vora
//Developed on : 9-5-2011
import java.io.*;
import java.net.*;
import java.util.*;
import javax.crypto.*;
import java.security.*;
import javax.crypto.spec.*;

public class Frame implements Serializable
{
    
    String data;
    Key k;
 byte[] iv;

    Frame(String mydata,Key key,byte[] ivector)
    { 
  data=mydata;
  k = key;
  if(ivector==null)
  {
     iv = null;
  }
  else
  {
   iv = new byte[ivector.length];
   for(int i=0;i<ivector.length;i++)
   {
    iv[i]=ivector[i];
   }
  }
 }  

}





6 comments:

  1. i need little explanation,what does this code do and how to execute it

    ReplyDelete
  2. Hello Vinayaka,

    This code contains code for a Client and a Server.

    Client reads data from file called Data.txt, encrypts it using AES encryption technique and sends to server.

    Server receives encrypted data sent by the client, decrypts it and display it.

    ReplyDelete
    Replies
    1. where compiler this code we have a problem with frame . it not contain a main

      Delete
  3. Can you tell me a way how I can achieve encryption-decryption when there is buffering involved on sender as well as receiver and the buffer size varies according to "inputstream.read()"

    ReplyDelete
  4. I know I'm 5 years late to the party, but this is such a clear, concise breakdown for the process of AES encryption that I had to thank you.

    ReplyDelete