计算机如何轻松生成加密密钥?

时间:2016-08-13 11:53:05

标签: java encryption rsa key-generator

我想知道计算机如何轻松快速地生成密钥,特别是RSA。我一直在尝试使用Java生成24小时密钥2小时。

我的程序使用随机函数生成p和q,如果它们不是素数,程序会生成新的随机数。最后,程序计算e和d。如您所见,我的程序使用标准RSA算法,但需要花费很多时间。

我认为问题可能在于我的算法,但是不仅RSA密钥,即使我使用线程,也会产生100位素数需要几个小时。那么,使用谷歌这样的HTTPS的网站如何才能在几毫秒内生成这些数字呢?

在Java中有一个名为大整数的类,它有生成可能随机素数的方法。但是,如果它可能是素数,则某些包无法解密。 不仅是HTTPS,还有一些网站可以生成1024-4096位密钥,而我正在努力计算24位密钥。

请解释它是如何运作的。

编辑: 这是我的代码:

private BigInteger minusOne=new BigInteger("-1");
private BigInteger one=new BigInteger("1");
private BigInteger two=new BigInteger("2");
private BigInteger zero=new BigInteger("0");

private void generateKeys(int keySize){
    Random r=new Random();
    q=BigInteger.probablePrime(keySize,r);
    p=BigInteger.probablePrime(keySize, r);
    n=p.multiply(q);
    phi=(p.add(minusOne)).multiply(q.add(minusOne));
    if(p.equals(q)){
        generateKeys(keySize);
        return;
    }
    e=calculate_e();
    d=calculate_d();
    if(d.equals(minusOne)){
        generateKeys(keySize);
        return;
    }
}
private BigInteger calculate_e(){

    Random r=new Random();
    BigInteger e;
    do{
        e=new BigInteger(FindBitSize(phi),r);
    }while(!BetweenPrime(e,phi));
    if(e.compareTo(phi)==-1 && e.compareTo(one)==1){
        return e;

    }else{

        return calculate_e();
    }

}
private BigInteger calculate_d(){
    BigInteger k=new BigInteger("0");
    while(true){
        if(k.multiply(e).mod(phi).equals(one)){
            return k;
        }
        k=k.add(one);
    }
}
private boolean BetweenPrime(BigInteger b2,BigInteger b1){
    BigInteger d=new BigInteger("1");
    while(d.compareTo(b1)==-1 && d.compareTo(b2)==-1){
        d=d.add(one);
        if(b1.mod(d).equals(zero) && b2.mod(d).equals(zero)){
            return false;
        }

    }
    return true;
}

但是我的问题与代码无关。我只是不明白计算机如何在很短的时间内计算过大的素数。

0 个答案:

没有答案