Sunday, November 29, 2009

How to convert PublicKey as a String and How to decode it.

I was suffered with a big trouble when I am going to develop a simple secure chat application. I have to convert it as a String and send to third party. Public Key can not send through socket because of that is in as a object. Then I'm surf the Internet and their are no proper answer to send it as a String. Finally I found a method that can can Convert it.


I've used two steps to Encode Public key to String.
1. Convert it to Byte array.
byte array = publicKey.getEncoded();
2. Convert Byte array to String.
BASE64Encoder encoder = new BASE64Encoder();
string = encoder.encode(byte array);
In this step I used BASE64Encoder to encode byte stream to String. BASE64Encoder is a proprietary software of Sun. you can see that while compile source file ;)


Then we can distribute a public key to the third party.

Decode:

This can do as two steps.

1. Decode to byte stream using BASE64Decoder
BASE64Decoder decoder = new BASE64Decoder();
= decoder.decodeBuffer();
2. Convert is to Public Key using X509EncodedKeySpec
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(sigBytes2);
KeyFactory keyFact = KeyFactory.getInstance("RSA", "BC");
pubKey2 = keyFact.generatePublic(x509KeySpec);




Here is the Program.


import java.security.*;
import java.security.spec.*;
import javax.crypto.Cipher;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;


public class RSAEncryption {
public static void main(String[] args) throws Exception {
RSAEncryption en = new RSAEncryption();
en.DistributePubKey();
}

Key pubKey2;

public void DistributePubKey() throws Exception {
Cipher cipher = Cipher.getInstance("RSA/NONE/PKCS1Padding", "BC");
//SecureRandom random = Utils.createFixedRandom();

// create the keys
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "BC");
generator.initialize(256, new SecureRandom());

KeyPair pair = generator.generateKeyPair();
Key pubKey = pair.getPublic();
Key privKey = pair.getPrivate();


// Send the public key bytes to the other party...
byte[] publicKeyBytes = pubKey.getEncoded();

//Convert Public key to String
BASE64Encoder encoder = new BASE64Encoder();
String pubKeyStr = encoder.encode(publicKeyBytes);




//Convert PublicKeyString to Byte Stream
BASE64Decoder decoder = new BASE64Decoder();
byte[] sigBytes2 = decoder.decodeBuffer(pubKeyStr);



// Convert the public key bytes into a PublicKey object
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(sigBytes2);
KeyFactory keyFact = KeyFactory.getInstance("RSA", "BC");
pubKey2 = keyFact.generatePublic(x509KeySpec);




// encryption step
cipher.init(Cipher.ENCRYPT_MODE, pubKey2, new SecureRandom());
byte[] cipherText = cipher.doFinal(input.getBytes());
System.out.println("cipher: " + Utils.toHex(cipherText));

// decryption step
cipher.init(Cipher.DECRYPT_MODE, privKey);
byte[] plainText = cipher.doFinal(cipherText);
System.out.println("plain : " +new String(plainText));
}
}


Encryption code by Dr. Nandika kasun.

Friday, November 27, 2009

A simple socket based chat application.

Run Server. java
after that run Client.java and give a IP address using command line.

Server.java


/**
*
* @author janith
*/

import java.net.*;
import java.io.*;

public class Server {
public static void main(String[] args) throws IOException{
int PORT = 8134;
InputStream inStream;
DataInputStream inDataStream;
OutputStream outStream;
DataOutputStream outDataStream;
String message="";
String received="";

System.out.println("Chat Server Started");

ServerSocket sock = new ServerSocket(PORT);
Socket conn = sock.accept();
do{
inStream = conn.getInputStream ();
inDataStream = new DataInputStream ( inStream );
message = inDataStream.readUTF();
System.out.println("Client sent: "+message);

DataInputStream dis = new DataInputStream(System.in);
message = dis.readLine();

outStream = conn.getOutputStream();
outDataStream = new DataOutputStream (outStream);
System.out.println("Enter your message here: ");
outDataStream.writeUTF(message);
}while(!message.equals("bye"));
conn.close();
}

}


Client.java



/**
*
* @author janith
*/

import java.io.*;
import java.net.*;

public class Client{
public static void main(String[] args) throws IOException {

int PORT = 8134;
InputStream inStream;
DataInputStream inDataStream;
OutputStream outStream;
DataOutputStream outDataStream;
String message = "";

InetAddress host = InetAddress.getLocalHost();
String diffHost = args[0];
Socket sock = new Socket(diffHost,PORT);
System.out.println("Chat Client Started");
do{
System.out.println("Enter your message here: ");
DataInputStream dis = new DataInputStream(System.in);
message = dis.readLine();
outStream = sock.getOutputStream();
outDataStream = new DataOutputStream (outStream);
outDataStream.writeUTF(message);

inStream = sock.getInputStream ();
inDataStream = new DataInputStream ( inStream );
message = inDataStream.readUTF();
System.out.println("Server Sent: "+message);
}while(!message.equals("bye"));
}
}