java模数学对于rsa加密程序不正确

时间:2014-05-16 22:38:27

标签: java encryption rsa

我正在制作一个程序来进行简单的RSA加密和解密,无论如何,当我输入等式时:

for (int index = 0; index < message.length(); index++)
{
  decryptnum[index] =(Math.pow((encryptnum[index]),secondkey))% 55; //to the decrypt array
  System.out.print(decryptnum[index] + " ");
  idecryptnum[index] = (int)(decryptnum[index]);
} //changed to int

结果出错了。例如。加密数是23到23次幂然后是mod 55.结果是23.它应该是12 ...我认为它可能是字节的问题。它已经是一个双重的,所以我不知道还能做什么。

2 个答案:

答案 0 :(得分:2)

问题是使用Math.pow使用double,并且精度不够高。

BigInteger bi = new BigInteger("23").pow(23);
System.out.println("[BI] 23^23 = " + bi);
System.out.println("[BI] 23^23 mod 55 = " + bi.mod(new BigInteger("55")));

DecimalFormat df = new DecimalFormat("#");
System.out.println("[d] 23^23 = " + df.format(Math.pow(23, 23)));
System.out.println("[d] 23^23 mod 55 = " + df.format(Math.pow(23, 23) % 55));

打印

[BI] 23^23 = 20880467999847912034355032910567
[BI] 23^23 mod 55 = 12
[d] 23^23 = 20880467999847910000000000000000
[d] 23^23 mod 55 = 23

这解释了错误的结果。 BigInteger具有此计算所需的精度。

虽然您可以使用其他数学技巧来避免直接计算23 ^ 23(mod 55),但这些数字仍然足够低,您可以使用BigInteger来精确计算它。

答案 1 :(得分:0)

看到你的模数不是很大,这个函数对于执行模幂运算非常方便:

public long modPow(long base, long exponent, long mod) {
    long c = 1;
    for(int i = 0; i < exponent; i++) {
        c = (c * base) % mod;
    }

    return c;
}

它也比BigInteger快,因为它不需要操纵大值。 如果需要信息来源,那么在这里: http://en.wikipedia.org/wiki/Modular_exponentiation