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

标签 java security encryption cryptography privacy

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

论文说:

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

...这个方程:

enter image description here

但是,我不知道如何计算第三部分。我用过Kun Lui's Paillier implementation在 Java 中,还遵循以下 power 方法:

    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)));

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

最佳答案

您的函数不适用于负指数。你不断地减去一个负数,所以你永远不会达到零。使用以下公式进行计算。

negative exponents

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

关于java - 用于安全计算欧几里德距离平方的 Paillier 密码系统和协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34549822/

相关文章:

java - 使用 Camel 通过 http 发送普通 SOAP

javascript - 开发小书签时需要考虑哪些设计和安全注意事项?

java - 请推荐一种在 Java 中通过 HTTP 授权纯文本事务的方法?

java - 基于身份的加密和开源

java - 如何循环回到字符串的开头? super 技能,加密-解密

java - 如何将数组列表的元素添加到一起

java - 在 Java 中通过 XML 标签分割字符串

java - 为什么我们在 Struts 2 中使用PrincipalAware

mysql - AES_DECRYPT 你如何检查值是否已经在 mysql 中解密

java - Springboot -> Springboot 2 : 2 Spring WebApplicationInitializers detected on classpath