BigIntegers,gcd,模数反向查找公钥

时间:2013-04-10 01:24:29

标签: java rsa biginteger modulus greatest-common-divisor

所以,我使用java来查找RSA密码的公钥。现在我不确定我在做什么,如果它是正确的。

我有公钥的这些信息。

C = 5449089907 
n = p*q = 8271344041 
q = 181123
p = n/q = 45667
d = 53
phi(n) = (p-1)(q-1) = 8271117252

BigIntegers使得事情变得复杂,数字对于int和long来说是巨大的,所以我必须使用笨拙的BigIntegers。据我所知,我有以下等式来解决。

e*5198987987 - x*8271117252 = 1

我正在尝试使用euklidske算法来解决它。在Java中,我认为我可以使用以下方法:

我将代码基于phi(n)= 8271117252和d = 53.然后我在for循环中使用gcd,尝试从for循环中的i数字到phi(n)上的gdc。如果结果为1,则将e设置为i的迭代次数。然后我在e和phi(n)上使用模数反函数。如果,并且只有当这等于phi(n)时,我得到了答案。 (我认为,它可能是错误的。)

无论如何,这是代码。通常任何输入都会很棒,因为它让我有点疯狂。

import java.math.BigInteger;
public class RSADecrypt {

    BigInteger p = new BigInteger("53"); // Input privatekey.
    BigInteger r = new BigInteger("8271344041");
    BigInteger variabel_i;
    BigInteger modinv;
    BigInteger e;

    public RSADecrypt () {

        for (BigInteger bi = BigInteger.valueOf(1000000000);
                bi.compareTo(BigInteger.ZERO) > 0;
                bi = bi.subtract(BigInteger.ONE)) {

            if(gcdThing(bi).equals(BigInteger.ONE))
                e = bi;

                  if(modinv(e) == p) {
                    System.out.println(" I er "+ bi);
            } 
        }

        System.out.println("Ikke noe svar for deg!");       
    }


    // Gcd funksjon.
    public BigInteger gcdThing(BigInteger i) {
        BigInteger b2 = new BigInteger(""+i);
        BigInteger gcd = r.gcd(b2);
        return gcd;
    }

    // Modinverse
    public BigInteger modinv (BigInteger e2) {
        variabel_i = new BigInteger(""+e2);
        modinv = r.modInverse(variabel_i);
        return modinv;
    }

}

0 个答案:

没有答案