我正在制作一个程序来进行简单的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 ...我认为它可能是字节的问题。它已经是一个双重的,所以我不知道还能做什么。
答案 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