2

我正在尝试将 Python 文件移植到 Java,但遇到了一些麻烦(可能是由于我对 Python 的了解有限)。python 文件是实现社会主义百万富翁问题的一个示例。我对 Java 如何处理 BitInteger 操作有一些问题。

Python:

def step1(self):
    self.x2 = createRandomExponent()
    self.x3 = createRandomExponent()

    self.g2 = pow(self.gen, self.x2, self.mod)
    self.g3 = pow(self.gen, self.x3, self.mod)

    (c1, d1) = self.createLogProof('1', self.x2)
    (c2, d2) = self.createLogProof('2', self.x3)

    # Send g2a, g3a, c1, d1, c2, d2
    return packList(self.g2, self.g3, c1, d1, c2, d2)

爪哇:

public BigInteger[] step1() {
    x2 = getRandomExponent();
    x3 = getRandomExponent();

    g2 = new BigInteger(gen + "").pow(x2.intValue()).pow(mod.intValue());
    g3 = new BigInteger(gen + "").pow(x3.intValue()).pow(mod.intValue());

    BigInteger[] logProof1 = createLogProof("1", g2);
    BigInteger[] logProof2 = createLogProof("2", g3);

    BigInteger c1 = logProof1[0];
    BigInteger d1 = logProof1[1];
    BigInteger c2 = logProof2[0];
    BigInteger d2 = logProof2[1];

    return new BigInteger[] { g2, g3, c1, d1, c2, d2 };
}

我收到以下错误(第 24 行是计算 g2 的位置):

Exception in thread "main" java.lang.ArithmeticException: Negative exponent
    at java.math.BigInteger.pow(BigInteger.java:1395)
    at n/a.crypto.SMPCheck.step1(SMPCheck.java:42)
    at n/a.Testing.main(Testing.java:24)

这是由于 BigInteger.intValue() 在调用时产生了一个负数。有人有计算两个 BigInteger 指数的解决方案吗?

Python 来源:http ://shanetully.com/2013/08/mitm-protection-via-the-socialist-millionaire-protocol-otr-style/

4

2 回答 2

5

使用高功率然后执行 mod 非常慢。出于这个原因,BigInteger 提供了一个modPow(BigInteger, BigInteger)方法,该方法似乎可以满足您的需求。

于 2013-11-03T22:10:25.840 回答
4

您使用错误的方法来计算功率,然后是它的模型。该pow方法不接受负指数,而且您似乎也想修改它,有一个完美的方法适合您:modPow. 这会进行幂运算,然后是模运算,并且它接受负指数。

public BigInteger[] step1() {
    x2 = getRandomExponent();
    x3 = getRandomExponent();

    g2 = new BigInteger(gen + "").modPow(x2, mod);
    g3 = new BigInteger(gen + "").modPow(x3, mod);

    BigInteger[] logProof1 = createLogProof("1", g2);
    BigInteger[] logProof2 = createLogProof("2", g3);

    BigInteger c1 = logProof1[0];
    BigInteger d1 = logProof1[1];
    BigInteger c2 = logProof2[0];
    BigInteger d2 = logProof2[1];

    return new BigInteger[] { g2, g3, c1, d1, c2, d2 };
}
于 2013-11-03T22:11:07.757 回答