どのようにしてコンピュータがキー、特にRSAを簡単かつ迅速に生成できるのだろうか。私は、Javaを使用して2時間24ビットキーを生成しようとしていました。コンピュータはどのようにして暗号化キーを簡単に生成できますか?
私のプログラムは、random関数を使ってpとqを生成していますが、それらが素数でない場合、プログラムは新しい乱数を生成します。最後に、プログラムはeとdを計算します。ご覧のとおり、私のプログラムは標準のRSAアルゴリズムを使用していますが、時間がかかります。
問題は私のアルゴリズムにあると思っていましたが、スレッドを使用しても、100ビットの素数を生成するRSAキーだけでなく数時間もかかります。では、googleなどのHTTPSを使用するサイトでは、これらの数値をほぼ1ミリ秒単位で生成することができますか?
Javaにはbig integerという名前のクラスがあり、おそらくランダムプライムを生成するメソッドがあります。しかし、おそらく素数であれば、いくつかのパッケージを解読することはできません。 HTTPSだけでなく、24ビットキーの計算に苦労している間に、一部のWebサイトで1024-4096ビットのキーを生成することもできます。
どのように動作するか説明してください。
編集:ここに は私のコードです:
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;
}
私の問題は、コードではないですが。私はちょうどコンピュータが非常に短時間で大きすぎる素数を計算する方法を理解していません。
TLSの切断は、彼らがによってそれらに属すると確認された静的なRSAキーを使用して、その場で新しいRSA鍵を生成しません。信頼できる第三者であり、証明書にそのように保証されています。しかし、私のコンピュータ上の 'openssl genrsa 2048'は0.2秒で、4096は1.06秒です。 4096は辛抱強く遅いです:)。 – bartonjs