Anda di halaman 1dari 6

Java-SimetriKripto

Project Kriptografi SimetriKripto - Asymetric


Cryptography
Project ini menggunakan build tools Maven dengan dependency library utama adalah bouncycastle yang
digunakan untuk mengambil berbagai algoritma kriptografi modern, dalam ini saya mengambil berbagai
algoritma simetry crypto seperti RC6, AES, dlsb. Tambahan library adalah common-codec yang digunakan untuk
mengambil berbagai fungsionalitas konversi dari biner ke hexa atau sebaliknya dan mengkonversi bit-bit menjadi
string agar dapat ditampilkan ke layar.
Bouncy Castle Inc. ( https://www.bouncycastle.org/ ) adalah sebuah lembaga nirlaba bidang teknologi
komputer yang berasal dari Australia dimana mereka menyediakan berbagai algoritma kriptografi yang "kuat"
untuk semua orang, sementara negara-negara seperti Amerika dan Eropa tidak mempublikasikan algoritma
kriptografi tersebut sebagai bagian dari kebijakan atas kerahasiaan teknologi bagi negara mereka yang dianggap
sebagai teknologi maju mereka.

Memasukkan Libray Pada File POM.xml


Masukkan dependency library yang diperlukan pada file POM. Sesuaikan nama artifak dan versi dari library
tersebut :

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.62</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.13</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
</dependencies>

Buat File SYmetricCrypto.java


Ini adalah file class java inti yang mengimplementasi algoritma simetri kriptografi. Didalam class ini berbagai
algoritma simetri kriptografi dapat dibuah dengan mengganti argumen pada object SymetricCrypto("xxx")
misalnya dengan AES, RC6, RC5, dan lain sebagainya.
Page 1 of 6
Java-SimetriKripto

package com.aryo;

import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

/**
* Created by aryo on 23-Jan-2017.
* Class kriptografi kunci simetris sederhana yang memiliki kunci enkrip/dekrip yang spesifik dari
pengguna
*/
public class SymetricCrypto {

private String algorithm; // dapat menggunakan bentuk "AES/ECB/PKCS5Padding"


private SecretKeySpec secretKey;
private byte[] key;

public SymetricCrypto() throws NoSuchPaddingException, NoSuchAlgorithmException {


this.algorithm = "AES";
}

public SymetricCrypto(String algorithm) throws NoSuchPaddingException, NoSuchAlgorithmException {


this.algorithm = algorithm;
}

private void setKey(String myKey) {


MessageDigest sha = null;
try {
key = myKey.getBytes("UTF-8");
sha = MessageDigest.getInstance("SHA-1");
key = sha.digest(key);
key = Arrays.copyOf(key, 16);
secretKey = new SecretKeySpec(key, algorithm);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}

public String encrypt(String plaintext, String password) {


try {
setKey(password);
Cipher cipher = Cipher.getInstance(algorithm, new BouncyCastleProvider());
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] ciphertext = cipher.doFinal(plaintext.getBytes("UTF-8"));
return Base64.encodeBase64String(ciphertext);
} catch (Exception e) {
System.out.println("Error while encrypting: " + e.toString());;
}
return null;
Page 2 of 6
Java-SimetriKripto
return null;
}

public String decrypt(String ciphertext, String password) {


try {
setKey(password);
Cipher cipher = Cipher.getInstance(algorithm, new BouncyCastleProvider());
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] ciphertextDecode = Base64.decodeBase64(ciphertext.getBytes());
byte[] plaintext = cipher.doFinal(ciphertextDecode);
return new String(plaintext, "UTF-8");
} catch (Exception e) {
System.out.println("Error while decrypting: " + e.toString());
}
return null;
}
}

Buat File Convert.java


Ini adalah file class java tambahan untuk fungsi mengkonversi format data. Misal dari byte array ke string dalam
heksadesimal, atau dari heksadesimal string ke bit-bit string, dan lain sebagainya agar data dapat ditampilkan ke
layar.

