我正在尝试将Python文件移植到Java,但是我遇到了一些麻烦(可能是因为我对Python的了解有限)。 python文件是实现社会主义百万富翁问题的一个例子。我在处理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()在调用时产生负数而引起的。有没有人有计算两个BigIntegers的指数的解决方案?
Python源代码:http://shanetully.com/2013/08/mitm-protection-via-the-socialist-millionaire-protocol-otr-style/
答案 0 :(得分:5)
使用高功率然后执行mod非常慢。出于这个原因,BigInteger提供了modPow(BigInteger, BigInteger)方法,看起来可以做你想要的。
答案 1 :(得分:4)
您使用错误的方法来计算功率,然后使用其模型。 pow
方法不接受负指数,并且因为您似乎也希望修改它,有一个完美的方法:modPow
。这是一个取幂,然后是一个mod操作,它接受负指数。
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 };
}