Paillier密码系统和安全地计算欧氏距离平方的协议

时间:2015-12-31 17:42:32

标签: java security encryption cryptography privacy

我正在尝试实施this paper中提出的协议(第3.2节)。我最近开始研究同态加密和Paillier。因此,我的问题可能过于简单,但我无法以任何方式解决问题。

报纸说:

"然后Paillier密码系统满足所有要求 计算欧几里德距离的加密平方。 因此,等式(3)可以分解为......"

...对这个等式:

enter image description here

然而,我无法弄清楚如何计算第三部分。我在Java中使用了Kun Lui's Paillier implementation,并且还使用了幂方法:

    public static BigInteger power(BigInteger m, BigInteger i) {
            BigInteger result = m;
            while(i.compareTo(BigInteger.ONE) != 0){
                    result = result.multiply(m);
                    i = i.subtract(BigInteger.ONE);
            }
            return result;
    }

不幸的是,第三部分无法成功计算:

// Part I
BigInteger esumsqr_p = paillier.Encryption(p1.multiply(p1).add(p2.multiply(p2)));

// Part II
BigInteger esumsqr_q = paillier.Encryption(q1.multiply(q1).add(q2.multiply(q2)));

// Part III
BigInteger esum_pq = power(eq1, new BigInteger("-2").multiply(p1)).multiply(power(eq2, new BigInteger("-2").multiply(p2)));

如果你帮我解决这个问题,我将不胜感激。提前谢谢。

2 个答案:

答案 0 :(得分:2)

您的power功能对负指数不起作用。你保持一个负数字,所以你永远不会达到零。使用以下公式计算它。

negative exponents

因此,对于负数,您应该返回BigInteger.ONE.divide(power(m,i));

答案 1 :(得分:0)

我测试了算法。如您所见,每一方都安全地计算结果。我认为一些子方法将以更成功的方式显示协议。方法如下:

public BigInteger secureEuDistanceMD(int[] p, int[] q){

    // Server (Owner of q) - PART 1
    BigInteger[] enc_Q = new BigInteger[q.length];
    BigInteger sumsqrQ = BigInteger.ZERO;
    BigInteger enc_sumsqrQ; 
    for (int i = 0; i < q.length; i++) {
        BigInteger bigQ = new BigInteger("" + q[i]);
        enc_Q[i] = paillier.Encryption(bigQ);
        sumsqrQ = sumsqrQ.add(bigQ.multiply(bigQ));
    }

    enc_sumsqrQ = paillier.Encryption(sumsqrQ);

    // Client (Owner of p) - PART 2
    BigInteger sumsqrP = BigInteger.ZERO;
    BigInteger enc_sumsqrP; 
    BigInteger enc_sumPQ = BigInteger.ONE;
    for (int i = 0; i < p.length; i++) {
        BigInteger bigP = new BigInteger("" + p[i]);
        sumsqrP = sumsqrP.add(bigP.multiply(bigP));

        enc_sumPQ = enc_sumPQ.multiply(enc_Q[i].modPow(new BigInteger("-2").multiply(bigP), paillier.nsquare));
    }

    enc_sumsqrP = paillier.Encryption(sumsqrP);
    BigInteger enc_euDist = enc_sumsqrP.multiply(enc_sumsqrQ).multiply(enc_sumPQ);

    // Server - PART 3 (Decryption)
    return paillier.Decryption(enc_euDist);
}