Page 3 of 6
Java-SimetriKripto

package com.aryo;

import javax.xml.bind.DatatypeConverter;
import java.io.UnsupportedEncodingException;

/**
* Created by aryo on 23-Jan-2017.
*
*/
public class Convert {

public static String byteArrayToHexString(byte[] bytesData) {


StringBuffer result = new StringBuffer();
for (byte byt : bytesData) {
result.append(Integer.toString((byt & 0xff) + 0x100, 16).substring(1));
}
return result.toString();
}

public static String hexStringToByteString(String hexStringData) throws UnsupportedEncodingException {


byte[] bytesData = DatatypeConverter.parseHexBinary(hexStringData);
String bytesString = new String(bytesData, "UTF8");
return bytesString;
}

public static String byteArrayToBytesString(byte[] bytesData) throws UnsupportedEncodingException {


String resultInBytesString = new String(bytesData, "UTF8");
return resultInBytesString;
}

public static byte[] hexStringToByteArray(String hexStringData) {


byte[] resultInByteArray = DatatypeConverter.parseHexBinary(hexStringData);
return resultInByteArray;
}
}

Buat File App.java


Ini adalah file class java yang memuat method main() sebagai awal program berjalan. Dalam class App tersebut
akan menggunakan class SymetricCrypto untuk mengeksekusi perintah-perintah yang diperlukan.

Page 4 of 6
Java-SimetriKripto

package com.aryo;

import java.security.NoSuchAlgorithmException;
import java.util.Scanner;
import javax.crypto.NoSuchPaddingException;
import org.apache.commons.codec.binary.Base64;

/**
* Kriptografi Simetri
*
*/
public class App {
public static void main(String[] args) throws NoSuchPaddingException, NoSuchAlgorithmException {
String lanjut;

System.out.println("Demo Kriptografi Kunci Simetris");

SymetricCrypto symetricCrypto = new SymetricCrypto("RC6");

Scanner inputKeyboard = new Scanner(System.in);

do {
System.out.print("Masukkan plaintext : ");
String plaintext = inputKeyboard.nextLine();

System.out.print("Masukkan password : ");


String paswdEnkrip = inputKeyboard.nextLine();

try {
String hasilEnkrip = symetricCrypto.encrypt(plaintext, paswdEnkrip);
System.out.println("Ciphertext in Base64 : " + hasilEnkrip);
System.out.println("Ciphertext in hexa : " +
Convert.byteArrayToHexString(Base64.decodeBase64(hasilEnkrip)));
System.out.println("Cihpertext in byte : " +
Convert.byteArrayToBytesString(Base64.decodeBase64(hasilEnkrip)));

System.out.print("Anda ingin mendekripsi (y/n) ? ");


String inginDekrip = inputKeyboard.nextLine();
if (inginDekrip.equalsIgnoreCase("y")) {
System.out.print("Masukkan ciphertext (dalam Base64) : ");
String ciphertext = inputKeyboard.nextLine();
System.out.print("Masukkan password : ");
String paswdDekrip = inputKeyboard.nextLine();
String hasilDekrip = symetricCrypto.decrypt(ciphertext, paswdDekrip);
System.out.println("Plaintext hasil dekripsi : " + hasilDekrip);
}
} catch (Exception e) {
System.out.println("MAAF!! ciphertext atau password salah.");
System.out.println(e.toString());
}
System.out.print("Anda ingin melanjutkan melakukan enkripsi lainnya (y/n) ? ");
lanjut = inputKeyboard.nextLine();
} while (lanjut.equalsIgnoreCase("y"));
inputKeyboard.close();
}
}

Page 5 of 6
Java-SimetriKripto

Struktur Project
Struktur project seharusnya akan memiliki pola :

Project_Directory
|---src
|---main_package
|--- App.java
|--- Convert.java
|--- SymetricCrypto.java
|---pom.xml

Page 6 of 6

Anda mungkin juga menyukai