Caesar Cipher bagian 3, [language detection]


Ada beberapa translate online yang popular saat ini, sebut saja google translate, bing translator, yandex translator, dan lain lain. Google sangat populer memang dalam penggunaan translatornya padahal masih banyak translator translotor lainya baik yang berbayar maupun gratis, detailnya dapat dilihat dilaman berikut https://en.wikipedia.org/wiki/Comparison_of_machine_translation_applications

Namun kali ini kita tidak membahas mengenai translator sebagai alat penerjemah, namun pada postingan sebelumnya perihal bruteforce attack pada caesar cipher yang masih harus secara manual kita melihat mana plaintext yang benar.

Idenya sangat sederhana, hasil dekripsi dengan bruteforce dilakukan language detection jika hasil tersebut terdeteksi makan kemungkinan hasil dekripsi tersebut adalah dengan kunci yang benar. Kali ini kita menggunakan yandex translator, mengapa? jawabanya gratis 😀 , namun beberapa keterbatasan yang akan kita temukan

sebelumnya penggunaan yandex java api dapat diunduh disini: https://github.com/rmtheis/yandex-translator-java-api
dan untuk API key nya dapat digenerate melalui https://tech.yandex.com/translate/

setelah itu kita dapat membuat program sederhana dengan java sebagai berikut:

 
package detectLang;

import com.rmtheis.yandtran.detect.Detect;
import com.rmtheis.yandtran.language.Language;
import com.rmtheis.yandtran.translate.Translate;


public class DetectL {	
	public static void main(String[] args) throws  Exception{	
		  Translate.setKey(["API Key"]);
		  Language lang1 = Language.ENGLISH;
		  Language lang2 = Language.GERMAN;
		  String translatedText = Translate.execute("when you saw him call me", lang1, lang2);
		  System.out.println(translatedText);
		  Language detectText = Detect.execute(translatedText);
	          System.out.println(detectText);
	}
}

hasil yang akan didapatkan adalah sebagai berikut:

wenn du ihn sehen rufen Sie mich
de

de adalah kode untuk bahasa jerman, kode selengkapnya dapat dilihat https://tech.yandex.com/translate/doc/dg/concepts/langs-docpage/

Script diatas adalah salah satu cara untuk mendeteksi bahasa apa yang digunakan dan juga mentraslate bahasa tersebut. Mengapa kita perlu mentranslate juga, apakah tidak cukup hanya dengan mendeteksi? bukannya dengan mendeteksi kita sudah dapat menentukan plaintext mana yang benar pada bruteforce attack. Secara teoritical memang begitu, namu pada kenyataan nya Translator pada kalimat-kalimat yang tidak dapat ditranslate sering kali sembarangan dalam mendeteksi kalimat tersebut, seperti kalimat berikut “Vxubojky g Pgbg cxgvvkx gxuatj znk Egtjkd sginotk zxgtyrgzout ckh ykxboik GVO” dideteksi sebagai bahasa inggris. Oleh sebab itu kita bisa sedikit tricky untuk mengatasi itu kurang lebih step step nya sebagai berikut

CipherText > Bruteforce attack > Detect language (1) > Translate language > Detect Language (2) > Plaintext

Solusi diatas adalah salah satu cara meningkatkan efisiensi bruteforce attack pada caesar cipher. Kita dapat menggunakan bahasa Indonesia, tetapi kita harus menambahkan di Language.java INDONESIAN(“id”),

berikut adalah contoh script modifikasi dari script sebelum nya http://wp.me/prw8r-1ei dengan mengunakan detect dan translate sebagai deteksi plaintext:

 
package encryptdecrypt;

import com.rmtheis.yandtran.detect.Detect;
import com.rmtheis.yandtran.language.Language;
import com.rmtheis.yandtran.translate.Translate;



public class CaesarCipher {
	
