Program Command Line Chatting & Simple Encryption with Java

Melanjutkan tugas kuliah yang diberikan pak Jack tentang command line chatting tetapi pada kasus kali ini kami diharuskan membuat proses enkripsi & dekripsi data yang dikirim ke client lain. Oleh karena itu di sini kami tambahkan satu file yang berfungsi untuk melakukan proses enkripsi dan dekripsi sederhana. Program yang digunakan masih sama dengan program pada postingan sebelumnya "Command Line Chatting dengan JAVA ", hanya saja untuk bagian database tidak disertakan.
Gambaran dari program yang kami buat adalah seperti berikut :


Client mengirim pesan kepada client lain yang login ke dalam aplikasi chatting.


Message yang dikirim oleh client akan di-enkripsi sebelum dikirim ke server.

Server menerima data yang telah di-enkripsi kemudian melakukan filter untuk menyeleksi client yang dituju.

Setelah server mendapatkan nama dari client penerima pesan makan akan dilakukan proses dekripsi sebelum di kirim ke client.

Client yang memiliki nama user yang sama dengan nama user yang dituju akan menerima pesan yang dikirim dalam bentuk normal user yang lain akan menerima pesan data yang terenkripsi.




Untuk source code program dapat di download di sini.

Berikut ini adalah penjelasan dari beberapa potongan program di atas.
1. Chat syntax Client
while(true) {
System.out.print("> ");
// read message from user
String msg = scan.nextLine();
if (msg.length() <= 3) {
client.sendMessage(new ChatMessage(ChatMessage.MESSAGE, msg));
}
// logout if message is LOGOUT
else if(msg.equalsIgnoreCase("LOGOUT")) {
client.sendMessage(new ChatMessage(ChatMessage.LOGOUT, ""));
// break to do the disconnect
break;
}
// message WhoIsIn
else if(msg.equalsIgnoreCase("WHOISIN")) {
client.sendMessage(new ChatMessage(ChatMessage.WHOISIN, ""));
}
// Private Message
else if( (msg.substring(0,3)).equalsIgnoreCase("TO:")){
CEncrypt enc = new CEncrypt();
String[] arrayMsg=msg.split(" ");
String user=arrayMsg[0].substring(3);
String pesan="";
for (int i=1;i<arrayMsg.length;i++)
pesan = pesan +" "+ arrayMsg[i];
CEncrypt e = new CEncrypt();
String encMsg = e.encryptString(pesan);
client.sendMessage(new ChatMessage(ChatMessage.PM, user, encMsg)); }
else { // default to ordinary message
client.sendMessage(new ChatMessage(ChatMessage.MESSAGE, msg));
}
}

Pada potongan program di atas dapat dilihat ada 4 kondisi yang dapat digunakan user ketika chatting, yaitu: *Untuk memeriksa siapa saja user yang login dapat mengetikkan di terminal chat "whoisin"


*Untuk mengirim pesan biasa dapat langsung ketikkan pesan di layar chat, secara otomatis pesan tersebut akan di broadcast ke smua user yang login.


*Untuk mengirimkan private message yang terenkripsi gunakan peritah "to:namauser" seperti pada contoh berikut.

 Proses dekripsi dari pesan yang dikirimkan dilakukan di server, berikut potongan program untuk proses dekripsi di server.

private synchronized void privateMessage(String message, String receiver, String sender) {
// add HH:mm:ss and \n to the message
String time = sdf.format(new Date());
//String messageLf = time + " " + message + "\n";
// display message on console or GUI
if(sg == null)
System.out.print(time + " PM from "+sender+" to "+receiver+" "+message);
else
sg.appendRoom(time + " PM from "+sender+" to "+receiver+" "+message);     // append in the room window

// we loop in reverse order in case we would have to remove a Client
// because it has disconnected
for(int i = al.size(); --i >= 0;) {
ClientThread ct = al.get(i);
if (ct.username.equals(receiver)) {   //Dekripsi jika nama user = user tujuan
CEncrypt denc = new CEncrypt();
ct.writeMsg(time +" PM from "+sender+" : "+ denc.decryptString(message));
}
else {  //Pesan tidak di dekripsi jika tidak sama
ct.writeMsg(time +" PM from "+sender+" : "+ message);
}
}
}

Yang terakhir adalah source untuk enkripsi dan dekripsi pesan :

public class CEncrypt
{
   static final String key = "Encrypt"; // The key for 'encrypting' and 'decrypting'.
   static String encryptString(String str)
   {
      StringBuffer sb = new StringBuffer (str);
      //System.out.println("Insert Key : ");readln(key);
      int lenStr = str.length();
      int lenKey = key.length();

      //
      // For each character in our string, encrypt it...
      for ( int i = 0, j = 0; i < lenStr; i++, j++ )
      {
         if ( j >= lenKey ) j = 0;  // Wrap 'round to beginning of key string.
         //
         // XOR the chars together. Must cast back to char to avoid compile error.
         //
         sb.setCharAt(i, (char)(str.charAt(i) ^ key.charAt(j)));
      }
      return sb.toString();
   
   }
 
   static String decryptString(String str)
   {
      //
      // To 'decrypt' the string, simply apply the same technique.
      return encryptString(str);
   }
}

Pada source tersebut dapat dilihat bahwa kami menggunakan satu kunci yang sama untuk melakukan enkripsi dan dekripsi pesan.


EmoticonEmoticon