java - Java 类型转换的奇怪输出

标签 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 方法调用它们。

最佳答案

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;
}

关于java - Java 类型转换的奇怪输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13795206/

相关文章:

c# - 如何为 AES 生成持久 key

c# - 如何在 C# 中使用模数、D、指数创建私有(private) RSA key ?

python - 使用python-rsa加密消息时出现溢出异常

security - 带有 RSA 公钥和私钥的 JWT

java - JUnit 插件测试忽略 Eclipse Neon 中的目标平台

java - 如何在特定文件的基础上禁用 Eclipse 中的编译器警告?

Java 8 接口(interface)与抽象类

java - AES 算法 Java/Java Script 中的 128 位 key 问题

java - JButton 的 doClick() 方法

php - 如何加密数据以便用LIKE执行SQL查询?