Reputation: 1056
Could someone help me to figure out the problem in my very easy program?
When outputting the message at the server I would like to see the same message that was sent over the network, but I am not getting one.
Here is my code for the client:
package encryption;
import java.io.*;
import java.net.*;
import java.security.*;
import java.util.*;
import javax.crypto.*;
public class CipherClient
{
public static void main(String[] args) throws Exception
{
String message = "The quick brown fox jumps over the lazy dog.";
String host = "localhost";
int port = 7999;
Socket s = new Socket(host, port);
// -Generate a DES key.
KeyGenerator generator = KeyGenerator.getInstance("DES");
generator.init(new SecureRandom());
Key key = generator.generateKey();
// -Store it in a file.
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("KeyFile.xx"));
out.writeObject(key);
out.close();
// -Use the key to encrypt the message above and send it over socket s to the server.
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
CipherOutputStream cipherOut = new CipherOutputStream(s.getOutputStream(), cipher);
System.out.println(message.getBytes().length);
cipherOut.write(message.getBytes());
}
}
And here is my code for the server:
package encryption;
import java.io.*;
import java.net.*;
import java.security.*;
import javax.crypto.*;
public class CipherServer
{
public static void main(String[] args) throws Exception
{
int port = 7999;
ServerSocket server = new ServerSocket(port);
Socket s = server.accept();
// -Read the key from the file generated by the client.
ObjectInputStream in = new ObjectInputStream(new FileInputStream("KeyFile.xx"));
Key key = (Key)in.readObject();
System.out.println(key.getClass().getName());
in.close();
// -Use the key to decrypt the incoming message from socket s.
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key);
CipherInputStream cipherIn = new CipherInputStream(s.getInputStream(), cipher);
byte[] stringInBytes = new byte[44];
cipherIn.read(stringInBytes);
String string = new String(stringInBytes);
// -Print out the decrypt String to see if it matches the orignal message.
System.out.println(string);
}
}
Console output on the server side:
javax.crypto.spec.SecretKeySpec
}#ùÂ?°ô0íÿ| r|XÌ\?ñwŽ³{Í@nŠ?
Console output on client side:
44
Here is my new code for client:
package encryption;
import java.io.*;
import java.net.*;
import java.security.*;
import javax.crypto.*;
public class CipherClient
{
public static void main(String[] args) throws Exception
{
// -Generate a DES key.
KeyGenerator generator = KeyGenerator.getInstance("DES");
generator.init(new SecureRandom());
Key key = generator.generateKey();
// -Store it in a file.
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("KeyFile.xx"));
out.writeObject(key);
out.close();
// -Connect to a server.
String message = "The quick brown fox jumps over the lazy dog.";
String host = "localhost";
int port = 7999;
Socket s = new Socket(host, port);
// -Use the key to encrypt the message above and send it over socket s to the server.
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encVal = cipher.doFinal(message.getBytes());
DataOutputStream dOut = new DataOutputStream(s.getOutputStream());
dOut.writeInt(encVal.length); // write length of the message
dOut.write(encVal); // write the message
}
}
Here is my new code for server:
package encryption;
import java.io.*;
import java.net.*;
import java.security.*;
import javax.crypto.*;
public class CipherServer
{
public static void main(String[] args) throws Exception
{
int port = 7999;
ServerSocket server = new ServerSocket(port);
Socket s = server.accept();
// -Read the key from the file generated by the client.
ObjectInputStream in = new ObjectInputStream(new FileInputStream("KeyFile.xx"));
Key key = (Key)in.readObject();
in.close();
// -Use the key to decrypt the incoming message from socket s.
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key);
DataInputStream dIn = new DataInputStream(s.getInputStream());
int length = dIn.readInt(); // read length of incoming message
if(length>0)
{
byte[] messageInBytes = new byte[length];
dIn.readFully(messageInBytes, 0, messageInBytes.length); // read the message
// -Print out the decrypt String to see if it matches the orignal message.
System.out.println(new String(cipher.doFinal(messageInBytes)));
}
}
}
Here is an error I am getting on server side:
Exception in thread "main" java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.io.DataInputStream.readInt(Unknown Source)
at encryption.CipherServer.main(CipherServer.java:26)
And there are no errors on a client side.
Upvotes: 0
Views: 2385
Reputation: 449
I think there is a "race" between your client and server to write and read from your key file. At least it did for me when I ran your code.
Try to put the key generation and the writing to the key file before creating your socket. This way, when your client creates its socket, the server accepts it and when it goes to the file, it does get a valid file.
It works for me with almost no difference from your code apart from the writing to file bit.
The client:
public class CipherClient
{
public static void main(String[] args) throws Exception
{
// -Generate a DES key.
KeyGenerator generator = KeyGenerator.getInstance("DES");
generator.init(new SecureRandom());
Key key = generator.generateKey();
// -Store it in a file.
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("KeyFile.xx"));
out.writeObject(key);
out.close();
String message = "The quick brown fox jumps over the lazy dog.";
System.out.println("Message converted from Bytes = " + new String(message.getBytes()));
System.out.println("Length = " + message.getBytes().length);
String host = "localhost";
int port = 7999;
Socket s = new Socket(host, port);
// -Use the key to encrypt the message above and send it over socket s to the server.
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
CipherOutputStream cipherOut = new CipherOutputStream(s.getOutputStream(), cipher);
cipherOut.write(message.getBytes());
cipherOut.close();
s.close();
}
}
And the Server:
public class CipherServer
{
public static void main(String[] args) throws Exception
{
int port = 7999;
ServerSocket server = new ServerSocket(port);
Socket s = server.accept();
// -Read the key from the file generated by the client.
ObjectInputStream in = new ObjectInputStream(new FileInputStream("KeyFile.xx"));
Key key = (Key)in.readObject();
in.close();
// -Use the key to decrypt the incoming message from socket s.
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key);
CipherInputStream cipherIn = new CipherInputStream(s.getInputStream(), cipher);
byte[] array = new byte[44];
cipherIn.read(array);
cipherIn.close();
s.close();
String message = new String(array);
System.out.println(message);
}
}
Upvotes: 1