1

我正在使用 RSA 算法进行简单的加密,发现了一个奇怪的错误。

private static Integer testEnc(Integer value){
    Integer val = (int)Math.pow(value, 37);
    return val % 437; 
}

private static Integer testDec(Integer value){
    Integer val = new Integer((int)Math.pow(value, 289));
    return val % 437;
}

public static void main(String[] args) {
    System.out.print("Encode 55  = ");
    Integer encoded = testEnc(2);
    System.out.println(encoded + "\n");

    System.out.print(encoded + " decoded = ");
    Integer decoded = testDec(3977645);
    System.out.println(decoded + "n");
}

无论输入如何,以下两个函数都返回 97。如果我注释掉模数并只返回 val,则返回值为 2147483647。

将 double 类型转换为 int 似乎是问题所在,但我不确定为什么会这样。这些方法是静态的,只是因为我是从主方法调用它们的。

4

2 回答 2

6

2147483647 是 int 最大值,即 2^31-1。对于任何值 >=2,你会得到一个溢出,因为 2^37 > 2^31-1

为了获得功率模 437,您应该在每一步都获得模数。例如:

private static int myPow(int a, int b, int mod){
    int ret = 1;
    for(int i = 0; i < b; i++)
    {
        ret = (ret * a) % mod;
    }
    return ret;
}
于 2012-12-10T04:59:39.567 回答
1

2147483647 是最大的有符号 32 位整数。我的猜测是您的 37 次方和 289 次方的测试值大于可以存储在 int 中的值。尝试使用 long 看看会发生什么。

于 2012-12-10T04:59:34.117 回答