Java pow BigInteger实现

Java pow BigInteger实现,java,cryptography,biginteger,pow,exponent,Java,Cryptography,Biginteger,Pow,Exponent,我正在进行加密实现,部分设计包括以下内容: ((y^a)^b/(y^c)^b)模块p 我有以下片段: BigInteger yab = y.pow(ab.intValue()); BigInteger ycb = y.pow(cb.intValue()); BigInteger ans = (yab.divide(ycb)).mod(p); 它适用于小整数。一旦我用生成的键替换它,指数就变得如此巨大,我会遇到“BigInteger超出int范围”错误。我尝试过modPow函数,但结果不同 我

我正在进行加密实现,部分设计包括以下内容:

((y^a)^b/(y^c)^b)模块p

我有以下片段:

BigInteger yab = y.pow(ab.intValue());
BigInteger ycb = y.pow(cb.intValue());

BigInteger ans = (yab.divide(ycb)).mod(p);
它适用于小整数。一旦我用生成的键替换它,指数就变得如此巨大,我会遇到“BigInteger超出int范围”错误。我尝试过modPow函数,但结果不同


我理解将其转换为int有其局限性。这是否意味着我的实现是不可行的?

您可以简化代码,这也会使它更快

x^y / x^z = x^(y - z)
所以

可以简化为

BigInteger yabc = y.pow((int) (ab.longValue() - cb.longValue()));
BigInteger ans = yabc.mod(p);


您可以简化代码,这也将使其更快

x^y / x^z = x^(y - z)
所以

可以简化为

BigInteger yabc = y.pow((int) (ab.longValue() - cb.longValue()));
BigInteger ans = yabc.mod(p);


看起来你们在做模运算,其中n是素数(在你们的例子中是n=p)。这意味着

x / y
不是除法,而是x与y-1的乘积(y的模逆)

好消息是类提供了这样一种方法:

BigInteger ans = yab.multiply(ycb.modInverse(p)).mod(p);
其中,
yab
ycb
可以有效地计算,而不会产生溢出(假设
ab
a
b
的乘积):


看起来你们在做模运算,其中n是素数(在你们的例子中是n=p)。这意味着

x / y
不是除法,而是x与y-1的乘积(y的模逆)

好消息是类提供了这样一种方法:

BigInteger ans = yab.multiply(ycb.modInverse(p)).mod(p);
其中,
yab
ycb
可以有效地计算,而不会产生溢出(假设
ab
a
b
的乘积):


看看你的另一个问题,你真的应该读一下模逆是什么……嗨@Mysticial,我的实现的某些部分确实使用了modInverse。但我不确定它如何适用于这种情况。你能提供建议吗?@kenAu89你肯定选错了答案:虽然peter lawrey给了你想要的,但这并不是你真正需要计算的,因为没有一个头脑清醒的密码学家会设计出一个公式来允许任何形式的减少,特别是即使是一个小学生也可以锻炼。你应该听从上面神秘的建议,接受下面artjom-b的解决方案。@AntonSamsonov您好,先生。谢谢你的建议。关于在我的实现中使用模逆,现在一切似乎都更清楚了。看看你的另一个问题,你真的应该读一下模逆是什么……嗨@神秘,我的实现的某些部分确实使用了模逆。但我不确定它如何适用于这种情况。你能提供建议吗?@kenAu89你肯定选错了答案:虽然peter lawrey给了你想要的,但这并不是你真正需要计算的,因为没有一个头脑清醒的密码学家会设计出一个公式来允许任何形式的减少,特别是即使是一个小学生也可以锻炼。你应该听从上面神秘的建议,接受下面artjom-b的解决方案。@AntonSamsonov您好,先生。谢谢你的建议。关于在我的实现中使用模逆,现在一切似乎都清楚了。您好,先生,您的解决方案有效!由于我可以使用modpow函数,它不再局限于转换为int。非常感谢!谢谢你的建议!另外,modPow将正确处理负指数。您好,先生,您的解决方案有效!由于我可以使用modpow函数,它不再局限于转换为int。非常感谢!谢谢你的建议!此外,modPow将正确处理负指数。