Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
来自Java类型转换的奇怪输出_Java_Encryption_Rsa - Fatal编程技术网

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

来自Java类型转换的奇怪输出,java,encryption,rsa,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));

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

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

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

2147483647是int的最大值,也就是2^31-1。 对于任何大于等于2的值,都会得到一个溢出M,因为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;
}

2147483647是整数最大值,也称为2^31-1。 对于任何大于等于2的值,都会得到一个溢出M,因为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;
}

你怎么称呼他们?此外,您可能会将整数/int的范围扩大到289次方。我强烈建议使用BigInteger,它不需要转换为double,也不适用于加密目的。java中的int是有符号的32位int。。。除非你的输入是1。。。你刚刚超越了这一点;添加了调用该方法的主方法您可能希望使用更大的整数try Long或BigInteger类。您如何调用它们?此外,您可能会将整数/int的范围扩大到289次方。我强烈建议使用BigInteger,它不需要转换为double,也不适用于加密目的。java中的int是有符号的32位int。。。除非你的输入是1。。。你刚刚超越了这一点;添加了调用该方法的主方法。您可能希望使用更大的整数try Long或BigInteger类。