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

Advertisements

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”

Install Unrestricted policy files di Java Crypto


Normalnya key yang dapat digunakan di java crypto adalah tidak lebih dari 128 bit (terkecuali untuk 3DES) dan RSA yang dibatasi sampai 2048 bit. Bagaimana jika kita ingin mengunakan kunci lebih dari 128 misal untuk symetric algorithm seperti blowfish 192 bit?
untuk itu kita perlu mengaktifkan unrestrited policy files, untuk java7 dapat didownload di http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
dan java8 di http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

setelah itu jika menggunakan linux replace file kedalam direktori jvm sebagai berikut: /usr/lib/jvm/java-8-oracle/jre/lib/security US_export_policy.jar dan local_policy.jar dengan file yg kita download sebelumnya.
untuk linux diperlukan akses root untuk mereplace kedua file tersebut

gunakan script dibawah ini untuk mengetest apakan Policy sudah di unrestricted


import javax.crypto.*;
import javax.crypto.spec.*;
public class SimplePolicyTest
{
public static void main(String[] args) throws Exception
{
byte[] data = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };
// create a 64 bit secret key from raw bytes
SecretKey key64 = new SecretKeySpec(
new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 },
"Blowfish");
// create a cipher and attempt to encrypt the data block with our key
Cipher c = Cipher.getInstance("Blowfish/ECB/NoPadding");
c.init(Cipher.ENCRYPT_MODE, key64);
c.doFinal(data);
System.out.println("64 bit test: passed");
// create a 192 bit secret key from raw bytes
SecretKey key192 = new SecretKeySpec(
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 },
"Blowfish");
// now try encrypting with the larger key
c.init(Cipher.ENCRYPT_MODE, key192);
c.doFinal(data);

System.out.println("192 bit test: passed");
System.out.println("Tests completed");
}
}

Jika sukses maka print di console sebagai berikut
64 bit test: passed
192 bit test: passed
Tests completed

jika tidak maka:
64 bit test: passedException in thread “main”
java.security.InvalidKeyException: Illegal key size or default parameters
at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1026)
at javax.crypto.Cipher.init(Cipher.java:1245)
at javax.crypto.Cipher.init(Cipher.java:1186)
at SimplePolicyTest.main(SimplePolicyTest.java:24)

Algoritma Enkripsi Citra dengan Pseudo One-Time Pad yang Menggunakan Sistem Chaos [Rinaldi Munir]


Kali ini kita akan mencoba menelaah sebuah artikel yang dipublikasikan oleh Rinaldi Munir pada Konferensi Nasional Informatika – KNIF 2011 dengan judul Algoritma Enkripsi Citra dengan Pseudo One-Time Pad yang Menggunakan Sistem Chaos

algoritma yang diusulkan sebagai berikut
(a) Enkripsi
Masukan: citra, x0
Keluaran: citra terenkripsi

Step 1: Baca pixel-pixel citra dan simpan di dalam sebuah matriks. Jika citra tersebut citra 24-bit, maka setiap komponen R, G, dan B disimpan di dalam tiga matriks berbeda.

Step 2: Ekstraksi byte setiap pixel citra, misalkan byte-byte tersebut adalah p1, p2, …, pn.

Step 3: Iterasikan logistic map dengan nilai awal x0 (kunci rahasia). Konversikan setiap nilai chaotic menjadi integer dengan persamaan (2). Misalkan barisan integer yang dihasilkan adalah k1, k2, …, kn.

Step 4: Enkripsi setiap pi dengan ki menggunakan persamaan (4). hasil enkripsi adalah c1, c2, …, cn.

Step 5: Letakkan kembali byte-byte hasil enkripsi pada posisi pixel semula. Hasil dari langkah terakhir ini adalah citra terenkripsi.

(b) Dekripsi
Masukan: citra terenkripsi, x0
Keluaran: citra semula

Step 1: Baca pixel-pixel citra dan simpan di dalam sebuah matriks. Jika citra tersebut citra 24-bit, maka setiap komponen R, G, dan B disimpan di dalam tiga matriks berbeda.

Step 2: Ekstraksi byte setiap pixel citra, misalkan byte-byte tersebut adalah p1, p2, …, pn.

Step 3: Iterasikan logistic map dengan nilai awal x0 (kunci rahasia). Konversikan setiap nilai chaotic menjadi integer dengan persamaan (2). Misalkan barisan integer yang dihasilkan adalah k1, k2, …, kn.

Step 4: Enkripsi setiap pi dengan ki menggunakan persamaan (6). Hasil enkripsi adalah c1, c2, …, cn.

Step 5: Letakkan kembali byte-byte hasil enkripsi pada posisi pixel semula. Hasil dari langkah terakhir ini adalah citra semula.

berikut untuk implementasi nya : https://github.com/ridhb/Image-Encryption-with-Pseudo-One-Time-Pad

Advance Encryption Standard in Matlab


Di matlab tidak tersedia kriptografi library ataupun script yang dapat digunakan secara langsung oleh sebab itu kita perlu menulis sendiri algoritma kriptografi yang kita inginkan, AES advance Encryption Standard yang digunakan saat ini, hampir sudah 16 tahun algoritma ini digunakan sejak diperkenalkan pada tahun 2001 dengan nama Rinjadel. Salah satu sumber yang dapat digunakan untuk implementasi algoritma ini adalah http://buchholz.hs-bremen.de/aes/schluessel.htm disini Prof Buchholz sangat jelas membuat algoritma AES-128 dalam pemograman matlab sekaligus terdapat pdf yang menjelaskan implementasi AES pada matlab tersebut.

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.