有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java类型转换的加密输出

我正在玩使用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似乎是个问题,但我不确定这是为什么。 这些方法是静态的,只是因为我从主方法调用它们


共 (2) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

    2147483647是整数最大值,也就是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;
    }