Sabtu, 06 Oktober 2012

Algoritma ElGamal dan Code

Algoritma ElGamal Algoritma Elgamal juga adalah algoritma kriptografi kunci-publik.
 Algoritma ini pada mulanya digunakan untuk digital signature, namun kemudian dimodifikasi sehingga juga bisa digunakan untuk enkripsi dan dekripsi. Kekuatan algoritma ini terletak pada sulitnya menghitung logaritma diskrit.

 Besaran-besaran yang digunakan d dalam algoritma ElGamal:
1. Bilangan prima, p (tidak rahasia)
2. Bilangan acak, g ( g < p) (tidak rahasia)
3. Bilangan acak, x (x < p) (rahasia)
 4. M (plainteks) (rahasia)
 5. a dan b (cipherteks) (tidak rahasia)

Prosedur Membuat Pasangan Kunci
 1. Pilih sembarang bilangan prima p.
 2. Pilih dua buah bilangan acak, g dan x, dengan syarat g < p dan x < p.
3. Hitung y = gx mod p.
4. Kunci publik adalah y, kunci rahasia adalah x.

 Nilai g dan p tidak dirahasiakan dan dapat diumumkan kepada anggota kelompok.
 Enkripsi Plainteks disusun menjadi blok-blok m1, m2, …, sedemikian sehingga setiap blok merepresentasikan nilai di dalam rentang 0 sampai p – 1.
Pilih bilangan acak k, yang dalam hal ini 0 == k == p – 1, sedemikian sehingga k relatif prima dengan p – 1. Setiap blok m dienkripsi dengan rumus a = g^k mod p b = y^km mod p Pasangan a dan b adalah cipherteks untuk blok pesan m. Jadi, ukuran cipherteks dua kali ukuran plainteksnya.

Dekripsi Untuk mendekripsi a dan b digunakan kunci rahasia, x, dan plainteks m diperoleh kembali dengan persamaan m = b/a^x mod p

Catatlah bahwa karena
a^x == g^kx (mod p) maka b/a^x == y^km/a^x == g^xkm/g^xk == m (mod p) berarti bahwa plainteks dapat ditemukan kembali dari pasangan cipherteks a dan b.


 import java.math.*;
 import java.util.*;
 import java.security.*;
import java.io.*;

public class ElGamal {

 public static void main(String[] args) throws IOException {
 BigInteger p, b, c, secretKey;
Random sc = new SecureRandom();
secretKey = new BigInteger("12345678901234567890"); // // public key calculation // System.out.println("secretKey = " + secretKey);
 p = BigInteger.probablePrime(64, sc);
 b = new BigInteger("3");
c = b.modPow(secretKey, p);
System.out.println("p = " + p);
System.out.println("b = " + b);
System.out.println("c = " + c); // // Encryption //
System.out.print("Enter your Big Number message -->");

String s = Tools.getString();
 BigInteger X = new BigInteger(s);
BigInteger r = new BigInteger(64, sc);
BigInteger EC = X.multiply(c.modPow(r, p)).mod(p);
BigInteger brmodp = b.modPow(r, p);
System.out.println("Plaintext = " + X);
System.out.println("r = " + r);
System.out.println("EC = " + EC);
System.out.println("b^r mod p = " + brmodp); // // Decryption //
BigInteger crmodp = brmodp.modPow(secretKey, p);
BigInteger d = crmodp.modInverse(p);
 BigInteger ad = d.multiply(EC).mod(p);
 System.out.println("\n\nc^r mod p = " + crmodp);
 System.out.println("d = " + d);
 System.out.println("Alice decodes: " + ad);
 }
 }

Tidak ada komentar:

Posting Komentar