package com.rau.evoting.ElGamal;
import java.math.BigInteger;
import java.nio.charset.Charset;
import java.util.List;
import org.bouncycastle.crypto.params.ElGamalParameters;
import org.bouncycastle.crypto.params.ElGamalPrivateKeyParameters;
import org.bouncycastle.crypto.params.ElGamalPublicKeyParameters;
import com.rau.evoting.utils.RandomHelper;
public class ElGamalHelper {
private static ElGamalParameters params = GlobalParameters.getParams();;
private ElGamalPrivateKeyParameters prKeyParams;
private ElGamalPublicKeyParameters pubKeyParams;
private BigInteger r = null;
private Charset charset = Charset.forName("ISO-8859-1");//Charset.forName("UTF-8");//Charset.forName("ISO-8859-1");
public ElGamalHelper() {
prKeyParams = new ElGamalPrivateKeyParameters(
RandomHelper.randomNonZeroBigInteger(params.getP().subtract(
new BigInteger("1"))), params);
pubKeyParams = new ElGamalPublicKeyParameters(params.getG().modPow(
prKeyParams.getX(), params.getP()), params);
//System.out.println("public:" + pubKeyParams.getY());
//System.out.println("public:" + pubKeyParams.getY().toString());
//System.out.println("private:" + prKeyParams.getX());
}
public ElGamalHelper(String pubKey) {
pubKeyParams = new ElGamalPublicKeyParameters(new BigInteger(pubKey),
params);
//System.out.println("public:" + pubKeyParams.getY());
//System.out.println("public:" + pubKeyParams.getY().toString());
//System.out.println("private:" + prKeyParams.getX());
}
public ElGamalHelper(String pubKey, String prKey) {
prKeyParams = new ElGamalPrivateKeyParameters(new BigInteger(prKey),
params);
pubKeyParams = new ElGamalPublicKeyParameters(new BigInteger(pubKey),
params);
//System.out.println("public:" + pubKeyParams.getY());
//System.out.println("public:" + pubKeyParams.getY().toString());
//System.out.println("private:" + prKeyParams.getX());
}
public String encode(String text) {
EncryptEngine eng = new EncryptEngine();
eng.initForEncrypt(pubKeyParams);
byte[] in = text.getBytes(charset);
byte[] b = eng.encode(in, 0, in.length);
r = eng.getR();
String encoded = new String(b, charset);
return encoded;
}
public String encodeBigInt(String text) {
EncryptEngine eng = new EncryptEngine();
eng.initForEncrypt(pubKeyParams);
byte[] in = text.getBytes(charset);
byte[] b = eng.encode(in, 0, in.length);
r = eng.getR();
String encoded = (new BigInteger(b)).toString();
return encoded;
}
public String reEncodeBigInt(String text) {
EncryptEngine eng = new EncryptEngine();
eng.initForEncrypt(pubKeyParams);
byte[] in = new BigInteger(text).toByteArray(); //text.getBytes(charset);
byte[] b = eng.reEncode(in, 0, in.length);
r = eng.getR();
String encoded = (new BigInteger(b)).toString();
return encoded;
}
public String decode(String codedText) {
DecryptEngine eng = new DecryptEngine();
byte[] in = codedText.getBytes(charset);
eng.initForDecrypt(prKeyParams);
byte[] b = eng.decode(in, 0, in.length);
String decoded = new String(b, charset);
return decoded;
}
public String decodeBigInt(String codedText) {
DecryptEngine eng = new DecryptEngine();
BigInteger bg = new BigInteger(codedText);
byte[] in = bg.toByteArray();
eng.initForDecrypt(prKeyParams);
byte[] b = eng.decode(in, 0, in.length);
String decoded = new String(b, charset);
return decoded;
}
public static String getElectionPublicKey(List<String> publicKeys) {
String key = "";
BigInteger res = new BigInteger("1");
for (String k : publicKeys) {
res = res.multiply(new BigInteger(k));
res = res.mod(params.getP());
}
key = res.toString();
return key;
}
public int getPrivateKeyHash() {
return prKeyParams.getX().hashCode();
}
public String getPrivateKey() {
return prKeyParams.getX().toString();
}
public int getPublicKeyHash() {
return pubKeyParams.getY().hashCode();
}
public String getPublicKey() {
return pubKeyParams.getY().toString();
}
public ElGamalPublicKeyParameters getPubKeyParams() {
return pubKeyParams;
}
public ElGamalPrivateKeyParameters getPrKeyParams() {
return prKeyParams;
}
public BigInteger getR() {
return r;
}
}