Enkripsi dengan Paillier Kriptosistem

Bismillah..Moga bemanfaat ya 🙂

Enkripsi, wah pasti kata ini dah gak asing ditelinga temen-temen palagi artikel2, buku2, paper2 ataupun blog-blog yang membahas tentang enkripsi ini dah banyak banget. Enkripsi adalah salah satu cara yang digunakan untuk mengamankan data atau informasi sehingga sifatnya menjadi rahasia.

Proses enkripsi selalu melibatkan yang namanya key(kunci). Kunci disini fungsinya sama seperti kunci seperti yang kita kenal dalam kehidupan sehari-hari misal kunci rumah, kunci motor, ato kunci pagar. Maksudnya kunci ini sebagai penentu keamanan suatu data, jangan sampai jatuh ke tangan orang lain. Kalau sampai dipegang atau diketahui orang lain maka orang tersebut dapat dengan mudah mengetahui arti dari kata yang telah dienkripsi sebelumnya.

Paillier adalah sebuah sistem yang berbasis algoritma asimetris probabilistik. Maksudnya disini Paillier menggunakan dua kunci yang berbeda untuk proses enkripsi dan dekripsi. Untuk enkripsi yang digunakan adalah sebuah algoritma kriptografi kunci publik.

Sistem Paillier ini memiliki properti – properti seperti random-self-reducibility, additive homomorphic property, dan self–blinding. Properti-properti inilah yang menyebabkan Paillier ini dapat digunakan untuk berbagai keperluan, seperti pemungutan suara elektronik dan uang elektronik.

  1. Homomorphic property. Properti homomorfisme memungkinkan penjumlahan nilai yang dienkripsi dengan nilai yang dienkripsi lainnya tanpa melalui proses dekripsi satu-persatu terlebih dahulu, tetapi hasil penjumlahannya dapat didekripsi tanpa mengetahui nilai–nilai yang membentuknya. Dengan maksud agar suara hasil pilihan voter tetap terjaga kerahasiaannya. Sebuah fungsi enkripsi F(M) dikatakan homomorphic jika F(M1)F(M2) = F(M1+M2), yaitu jika perkalian dua pesan yang terenkripsi adalah sama dengan penjumlahan dua pesan yang terenkripsi
  2. Properti semantic security, maksudnya adalah dengan kriptosistem Paillier ini, maka suara yang masuk dapat dilindungi dari serangan yang bersifat Chosen Plaintext attack, namun karena sifatnya yang malleable, maka suara yang masuk masih dapat diserang melalui metode Chosen Ciphertext attack, kecuali apabila menggunakan skema ROM
  3. Properti malleability, karena kelenturan logika didalam pemrograman komputer yang dimiliki oleh kriptosistem Paillier.

Key Generation

Key generation adalah pembuatan kunci secara elektronis dengan menggunakan suatu alat pembangkit rangkaian kunci (key generator). Metode ini sudah menggunakan alat elektronik dalam pembangkitan kuncinya. Biasanya menggunakan RK Generator seperti RNG (Random Number Generator). Proses key generation pada Paillier kriptosistem adalah sebagai berikut :

  1. Memilih 2 bilangan prima p dan q secara random dan bebas disetiap bilangan prima tersebut.
  2. Hitung nilai n, dimana n =pq and λ = lcm(p − 1,q − 1)
  3. Memilih bilangan integer g secara random dimana g\in \mathbb Z^{*}_{n^{2}}
  4. Bilangan basis g yang dipilih secara acak dari elemen-elemen yang ordenya dapat dibagi dengan n dengan mengecek modular multiplicative inverse

\mu = (L(g^{\lambda} \mod n^{2}))^{-1} \mod n

Dimana fungsi L adalah sebagai berikut

L(u) = \frac{u-1}{n}

Keterangan :

Public key untuk enkripsi adalah (n,g)

Private key untuk dekripsi adalah (λ,μ).

Enkripsi

Adapun langkah-langkah dari algoritma enkripsi pada Paillier kriptosistem adalah sebagai berikut:

  1. Pesan m dienkripsi dimana m\in \mathbb Z_{n}
  2. Pilih r secara random r dimana r\in \mathbb Z^{*}_{n}
  3. Perhitungan ciphertext :  c=g^m \cdot r^n \mod n^2 .

Dekripsi

Adapun langkah-langkah dari algoritma enkripsi pada Paillier kriptosistem adalah sebagai berikut:

  1. Ciphertext(message yang telah terenkripsi) c\in \mathbb Z^{*}_{n^{2}}
  2. Compute message: m = L(c^{\lambda} \mod n^{2}) \cdot \mu \mod n

Berikut source code paillier kriptosistem di java :

import java.math.*;

import java.util.*;

/**

* Paillier Cryptosystem <br><br>

* References: <br>

* [1] Pascal Paillier, “Public-Key Cryptosystems Based on Composite Degree Residuosity Classes,” EUROCRYPT’99.

* URL: <a href=”http://www.gemplus.com/smart/rd/publications/pdf/Pai99pai.pdf”>http://www.gemplus.com/smart/rd/publications/pdf/Pai99pai.pdf</a><br&gt;

*

* [2] Paillier cryptosystem from Wikipedia.

* URL: <a href=”http://en.wikipedia.org/wiki/Paillier_cryptosystem”>http://en.wikipedia.org/wiki/Paillier_cryptosystem</a&gt;

* @author Kun Liu (kunliu1@cs.umbc.edu)

* @version 1.0

*/

