繁体   English   中英

Java 中的模幂运算

[英]Modular Exponentiation in Java

我需要一种方法来计算:

(g^u * y^v) mod p

在 Java。

我发现了这个用于计算 (g^u) mod p 的算法:

int modulo(int a,int b,int c) {
    long x=1
    long y=a;
    while(b > 0){
        if(b%2 == 1){
            x=(x*y)%c;
        }
        y = (y*y)%c; // squaring the base
        b /= 2;
    }
    return (int) x%c;
}

它工作得很好,但我似乎无法找到一种方法来做到这一点

(g^u * y^v) mod p

因为我的数学技能乏善可陈。

把它放在上下文中,它是用于“简化”DSA 的 java 实现 - 验证部分需要解决这个问题。

假设这两个因素不会溢出,我相信你可以用这种方式简化表达式:

(x * y) mod p = ( (x mod p)*(y mod p) ) mod p 我相信你可以从那里弄明白。

该代码片段实现了众所周知的“快速取幂”算法,也称为平方

它还使用(a * b)mod p =((a mod p)*(b mod p))mod p的事实。 (加法和乘法都是采用素数模的保留结构 - 它是同态)。 这种方式在算法的每个点上都减少到小于p的数字。

虽然您可以尝试在循环中以交错方式计算这些,但这样做并没有什么好处。 只需单独计算它们,将它们相乘,最后一次取mod。

请注意,如果p ^ 2大于最大可表示的int,您将会溢出,这将导致您得到错误的答案。 对于Java,切换到大整数可能是谨慎的,或者至少对p的大小进行运行时检查并抛出异常。

最后,如果这是出于加密目的,您可能应该使用库来执行此操作,而不是自己实现它。 做一些看起来有效的错误很容易,但提供的安全性很小甚至没有。

尝试

(Math.pow(q,u)* Math.pow(y,v))%p

下面是一些示例代码,它在原始问题中输入变量,并遵循 Christian Mann 的回答。 BigInteger 解决了溢出问题。 返回语句是一个 BigInteger。

    public static BigInteger ModularExponent(BigInteger G, BigInteger U, BigInteger Y, BigInteger V, BigInteger P) {
      
      return ((G.modPow(U,P)).multiply(Y.modPow(V,P))).mod(P);
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM