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(new String(encrypted)); 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:
Expand|Select|Wrap|Line Numbers
- 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);
- }
- }
- }
Expand|Select|Wrap|Line Numbers
- 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");
- }
- }
- }