Anda di halaman 1dari 6

Java-RSAonMemory

Project Kriptografi RSA (Advanced Encryption Standard) -


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 algoritma RSA.
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.
Didalam project ini seluruh hasil proses enkripsi, dekripsi, dan pembangkitan private key dan public key akan
berada pada memori komputer.

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>
</dependencies>

Buat File RSAwithBC.java


Ini adalah file class java inti yang mengimplementasi algoritma RSA dengan menggunakan library Bouncy Castle.

package com.aryo;

import java.io.BufferedReader;
import java.io.FileReader;
import java.security.*; Page 1 of 6
Java-RSAonMemory
import java.security.*;

import org.bouncycastle.crypto.AsymmetricBlockCipher;
import org.bouncycastle.crypto.engines.RSAEngine;
import org.bouncycastle.crypto.params.AsymmetricKeyParameter;
import org.bouncycastle.crypto.util.PrivateKeyFactory;
import org.bouncycastle.crypto.util.PublicKeyFactory;

/**
* Created by aryo on 14-Feb-2017.
*
* Proses Kriptografi RSA pada memori saja
* 1. Membangkitkan pasangan kunci (publicKey dan privateKey)
* 2. Melakukan enkripsi dengan kunci publicKey
* 3. Melakukan dekripsi dengan kunci privateKey
*/
public class RSAwithBC {
int keySize; // contoh keySize : 1024 atau 2048

public RSAwithBC() {
this.keySize = 1024;
}

public RSAwithBC(int keySize) {


this.keySize = keySize;
}

/**
* Bagian 1: Pembangkitan pasangan kunci
* methods: generate(), createFixedRandom().
* inner class: FixedRand.
*/
public KeyPair generatePairKey() {
try {
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

// Create the public and private keys


KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "BC");
//BASE64Encoder b64 = new BASE64Encoder();

SecureRandom random = createFixedRandom();


generator.initialize(keySize, random);

KeyPair keypair = generator.generateKeyPair();


Key pubKey = keypair.getPublic();
Key privKey = keypair.getPrivate();

//System.out.println("publicKey : " + b64.encode(pubKey.getEncoded()));


//System.out.println("privateKey : " + b64.encode(privKey.getEncoded()));

return keypair;
} catch (Exception e) {
System.out.println(e.toString());
}
return null;
}
/*** akhir bagian pembangkitan pasangan kunci ***/

/** Page 2 of 6
Java-RSAonMemory
/**
* Bagian 2: Enkripsi String menggunakan kunci publik
* methods: encrypt(...)
*/
public String encrypt(Key keyPublic, String inputData) {
String encryptedData = null;
try {
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

AsymmetricKeyParameter publicKey = (AsymmetricKeyParameter)


PublicKeyFactory.createKey((keyPublic.getEncoded()));
AsymmetricBlockCipher e = new RSAEngine();
e = new org.bouncycastle.crypto.encodings.PKCS1Encoding(e);
e.init(true, publicKey);

byte[] messageBytes = inputData.getBytes();


byte[] hexEncodedCipher = e.processBlock(messageBytes, 0, messageBytes.length);

//System.out.println(getHexString(hexEncodedCipher));
encryptedData = getHexString(hexEncodedCipher);
} catch (Exception e) {
System.out.println(e);
}
return encryptedData;
}
/*** Akhir bagian Enkripsi String menggunakan kunci publik ***/

/**
* Bagian 3: Dekripsi String menggunakan kunci private
* methods: decrypt(...)
*/
public String decrypt(Key keyPrivate, String encryptedData) {
String outputData = null;
try {
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

AsymmetricKeyParameter privateKey = (AsymmetricKeyParameter)


PrivateKeyFactory.createKey(keyPrivate.getEncoded());
AsymmetricBlockCipher e = new RSAEngine();
e = new org.bouncycastle.crypto.encodings.PKCS1Encoding(e);
e.init(false, privateKey);

byte[] messageBytes = hexStringToByteArray(encryptedData);


byte[] hexEncodedCipher = e.processBlock(messageBytes, 0, messageBytes.length);

//System.out.println(new String(hexEncodedCipher));
outputData = new String(hexEncodedCipher);
} catch (Exception e) {
System.out.println(e.toString());
}
return outputData;
}
/*** akhir bagian dekripsi menggunakan kunci private ***/

private SecureRandom createFixedRandom() {


return new FixedRand();
}

Page 3 of 6
Java-RSAonMemory
private class FixedRand extends SecureRandom {
// menghilangkan warning untuk SecureRandom
private static final long serialVersionUID = 1L;

MessageDigest sha;
byte[] state;

FixedRand() {
try {
this.sha = MessageDigest.getInstance("SHA-1");
this.state = sha.digest();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("gagal mendapatkan SHA-1!");
}
}

public void nextBytes(byte[] bytes) {


int off = 0;
sha.update(state);
while (off < bytes.length) {
state = sha.digest();
if (bytes.length - off > state.length) {
System.arraycopy(state, 0, bytes, off, state.length);
} else {
System.arraycopy(state, 0, bytes, off, bytes.length - off);
}
off += state.length;
sha.update(state);
}
}
}

public static String getHexString(byte[] b) throws Exception {


String result = "";
for (int i = 0; i < b.length; i++) {
result += Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1);
}
return result;
}

public static byte[] hexStringToByteArray(String s) {


int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i + 1), 16));
}
return data;
}

private static String readFileAsString(String filePath) throws java.io.IOException {


StringBuffer fileData = new StringBuffer(1000);
BufferedReader reader = new BufferedReader(new FileReader(filePath));
char[] buf = new char[1024];
int numRead = 0;
while ((numRead = reader.read(buf)) != -1) {
String readData = String.valueOf(buf, 0, numRead);
fileData.append(readData);
buf = new char[1024]; Page 4 of 6
Java-RSAonMemory
buf = new char[1024];
}
reader.close();
//System.out.println(fileData.toString());
return fileData.toString();
}
}

Buat File App.java


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

package com.aryo;

import java.security.Key;
import java.security.KeyPair;
import java.util.Scanner;

import org.apache.commons.codec.binary.Base64;

/**
* Algoritma RSA dengan paket library Bouncy Castle. Key pair berada di memori
*
*/
public class App {
public static void main(String[] args) {
Key kunciPublik = null;
Key kunciPrivate = null;
String isWantDemoAgain;

System.out.println("Demo Kriptografi Asimetris RSA on memory \n");


RSAwithBC rsaBC = new RSAwithBC(2048);
Scanner inputKeyboard = new Scanner(System.in);

do {
// Pembangkitan pasangan kunci
System.out.print("Ingin membuat pasangan kunci di memori (y/n) ? ");
String isCreatePairKey = inputKeyboard.nextLine();
if (isCreatePairKey.equalsIgnoreCase("y")) {
KeyPair pasanganKunci = rsaBC.generatePairKey();
kunciPublik = pasanganKunci.getPublic();
kunciPrivate = pasanganKunci.getPrivate();
System.out.println("Kunci Publik : \n" + Base64.encodeBase64(kunciPublik.getEncoded())
+ "\n");
System.out.println("Kunci Private : \n" +
Base64.encodeBase64(kunciPrivate.getEncoded()) + "\n");
}

// Proses enkripsi pesan


System.out.print("Ingin melakukan enkripsi RSA (y/n) ? ");
String isWantEncrypt = inputKeyboard.nextLine();
if (isWantEncrypt.equalsIgnoreCase("y")) {
System.out.print("Masukkan plaintext : ");
String plaintext = inputKeyboard.nextLine();

Page 5 of 6
Java-RSAonMemory
String chipertext = rsaBC.encrypt(kunciPublik, plaintext);
System.out.println("Chipertext : " + chipertext + "\n");
}

// Proses Dekripsi sebuah String menggunakan RSA


System.out.print("Ingin melakukan dekripsi RSA (y/n) ? ");
String isWantDecrypt = inputKeyboard.nextLine();
if (isWantDecrypt.equalsIgnoreCase("y")) {
System.out.print("Masukkan ciphertext : ");
String ciphertext = inputKeyboard.nextLine();

String decryptedText = rsaBC.decrypt(kunciPrivate, ciphertext);


System.out.print("Hasil Dekripsi : " + decryptedText + "\n");
}

System.out.print("Ingin melakukan demo kriptografi RSA lagi (y/n) ");


isWantDemoAgain = inputKeyboard.nextLine();
} while (isWantDemoAgain.equalsIgnoreCase("y"));
inputKeyboard.close();
}
}

Struktur Project
Struktur project seharusnya akan memiliki pola :

|---Project_Directory
|---src
|---main_package
|--- App.java
|--- RSAwithBC.java
|---pom.xml

Referensi
https://www.mysamplecode.com/2011/08/rsa-encryption-decryption-using-bouncy.html

Page 6 of 6

Anda mungkin juga menyukai