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