Merubah dari Bytes ke Bentuk Hexadecimal & Contoh Enkripsi simple menggunakan algoritma simetrik


Enkripsi menggunakan JCE-JCA baik menggunakan provider bawaan java ataupun provider lain seperti BC mempunyai inputan, outputan dan kunci beupa array byte sesuai dengan panjang dari spesifikasi algoritma tersebut. Untuk memudahkan verifikasi hasil khususnya didalam console print kita dapat menggunakan format hexadecimal sebagai representasi dari data array byte, sebagai contoh berikut:

byte[] input = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};

data diatas jika kita langsung System.out.println(input); maka hasil yang kita dapatkan adalah [B@372ea2bc, tidak sesuai dengan reperesentasi byte yang kita inginkan oleh karena itu diperlukan fungsi sebagai berikut

public class Utils
{
    private static String digits = "0123456789abcdef";
    /**
     * Return length many bytes of the passed in byte array as a hex string.
     *
     * @param data the bytes to be converted.
     * @param length the number of bytes in the data block to be converted.
     * @return a hex representation of length bytes of data.
     */
    public static String toHex(byte[] data, int length)
    {
        StringBuffer    buf = new StringBuffer();
        for (int i = 0; i != length; i++)
        {
            int v = data[i] & 0xff;
            buf.append(digits.charAt(v >> 4));
            buf.append(digits.charAt(v & 0xf));
        }
        return buf.toString();
    }
    /**
     * Return the passed in byte array as a hex string.
     *
     * @param data the bytes to be converted.
     * @return a hex representation of data.
     */
    public static String toHex(byte[] data)
    {
        return toHex(data, data.length);
    }
}

sebagai contoh, fungsi tersebut kita gunakan untuk Enkirpsi menggunakan AES dengan mode ECB dan tanpa padding, sebagai berikut:

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

public class SimpleSymmetricExample
{
    public static void main(String[] args) throws Exception
    {
        byte[]        input = new byte[] {
                          0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
                          (byte)0x88, (byte)0x99, (byte)0xaa, (byte)0xbb,
                          (byte)0xcc, (byte)0xdd, (byte)0xee, (byte)0xff };
        byte[]        keyBytes = new byte[] {
                          0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
                          0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
                          0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 };
        SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
        Cipher        cipher = Cipher.getInstance("AES/ECB/NoPadding", "BC");
        System.out.println("input text : " + Utils.toHex(input));
        // encryption pass
        byte[] cipherText = new byte[input.length];
        cipher.init(Cipher.ENCRYPT_MODE, key);
        int ctLength = cipher.update(input, 0, input.length, cipherText, 0);
        ctLength += cipher.doFinal(cipherText, ctLength);
        System.out.println("cipher text: " + Utils.toHex(cipherText)
                                                     + " bytes: " + ctLength);

        // decryption pass
        byte[] plainText = new byte[ctLength];
        cipher.init(Cipher.DECRYPT_MODE, key);
        int ptLength = cipher.update(cipherText, 0, ctLength, plainText, 0);
        ptLength += cipher.doFinal(plainText, ptLength);
        System.out.println("plain text : " + Utils.toHex(plainText)
                                                     + " bytes: " + ptLength);
    }
}

maka hasil yang kita dapatkan sebagai berikut:
input text : 00112233445566778899aabbccddeeff
cipher text: dda97ca4864cdfe06eaf70a0ec0d7191 bytes: 16
plain text : 00112233445566778899aabbccddeeff bytes: 16

Mengirim multiple Email menggunakan SSL Java


Kali ini misal kita dihadapkan case sebagai berikut:
– Kirimkan email berikut gambar dan attachment ke 20 list penerima
– email harus bersifat personal atau tanpa menggabung alamat-alamat email tersebut kedalam satu surat
– Judul disisipkan Nama penerima , dan juga format message disisipkan nama lengkap dan nama panggilan
– format message yang dimaksud sebagai berikut:

Continue reading “Mengirim multiple Email menggunakan SSL Java”

Install provider Bouncy castle


Sebenarnya kita dapat menggunakan library bawaan java yaoti JCA dan JCE, namun kali ini kita menggunakan provider lain yaitu Bouncy castle, BC sendiri adalah salah satu komunitas open source yang memiliki interest kebidang kirptografi sejak tahun 1990 khususnya didalam pemograman c# dan java. BC sendiri sudah mendukung algoritma kriptografi simetrik seperti GOST. Untuk menginstall dan menEnableKan berikut langkah-langkahnya

tambahkan didalam line berikut list provider java.security didirektori /usr/lib/jvm/java-8-oracle/jre/lib/security

security.provider.N=org.bouncycastle.jce.provider.BouncyCastleProvider

N adalah urutan sesuai nomor urut yang terdapat didalam java.security anda, sebagai contoh

#
# List of providers and their preference orders (see above):
#
security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=sun.security.ec.SunEC
security.provider.4=com.sun.net.ssl.internal.ssl.Provider
security.provider.5=com.sun.crypto.provider.SunJCE
security.provider.6=sun.security.jgss.SunProvider
security.provider.7=com.sun.security.sasl.Provider
security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.9=sun.security.smartcardio.SunPCSC

maka tambahkandilne setelah N=9: security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider

setelah itu install library bcprov-JdkVersion-Version.jar. sesuai versi yang anda inginkan, .jar dapat didownload di https://www.bouncycastle.org/latest_releases.html

cek apakah BC sudah terinstall:


import java.security.Security;
/**
* Basic class to confirm the Bouncy Castle provider is
* installed.
*/
public class SimpleProviderTest
{
public static void main(String[] args)
{
String providerName = "BC";
if (Security.getProvider(providerName) == null)
{
System.out.println(providerName + " provider not installed");
}
else
{
System.out.println(providerName + " is installed.");
}
}
}

Jika sudah di console akan terprint
BC is installed.

Continue reading “Install provider Bouncy castle”

Kompas.com vs Detik.com Lanjutan (bagian 2)


Web scraping adalah salah satu teknik yang digunakan oleh untuk mengekstrasi informasi dari website.
Kali ini akan dilakukan scraping kepada media daring kompas.com dan detik.com menggunakan java sebagai bahasa pemograman dan mysql sebagai database, scrapping dilakukan dari Wed Apr 13 13:48:03 SAMT 2016 sampai dengan Thu Apr 14 19:20:03 SAMT 2016 dengan interval 3 kali scraping/ 2-3 detik
Data yang diambil dari kedua website tersebut adalah data berita dengan rincian: Waktu berita, Judul berita, link berita secara berturut-turut berdasarkan waktu posting. Dan data scraping tersebut telah mengalami sortir sehingga tidak terjadi duplikasi terhadap link berita. Jumlah data yg berhasil discraping sebanyak 1338 Judul berita dengan kompas.com sebanyak 721 dan detik.com sebanyak 616 judul berita
Salah satu tujuan dari scraping website tersebut adalah ingin mengetahui seberapa sering nama-nama ditulis dalam Judul berita berdasarkan kata kunci sebagai berikut:
gambar 1,2,3: joko, ahok, yusril, lulung, griezmann, jk, rio, messi, sunny, nyalla, zaskia, aguan
gambar 3,4,5: kpk, polri, jaksa, presiden, dpr, dprd, bpk, bumn, gubernur, menteri, kejagung, polisi
Hasil yang didapatkan sebagai berikut:

f

e

d

c

b

a

Kompas.com vs Detik.com


Oke, kali ini kita mencoba mengulik tentang scraping website. Scraping website gampangnya adalah suatu teknik mengambil data (text, gambar, link, dll) yang berasal dari website. Website media daring atau online adalah website yang memiliki pergerakan yang luar biasa, yang saya maksud adalah update dilaman utamanya, nanti kita liat lebih detail lagi. Saya mencoba memilih kompas.com dan detik.com, alasannya adalah kekesalan saya terhadap berita tentang fauzi bowo, dikarenakan sangat sedikit sekali berita tentang beliau, padahal beliau menjabat menjadi wakil gubernur DKI jakarta selama 5 tahun! dan juga menjabat gubernur DKI jakarta selama 5 tahun!, dan tidak ketinggalan menjadi sekda selama 4 tahun! tetapi apa daya berita tentang beliau hampir tidak ada di media daring di waktu waktu ini, yang ada berita tentang ….

Okeh lupakan sejenak tentang om bowo, sebenernya kalau mau gampang kalian bisa datang ke kantor nya kompas, meminta dengan baik-baik data website kompas.com, data yg kalian bisa minta adalah judul dari newsfeed, jam berapa, judul postingannya. Dari data tersebut kita bisa melihat seberapa sering fauzi bowo (lagi) menjadi judul berita kompas.com. Atau kalian ingin tau lagi kalian bisa dapat jam kerja tukang posting dari website tersebut, kira kira kalau malam-malam dia kerja ngak ya?? Namun karena saya ngak mau dateng ke kantor kompas atau detik karena sangat tidak efektif! mengapa tidak efektif? …………

Oke, tools yang saya gunakan dalam scrapping adalah, Java dengan bantuan libary Jsoup, Mysql, dan tentunya komputer dan internet, skema sederhana nya bisa dilihat sebagai berikut:
DSC_0006

hasil yang saya dapatkan sebagai berikut:
Scrapping dilakukan pada waktu Wed Apr 13 13:48:03 SAMT 2016 sampai dengan Thu Apr 14 08:03:30 SAMT 2016 atau Hari Rabu 13 April 2016 pukul 13:48:03 sampai dengan Hari Kamis 14 April 2016 pukul 11:03:30 kurang lebih 18 jam 15 menit 27 detik

Screenshot from 2016-04-14 08:03:55

Kompas unggul dalam jumlah postingan dibanding detik dalam kurun waktu tersebut, artinya karyawan kompas lebih rajin dibanding detik, jika kita rata-ratakan maka dalam satu jam kompas berhasil memposting 19 berita

Sekarang kita coba lihat berapa kali Presiden Jokowi dengan keysearch ‘joko’ (jikalau ki joko bodo menjadi judul berita maka akan ada error)
Screenshot from 2016-04-14 08:23:39
Screenshot from 2016-04-14 08:25:04

Dikompas Jokowi unggul 11 posting dibanding detik yang ‘hanya’ 7. Dan kebetulan ki Joko Bodo tidak ada yang ada Djokovic (error 1)

Oke, sekarang kita test coba tebak lebih banyak berita dengan keysearch di judul ‘bola’ atau berita dengan keysearch di judul ‘indonesia’, kenapa tidak dengan bulutangkis misalnya? karena hasilnya sudah ketahuan
Screenshot from 2016-04-14 08:56:39
Screenshot from 2016-04-14 08:57:18

Ternyata Bola unggul 54 point dibanding Indonesia yang hanya mendapat 27 point, hal ini bisa dimaklumi dikarenakan semalam adalah liga champion!

Kembali ke revenge Fauzi Bowo, seltelah mantan gubernur DKI jakarta kita sudah periksa di atas, sekarang kita check ‘musuh bebuyutan’ (judul film yg dibintangi oleh benyamin) dari Fauzi Bowo
Screenshot from 2016-04-14 09:05:44

32 point lebih banyak dari keysearch Indonesia, tapi tetep masih kalah sama anak bola!

Sekarang kalau penasaran sama si tukang posting di kompas.com sama detik.com jam kerjanya, kita bisa liat dari time posting newsfeed tersebut, data waktu disini mungkin terdapat selisih sampai 1 menit dengan postingan nya, karena data waktu yang saya dapatkan adalah data waktu execute program java pada saat parsing
DSC_0006bb

sayangnya jam 8,9,10,11 masih belum full tercaputre, (catatan waktu menggunakan samara time atau 3 jam lebih lambat dibanding WIB, jadi kalau jam 9 tertulis digrafik berarti jam 12 waktu WIB).

update data waktu posting dan sudah dikonverter kedalam WIB
DSC_0006bbc

Dari waktu grafik waktu tersebut kita bisa liat tukang posting mengalami penurunan produktifitas postingan nya selepas jam 18 SMT atau 21 WIB dan menanjak lagi di 03 SMT atau 06 WIB, artinya apa? karena tukang posting manusia juga dan siapa juga yang baca berita malem-malem!

Pesan moral yg bisa diambil adalah kurangilah membaca media daring! perbanyak baca buku!

Penggunaan Base64 pada Kriptografi


Ketika kita menggunakan atau mendesain kriptografi dalam java kita dihadapkan salah satu problem yaitu key atau kunci. Problem kunci ini termasuk kompleks seperti pertukaran/pengiriman kunci, generator kunci, padding, salt dan lain lain. Salah satu problem yang akan kita coba kupas adalah generator kunci:

Didalam library JCE, dan JCA kita bisa membangkitkan kunci untuk algoritma yang kita gunakan, kunci disini bersifat random namun tidak dideterministik, yang dimaksud tidak deterministik adalah kita tidak dapat membangkitkan kembali kunci dipenerima jadi kunci harus dikirim melalui kanal secure atau hanya yang pihak yang berwenang mengetahui kunci.

Kunci juga bisa kita input secara manual, seperti layaknya password yang kita gunakan. Namun algoritma kriptografi hanya mengenal inputan berupa deretan bit atau byte seperti DES menggunakan panjang bit sebanyak 56 bit atau 8 byte. Oleh sebab itu perlu metode bagaimana algoritma dapat mengenali inputan berupa huruf layaknya password. Namun kali ini kita tidak membahas itu.

Kali ini kita mencoba membahas tentang kunci inputan yang berupa byte dapat diterjemahkan atau dibaca kedalam bentuk huruf-huruf latin, hal ini bermanfaat agar user dapat membaca, mengcopy, menyimpan, ataupun mengingat.Untuk mengatasi hal tersebut salah satu solusinya dalah menggunakan java.util.Base64.Encoder, cara kerja BASE64 di class tersebut menggunakan standart RFC 4648 and RFC 2045

Sebagai contoh kita mempunyai deretan kunci dalam bentuk byte untuk algoritma DES

byte[] keyBytes = new byte[] {(byte) 0x00 , 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};

kita akan rubah kedalam bentuk SecretKeySpec agar dapat digunakan pada algoritma DES

SecretKeySpec key64 = new SecretKeySpec(keyBytes, "DES");

setelah itu kita akan mencoba mengkonversikan kedalam BASE64 sebagai berikut:

String encodedKey = Base64.getEncoder().encodeToString(key64.getEncoded());
System.out.println(encodedKey);

maka akan kita akan medapatkan hasil AAECAwQFBgc=, darimana bentuk tersebut? berikut step-step nya

Nilai Byte {0x00 , 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};

Nilai byte diatas dikonversikan kedalam bit dan bagi kedalam 24 bit blok, jika diblok bit terakhir tidak sepanjang 24 maka tambakhkan bit 0 sebagai padding
{0000 0000 0000 0001 0000 0010} {0000 0011 0000 0100 0000 0101} {0000 0110 0000 0111 [00000000]}

Kumpulkan setiap bit kedalam blok bit sepanjang 6 bit
000000 000000 000100 000010 000000 110000 010000 000101 000001 100000 011100 000000

dalam decimal: 0 0 4 2 0 48 16 5 1 32 28 (padding)

terjemahkan setiap 6 bit tersebut kedalam seperti tabel berikut:

Value Char Value Char Value Char Value Char
0 A 16 Q 32 g 48 w
1 B 17 R 33 h 49 x
2 C 18 S 34 i 50 y
3 D 19 T 35 j 51 z
4 E 20 U 36 k 52 0
5 F 21 V 37 l 53 1
6 G 22 W 38 m 54 2
7 H 23 X 39 n 55 3
8 I 24 Y 40 o 56 4
9 J 25 Z 41 p 57 5
10 K 26 a 42 q 58 6
11 L 27 b 43 r 59 7
12 M 28 c 44 s 60 8
13 N 29 d 45 t 61 9
14 O 30 e 46 u 62 +
15 P 31 f 47 v 63 /

jika terdapat 1 blok bit padding maka terjemahan blok tersebut menjadi character “=”, maka hasil yang kita dapatkan seperti berikut AAECAwQFBgc= deretan huruf itu kita bisa gunakan sebagai kunci pada saat dekripsi dengan menggunakan

byte[] decodedKey = Base64.getDecoder().decode(encodedKey);
SecretKey originalKey = new SecretKeySpec(decodedKey, 0, decodedKey.length, "DES");

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.