	public static String bacaString(){
        int karakter;
        String str = "";
        boolean selesai =false;
         
        while(!selesai){
            try{
                karakter =System.in.read();
                if (karakter <0 || (char) karakter == '\n')
                    selesai=true;
                else if ((char) karakter != '\r')
                    str = str + (char) karakter;
                }
            catch(java.io.IOException e) {
                System.err.println("ada kesalahan");
                selesai = true;
            }
        }
      return str;
    }
	    
	private static String encrypting(String st, int rtint){
        int pjgstr=st.length();
        char [] ciphertext = new char [pjgstr];
       
        int[] ascist;
        ascist = new int [pjgstr];
 
        int[] cipherasci1;
        cipherasci1 = new int [pjgstr];
        int[] cipherasci2;
        cipherasci2 = new int [pjgstr];
        int salah = 0;
 
        if (rtint >= 26)
            rtint = rtint%25;
      

        for (int a=0; a < pjgstr; a++) {
        ascist[a] = String.valueOf(st).codePointAt(a);

        if (ascist[a] >= 97 && ascist[a] <= 122 ){
            cipherasci1 [a] = ascist[a]+rtint;
            if (cipherasci1 [a] >= 123)
                cipherasci2 [a] = 97 + (cipherasci1 [a] % 123);
            else
                cipherasci2 [a] = cipherasci1 [a];   
        }
        else if (ascist[a] >= 65 && ascist[a] <= 90 ) {
            cipherasci1 [a] = ascist[a]+rtint;
            if (cipherasci1 [a] >= 91)
                cipherasci2 [a] = 65 + (cipherasci1 [a] % 91);
            else
                cipherasci2 [a] = cipherasci1 [a];
        }
        else if (ascist[a] == 32 ) {
            cipherasci2 [a] = 32;
        }
 
        else {
            salah = 1;
        }
        
        ciphertext [a] = (char) cipherasci2 [a];
            }
        
        String Ct = String.valueOf(ciphertext);
     
        if (salah == 1)
            System.out.println("==error== (masukan hanya huruf besar / kecil dan spasi)"); 
        return Ct;
	}
	
	private static String decrypting(String st, int rtint){
        int pjgstr=st.length();
        char [] ciphertext = new char [pjgstr];
      
        int[] ascist;
        ascist = new int [pjgstr];
 
        int[] cipherasci1;
        cipherasci1 = new int [pjgstr];
        int[] cipherasci2;
        cipherasci2 = new int [pjgstr];
        int salah = 0;
 
        if (rtint >= 26)
            rtint = rtint%25;
     
        
        for (int a=0; a < pjgstr; a++) {
        ascist[a] = String.valueOf(st).codePointAt(a);
  
        if (ascist[a] >= 97 && ascist[a] <= 122 ){
        	
            
            cipherasci1 [a] = ascist[a]-rtint;
            if (cipherasci1 [a] <= 96)
                cipherasci2 [a] = -96 + 122 + (cipherasci1 [a] % 97);
            else
                cipherasci2 [a] = cipherasci1 [a]; 
          
        }
       
        else if (ascist[a] >= 65 && ascist[a] <= 90 ) {
            cipherasci1 [a] = ascist[a]-rtint;
            if (cipherasci1 [a] <= 64)
                cipherasci2 [a] = -64 + 90 + (cipherasci1 [a] % 65);
            else
                cipherasci2 [a] = cipherasci1 [a];
        }
        else if (ascist[a] == 32 ) {
            cipherasci2 [a] = 32;
        }
 
        else {
            salah = 1;
        }
        
        ciphertext [a] = (char) cipherasci2 [a];
            }
        
        if (salah == 1)
            System.out.println("==error== (masukan hanya huruf besar / kecil dan spasi)");

        String pt = String.valueOf(ciphertext);
        return pt;
		
	}
	
	private static Language detect (String st) throws Exception{
		Translate.setKey("[Your API Key]");
		 Language detectText2 = Detect.execute(st);
		// Boolean status = detectText2!=null;
		 return detectText2;
	}
	
