Java-BigInteger奇怪的行为

Java-BigInteger奇怪的行为,java,rsa,biginteger,Java,Rsa,Biginteger,BigInteger发生了一些奇怪的事情。我正在尝试为分配实现自己的RSA。 代码如下所示,对于较小的数字非常有效。 如果我选择p=11、q=5、e=7和d=23,则终端上的输出为 Original message is: 19 Encryption of message is: 24 Decryption of message is: 19 但是,如果我用更大的数字来改变数字,它就不起作用了。以下代码: import java.math.BigInteger; class RSAdumb{

BigInteger发生了一些奇怪的事情。我正在尝试为分配实现自己的RSA。 代码如下所示,对于较小的数字非常有效。 如果我选择p=11、q=5、e=7和d=23,则终端上的输出为

Original message is: 19
Encryption of message is: 24
Decryption of message is: 19
但是,如果我用更大的数字来改变数字,它就不起作用了。以下代码:

import java.math.BigInteger;

class RSAdumb{

public static void main(String[] args) {
    BigInteger m = new BigInteger("19");

    BigInteger p = new BigInteger("99989");
    BigInteger q = new BigInteger("99991");
    BigInteger n = p.multiply(q);

    BigInteger e = new BigInteger("65537");
    BigInteger d = new BigInteger("4232182107");

    BigInteger c = m.modPow(e,n); //Returns a BigInteger whose value is (this^e mod n)
    BigInteger check = c.modPow(d,n);

    System.out.println("Original message is: "+m.toString());
    System.out.println("Encryption of message is: "+c.toString());
    System.out.println("Decryption of message is: "+check.toString());
    }
}
输出如下:

Original message is: 19
Encryption of message is: 5609974360
Decryption of message is: 2710593036
我已经两次检查过这些数字是否适合RSA。准确地说

e*d = 4232182107 * 65537 = 1 mod 9998000099
在哪里


现在,根据我的理解,BigInteger应该是无限的,所以它不应该是一个边界问题。。。比什么都好?在我的作业中,我总是可以用小的数字来实现这一点,但这很荒谬…

对于
e
d
的要求不是它们的乘积与1(mod n)一致,而是它们的乘积必须与1(modφ(n))一致,根据

这就是toticent函数,对于两个素数相乘,它是
(p-1)(q-1)
,或997800120

ed(modφ(n))的结果不是
1
,而是
32589339

小数值之所以有效,是因为5和11的φ(n)是4*10=40,而7*23(mod 40)是
1

您需要为较大的数字选择适当的
d
常量。这是
e
相对于
φ(n)
的模逆,可以用

这显示
d
2598113033
。使用
d
可以产生正确的输出

Original message is: 19
Encryption of message is: 5609974360
Decryption of message is: 19

计算私有指数d时出错

首先需要计算n的φ:
φ(n)=φ(p)φ(q)=(p− 1) (q)− 1) =n-(p+q-1)

然后你需要取e的模逆,φ作为模,得到d:

这将导致
d=2598113033


仅供参考:

谢谢,你说得很对,真是个愚蠢的错误!我想这个问题可以解决了!以这样的方式结束一个问题意味着该问题存在一些问题,这些问题将阻止该问题的回答或使用。相反,作为问题的提问者,你可能会认为你认为最有帮助。
BigInteger phi = p.subtract(BigInteger.ONE).multiply(q.subtract(BigInteger.ONE));
BigInteger d = e.modInverse(phi);
Original message is: 19
Encryption of message is: 5609974360
Decryption of message is: 19
BigInteger phi = n.subtract(p.add(q).subtract(BigInteger.ONE));
d = e.modInverse(phi);