public class Paillier {

/**

* p and q are two large primes.

* lambda = lcm(p-1, q-1) = (p-1)*(q-1)/gcd(p-1, q-1).

*/

private BigInteger p, q, lambda;

/**

* n = p*q, where p and q are two large primes.

*/

public BigInteger n;

/**

* nsquare = n*n

*/

public BigInteger nsquare;

/**

* a random integer in Z*_{n^2} where gcd (L(g^lambda mod n^2), n) = 1.

*/

private BigInteger g;

/**

* number of bits of modulus

*/

private int bitLength;

/**

* Constructs an instance of the Paillier cryptosystem.

* @param bitLength number of bits of modulus

* @param certainty The probability that the new BigInteger represents a prime number will exceed (1 – 2^(-certainty)). The execution time of this constructor is proportional to the value of this parameter.

*/

public Paillier(int bitLengthVal, int certainty){

KeyGeneration(bitLengthVal, certainty);

}

/**

* Constructs an instance of the Paillier cryptosystem with 512 bits of modulus and at least 1-2^(-64) certainty of primes generation.

*/

public Paillier(){

KeyGeneration(512, 64);

}

/**

* Sets up the public key and private key.

* @param bitLength number of bits of modulus.

* @param certainty The probability that the new BigInteger represents a prime number will exceed (1 – 2^(-certainty)). The execution time of this constructor is proportional to the value of this parameter.

*/

public void KeyGeneration(int bitLengthVal, int certainty ){

bitLength = bitLengthVal;

/*Constructs two randomly generated positive BigIntegers that are probably prime, with the specified bitLength and certainty.*/

p = new BigInteger(bitLength/2, certainty, new Random());

q = new BigInteger(bitLength/2, certainty, new Random());

n = p.multiply(q);

nsquare = n.multiply(n);

g = new BigInteger(“2”);

lambda = p.subtract(BigInteger.ONE).multiply(q.subtract(BigInteger.ONE)).divide(

p.subtract(BigInteger.ONE).gcd(q.subtract(BigInteger.ONE)));

/* check whether g is good.*/

if (g.modPow(lambda, nsquare).subtract(BigInteger.ONE).divide(n).gcd(n).intValue() != 1){

System.out.println(“g is not good. Choose g again.”);

System.exit(1);

}

}

/**

* Encrypts plaintext m. ciphertext c = g^m * r^n mod n^2. This function explicitly requires random input r to help with encryption.

* @param m plaintext as a BigInteger

* @param r random plaintext to help with encryption

* @return ciphertext as a BigInteger

*/

public BigInteger Encryption(BigInteger m, BigInteger r){

return g.modPow(m, nsquare).multiply(r.modPow(n, nsquare)).mod(nsquare);

}

/**

* Encrypts plaintext m. ciphertext c = g^m * r^n mod n^2. This function automatically generates random input r (to help with encryption).

* @param m plaintext as a BigInteger

* @return ciphertext as a BigInteger

*/

public BigInteger Encryption(BigInteger m){

BigInteger r = new BigInteger(bitLength, new Random());

return g.modPow(m, nsquare).multiply(r.modPow(n, nsquare)).mod(nsquare);

}

/**

* Decrypts ciphertext c. plaintext m = L(c^lambda mod n^2) * u mod n, where u = (L(g^lambda mod n^2))^(-1) mod n.

* @param c ciphertext as a BigInteger

* @return plaintext as a BigInteger

*/

public BigInteger Decryption(BigInteger c){

BigInteger u = g.modPow(lambda, nsquare).subtract(BigInteger.ONE).divide(n).modInverse(n);

return c.modPow(lambda, nsquare).subtract(BigInteger.ONE).divide(n).multiply(u).mod(n);

}

/**

* main function

* @param str intput string

*/

public static void main(String [] str){

/* instantiating an object of Paillier cryptosystem*/

Paillier paillier = new Paillier();

/* instantiating two plaintext msgs*/

BigInteger m1 = new BigInteger(“20”);

BigInteger m2 = new BigInteger(“60”);

/* encryption*/

BigInteger em1 = paillier.Encryption(m1);

BigInteger em2 = paillier.Encryption(m2);

/* printout encrypted text*/

System.out.println(em1);

System.out.println(em2);

/* printout decrypted text */

System.out.println(paillier.Decryption(em1).toString());

System.out.println(paillier.Decryption(em2).toString());

/* test homomorphic properties -> D(E(m1)*E(m2) mod n^2) = (m1 + m2) mod n */

BigInteger product_em1em2 = em1.multiply(em2).mod(paillier.nsquare);

BigInteger sum_m1m2 = m1.add(m2).mod(paillier.n);

System.out.println(“original sum: ” + sum_m1m2.toString());

System.out.println(“decrypted sum: “+ paillier.Decryption(product_em1em2).toString());

/* test homomorphic properties -> D(E(m1)^m2 mod n^2) = (m1*m2) mod n */

BigInteger expo_em1m2 = em1.modPow(m2, paillier.nsquare);

BigInteger prod_m1m2 = m1.multiply(m2).mod(paillier.n);

System.out.println(“original product: ” + prod_m1m2.toString());

System.out.println(“decrypted product: “+ paillier.Decryption(expo_em1m2).toString());

}

}

About helenaapriza

Always try to be a good Moslem Always try to be the best Always try to be my self Always try to be useful for every one Never stop to study View all posts by helenaapriza

One response to “Enkripsi dengan Paillier Kriptosistem

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: