来自Java类型转换的奇怪输出

时间:2012-12-10 04:54:49

标签: java encryption rsa

我正在使用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似乎是问题,但我不知道为什么会这样。 这些方法只是静态的,因为我是从main方法调用它们的。

2 个答案:

答案 0 :(得分:6)

2147483647是int max值,又名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;
}

答案 1 :(得分:1)

2147483647是最大的有符号32位整数。我的猜测是你的第37和289次幂的测试值大于可以存储在int中的值。尝试使用很长时间,看看会发生什么。