2016-11-23 7 views
1

그래서 그들은이 더 많거나 일의 대기업에게 덜 나는에 발견이다아무런 반응이 없습니다 [BigInteger를]

import java.util.*; 
import java.math.*; 

public class GeneratePrime{ 

    public static BigInteger calculatePPrime() { 
    BigInteger pRandom; 
    while (true) { 
     pRandom = new BigInteger(512, new Random()); 
     pRandom = pRandom.setBit(0); 
     if(isPrime(pRandom)){ 
     System.out.println("Got Random Prime P: "+pRandom); 
     break; 
     } 
    } 
    return pRandom; 
    } 

    public static BigInteger calculateQPrime() { 
    BigInteger qRandom; 
    while(true){ 
     qRandom = new BigInteger(512, new Random()); 
     if(isPrime(qRandom)){ 
     System.out.println("Got Random Prime Q: "+qRandom); 
     break; 
     } 
    } 
    return qRandom; 
    } 

    public static boolean isPrime(BigInteger number) { 
    if (!number.isProbablePrime(5)) 
     return false; 

    BigInteger two = new BigInteger("2"); 
    if (!two.equals(number) && BigInteger.ZERO.equals(number.mod(two))) 
     return false; 

    for (BigInteger i = new BigInteger("3"); i.multiply(i).compareTo(number) < 1; i = i.add(two)) { 
     if (BigInteger.ZERO.equals(number.mod(i))) 
      return false; 
    } 
    return true; 
    } 
} 

소수 인 경우 두 개의 소수를 계산하고 클래스가 확인해야 인터넷. 이 클래스는 원래 BigIntegers를 사용하지 않았지만 할당을 위해 사용해야한다는 것을 알았습니다. 그래서 모든 것을 긁어 내야했습니다.

어쨌든. 나는 primes를 계산하기 위해 내장 함수를 사용할 수 없다 (idk가 있다면 그것도있다).

import java.util.*; 
import java.math.*; 

public class RSA{ 
    public static void main(String[] args) { 
     BigInteger p, q; 
     GeneratePrime gp = new GeneratePrime(); 
     p = gp.calculatePPrime(); 
     q = gp.calculateQPrime(); 
    } 
} 

두 클래스가 잘 컴파일,하지만 난 RSA 클래스를 실행할 때 다음, 아무 일도 발생하지 : 여기 내 문제는 내가이 코드를 실행하면 때문이다. 아무런 오류가 없습니다. 내 터미널은 그냥 비어 있습니다. 아무도 이유를 아나요? 아니면이 코드가 컴퓨터에서 작동하는지 누구라도 알 수 있습니까? 내가 아마 여기 무언가를 놓친 걸 알고있다. 감사합니다

+1

대개 프로그램이 소수를 검색하는 중 일 것입니다. –

+1

관련이 없지만이 방법으로 코드를 복제하지 마십시오. 'calculatePPrime()'과'calculateQPrime()'대신에 하나의'calculatePrime()'만 있으면됩니다. –

+0

아마도 생성하는 난수가 매우 커서 (512 비트, 약 십진수 154), 계산 시간이 오래 걸릴 수 있습니다. 컴퓨터는 빠르지 만 너무 빨라서 몇 초 안에 아무 것도 할 수 없습니다 ... – Jesper

답변

4

같은 소수를 시도? 그런 다음 코드에서이 명확하게 :

public BigInteger randomPrime(int bits, Random random) { 
    return new BigInteger(bits, random).nextProbablePrime(); 
    // or 
    // return BigInteger.probablePrime(bits, random); 
} 

이 경우, 귀하의 처분 방법을 사용 nextProbablePrime()합니다. 이 방법은 여러분이 작성한 방법보다 훨씬 효율적입니다. 이렇게하면 응용 프로그램이 크게 향상됩니다.

귀하의 RSA 클래스는 다음이 될 수 있습니다

import java.util.*; 
import java.math.*; 

public class RSA{ 
    public static void main(String[] args) { 
     BigInteger p, q; 
     GeneratePrime gp = new GeneratePrime(); 
     Random random = new Random(); 
     int bits = 512; 
     p = gp.randomPrime(bits, random); 
     q = gp.randomPrime(bits, random); 
    } 
} 
0

새로운 BigInteger의 최대 bitLength 값이 매우 큽니다. 작은 숫자로 줄이면 효과가 있습니다. 아래 코드에서 512 값을 참조하고 있습니다. 12. 임의의 소수를 얻으려면

pRandom = new BigInteger(512, new Random());

2

당신이 512 비트 번호를 사용하고자하는 당신이 무작위로 그것을 얻을 싶어하고 주요있을 것입니다 희망합니다. 당신은 당신의 종류의 해결책으로 아무런 성공을 찾지 못할 것입니다. 이는 너무 많은 가능성으로 처리하기에는 너무 큰 값입니다. . 당신이 certainty으로 BigInteger 생성자를 사용하더라도 지금처럼 :

new BigInteger(int bitLength, int certainty, Random random); 

자바 문서는 말한다 여기서

certainty을 - 호출 측이 허용하지 않는 확률의 척도. 새로운 BigInteger가 소수를 나타내는 확률은 (1 - 1/(2 certainty)를 초과합니다).

당신이 certainty 만드는 큰

, 작은 숫자가 소수가 아니라는 probablility입니다.

아직도 도움이되지 않습니다. @Olivier Grégoire가 제안하거나 비트 수를 줄이면 무작위로 소수가 소수가 아닌 경우 다음 소수를 취하는 것을 고려할 수 있습니다.