Java Socket Programming with AES encryption

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • rayoflight
    New Member
    • Oct 2008
    • 2

    Java Socket Programming with AES encryption

    This is how my test program works.

    Server will encrypt some text and sends it over to the client.
    The client will then decrypts it.

    However I have some problem decrypting it. When I play around with the key and the plaintext, sometime it is able to decrypt. I think it should be some ASCII character problems.

    Right now, I am using out.writeUTF(ne w String(encrypte d)); and on this other side I use in.readUTF() to get the string. Lastly, I convert the string to byte for decryption.

    Is there anyway to fix this problem? Basically, what and how do I send the ciphertext over and how can I decrypt properly on the other side.

    Here are my codes, thanks in advance..

    Server:
    Code:
    import java.io.*;
    import java.net.*;
    
    import java.security.*;
    import javax.crypto.*;
    import javax.crypto.spec.*;
    
    public class RealEchoServer{
        public static void main(String[] args ){
            int i = 1;
            try{
                 ServerSocket s = new ServerSocket(9003);
    
                 for (;;){
                     Socket incoming = s.accept( );
                     System.out.println("Spawning " + i);
                     new RealEchoHandler(incoming, i).start();
                     i++;
                 }
            } catch (Exception e){ System.out.println(e); }
        }
    }
    
    class RealEchoHandler extends Thread{
    	DataInputStream in;
    	DataOutputStream out;
    	private Socket incoming;
        private int counter;
    
        public RealEchoHandler(Socket i, int c){
            incoming = i;
            counter = c;
        }
    
        public void run(){
            try {
    
    
    			String key1 = "1234567812345678"; 
    	      	byte[] key2 = key1.getBytes();
    	      	SecretKeySpec secret = new SecretKeySpec(key2, "AES");
    			String msg = "Singapore Malaysia Japan India Indonesia HongKong Taiwan China England";
    			Cipher cipher = Cipher.getInstance("AES");        
    	   	 	cipher.init(Cipher.ENCRYPT_MODE, secret);
    	   		byte[] encrypted = cipher.doFinal(msg.getBytes());
    
                in = new DataInputStream(incoming.getInputStream());
    			out = new DataOutputStream(incoming.getOutputStream());
    
                boolean done = false;
                String str="";
                out.writeUTF("Connected!\n");
                out.flush();
                while (!done){
    				out.writeUTF(">");
    				out.flush();
                    str = in.readUTF();
                    System.out.println(in+":"+str);
                    if (str == null)
                        done = true;
                    else{
                    	System.out.println("Sending Ciphertext : " + new String(encrypted));
                        out.writeUTF(new String(encrypted));
                        out.flush();
                    }
                }
                incoming.close();
             } catch (Exception e){
                 System.out.println(e);
             }
        }
    }
    Client:
    Code:
    import java.io.*;
    import java.net.*;
    import java.security.*;
    import javax.crypto.*;
    import javax.crypto.spec.*;
    import java.util.*;
    
    class RealSocketTest{
    	public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException{
    	
    		String str = "";
    		String str2 = "";
    		DataOutputStream out;
    		DataInputStream in;
    
    		try {
    		    Socket t = new Socket("127.0.0.1", 9003);
                in = new DataInputStream(t.getInputStream());
                out = new DataOutputStream(t.getOutputStream());
                BufferedReader br = new BufferedReader (new InputStreamReader(System.in));
    
                boolean more = true;
    			System.out.println(in.readUTF());	
    
                while (more) {
    				str = in.readUTF();
    			    System.out.print(str);
                    str2 = br.readLine();
    				out.writeUTF(str2);
                    out.flush();
    				str = in.readUTF();
    				
    				System.out.println("Encrypted Info: " + str);
    				
    				try {
    
    					String key1 = "1234567812345678"; 
    	      			byte[] key2 = key1.getBytes();
    	      			SecretKeySpec secret = new SecretKeySpec(key2, "AES");
    	
    					Cipher cipher = Cipher.getInstance("AES");        
    	   	 	
    					cipher.init(Cipher.DECRYPT_MODE, secret);
    					byte[] decrypted = cipher.doFinal(str.getBytes());
    					System.out.println("Decrypted Info: " + new String(decrypted));
    				}
    		        catch(BadPaddingException e){
    		        	System.out.println("Wrong Key!");
    				}
    				catch(InvalidKeyException f) {
    					System.out.println("Invalid Key!");
    				}
                }
    		} 
            catch(IOException e){
            	System.out.println("Error");
    		}
    	}
    }
  • Nepomuk
    Recognized Expert Specialist
    • Aug 2007
    • 3111

    #2
    Originally posted by rayoflight
    This is how my test program works.

    Server will encrypt some text and sends it over to the client.
    The client will then decrypts it.

    However I have some problem decrypting it. When I play around with the key and the plaintext, sometime it is able to decrypt. I think it should be some ASCII character problems.
    Hi!
    You say, sometimes you can decrypt? So I guess, sometimes you can't. Can you give us an example for a few keys and plaintexts that work and some that don't?

    Greetings,
    Nepomuk

    Comment

    • rayoflight
      New Member
      • Oct 2008
      • 2

      #3
      Thanks, that answers my question

      Comment

      Working...