	private static Boolean detect2 (String st, Language lang) throws Exception{
		  Translate.setKey("[Your API Key]");
		  
		  Language lang2 = Language.GERMAN;
		  Language lang1 = Language.INDONESIAN;
		  String translatedText;
		  if (lang != lang2) {
			  translatedText = Translate.execute(st, lang, lang2);
		  }
		  else {
			  translatedText = Translate.execute(st, lang, lang1);
		  }
		  Language detectText = Detect.execute(translatedText);
		  Boolean status = detectText==lang2;
		  return status;
	}
	
	private static String [] BruteForce (String st){
		String plainAr [] = new String [26];
		for (int i=0; i < 26; i++){
			String plain = decrypting (st, i);
			plainAr [i]=plain;
		}
		return plainAr;
	}
	
	
	public static void main(String[] args) throws Exception{
	        System.out.print("Plaintext: ");
	        String st = bacaString();
	        System.out.print("ROT: ");
	        String rt = bacaString();
	        int rtint = Integer.parseInt(rt);
	        String cipher = encrypting (st, rtint);
	        System.out.print("Ciphertext: ");
	        System.out.println( cipher);
	        String plain = decrypting (cipher, rtint);
	        System.out.print("Plaintext: ");
	        System.out.println( plain );
	        System.out.println();
	        String [] plainAr = BruteForce (cipher);
	        
	       for (int i =0; i <26; i++){
	    	   Language Lang =  detect (plainAr[i]);
	    	    if (Lang!=null) {
	    	    	Boolean status2 =  detect2 (plainAr[i],Lang);
	    	    	if (status2 == true) {
	    	    		 System.out.print("Brute Force attack ke " + i + " : ");
	 		        	 System.out.println( plainAr[i]);
	    	    	}
	    	    }
	       }
	        	      
	    }
	 }

hasil yang didapatkan dari console adalah sebagai beriktu (contoh plaintext: Provides a Java wrapper around the Yandex machine translation web service API)

Plaintext: Provides a Java wrapper around the Yandex machine translation web service API
ROT: 13
Ciphertext: Cebivqrf n Wnin jenccre nebhaq gur Lnaqrk znpuvar genafyngvba jro freivpr NCV
Plaintext: Provides a Java wrapper around the Yandex machine translation web service API

Brute Force attack ke 13 : Provides a Java wrapper around the Yandex machine translation web service API

sebagai perbandingan jika kita hanya menggunakan deteksi bahasa saja, maka hasil yang didapatkan sebagai berikut:

Plaintext: Provides a Java wrapper around the Yandex machine translation web service API
ROT: 13
Ciphertext: Cebivqrf n Wnin jenccre nebhaq gur Lnaqrk znpuvar genafyngvba jro freivpr NCV
Plaintext: Provides a Java wrapper around the Yandex machine translation web service API

Brute Force attack ke 7 : Vxubojky g Pgbg cxgvvkx gxuatj znk Egtjkd sginotk zxgtyrgzout ckh ykxboik GVO
Brute Force attack ke 13 : Provides a Java wrapper around the Yandex machine translation web service API
Brute Force attack ke 18 : Kmjqdyzn v Evqv rmvkkzm vmjpiy ocz Tviyzs hvxcdiz omvingvodji rzw nzmqdxz VKD

Oleh sebab itu kombinasi antara deteksi bahasa dengan translate bahasa dapat meningkatkan ketepatan dalam penggunaan bruteforce attack pada caesar cipher.

Selanjutnya kita akan mencoba cara yang lebih mengasyikan yaitu menggunakan frekuensi analisis yang sebagai mana dijelaskan oleh ilmuan Abu Yūsuf Yaʻqūb ibn ʼIsḥāq aṣ-Ṣabbāḥ al-Kindī yang dijelaskan dalam bukunya Istikhraj al-Kotob Al-Mu’amah رسالة في استخراج الكتب المعماة (On Extracting Obscured Correspondence, more contemporary: On Decrypting Encrypted Correspondence ). Analsis frekuensi bisa dikatakan sudah merevolusi ilmu kriptografi sampai sekarang yang kita kenal sekarang ini.

Advertisements

Author: ridhobustami

orang ngak jelas

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s