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

论文说:

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

...对于这个等式:

java - Paillier密码系统和用于安全计算欧氏距离平方的协议(protocol)-LMLPHP

但是,我不知道如何计算第三部分。我在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)));


如果您帮助我解决了这个问题,我将不胜感激。先感谢您。

最佳答案

您的power函数不适用于负指数。您不断减去负数,因此您永远不会达到零。使用以下公式进行计算。

java - Paillier密码系统和用于安全计算欧氏距离平方的协议(protocol)-LMLPHP

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

09-10 09:22
查看更多