Skip to content
Snippets Groups Projects
d_he.java 2.12 KiB
Newer Older
Anders Skov's avatar
Anders Skov committed
import java.math.BigInteger;
import java.util.*;

public class d_he {
    private static Random rand = new Random();

    public static Pk_Sk KeyGen(){
Anders Skov's avatar
Anders Skov committed
        var p = new BigInteger(2000, rand);
Anders Skov's avatar
Anders Skov committed
        if(!isOdd(p)){
            p = p.add(BigInteger.ONE);
        }
Anders Skov's avatar
Anders Skov committed

Anders Skov's avatar
Anders Skov committed
        List<BigInteger> pk_list = new ArrayList<>();

Anders Skov's avatar
Anders Skov committed
        for (int i = 0; i < 2000; i++) {
Victor Kjelde's avatar
Victor Kjelde committed
            var qi = new BigInteger(10000000, rand);
Anders Skov's avatar
Anders Skov committed
            var ri = new BigInteger(60, rand);
            var twoR = ri.multiply(BigInteger.TWO);
            var yi = (p.multiply(qi)).add(twoR);
            pk_list.add(yi);
        }

        return new Pk_Sk(p, pk_list);
    }

    public static boolean isOdd(BigInteger val) {
        if(!(val.mod(BigInteger.TWO)).equals(BigInteger.ZERO))
            return true;
        return false;
    }

    public static BigInteger Encryption(BigInteger m, List<BigInteger> pk_list){
        List<BigInteger> pk_list_copy = new ArrayList<>(pk_list);
Anders Skov's avatar
Anders Skov committed
        var num_of_elements = rand.nextInt(2000);
Anders Skov's avatar
Anders Skov committed
        Collections.shuffle(pk_list_copy);
        List<BigInteger> S = pk_list_copy.subList(0, num_of_elements);

        var sum = BigInteger.ZERO;
        for (int i = 0; i < S.size(); i++) {
            sum = sum.add(S.get(i));
        }

        return m.add(sum);
    }

    public static BigInteger Decryption(BigInteger c, BigInteger sk){
        return (c.mod(sk)).mod(BigInteger.TWO);
    }

    public static BigInteger Eval(BigInteger c1, BigInteger c2, BigInteger sk, List<BigInteger> pk_list, String gate){
        var lh = Decryption(c1, sk);
        var rh = Decryption(c2, sk);
        BigInteger temp = BigInteger.ZERO;
        BigInteger c3 = BigInteger.ZERO;

        if (gate.equals("xor")){
            temp = (lh.add(rh));
            if(temp.compareTo(BigInteger.TWO) == 0){
                temp = BigInteger.ZERO;
            }
        } else if(gate.equals("and")){
            temp = (lh.multiply(rh));
        }

        if(temp.compareTo(BigInteger.ZERO) == 0){
            c3 = Encryption(BigInteger.ONE, pk_list);
        } else {
            c3 = Encryption(BigInteger.ZERO, pk_list);
        }

        return c3;
    }
}