2012-02-25 4 views
3

특히, 0과 일부 숫자 x 사이의 암호 학적으로 안전한 난수를 생성하려고합니다.OpenSSL의 bn_rand_range에 해당하는 Java가 있습니까?

OpenSSL에서 이것은 bn_range 기능으로 수행됩니다.

Java의 BigInteger(int bits, Random r) 생성자 (0에서 2까지의 숫자를 생성) 비트을 사용하여 직접 구현할 수 있습니다. 그러나 가능한 경우 보안을 위해보다 잘 테스트 된 알고리즘을 사용하고 싶습니다.

Java에서 이것을 수행하는 표준 방법이 있습니까?

P. 나는 실제로 안드로이드를 사용하고 있지만, 표준 자바에서 어떻게 해야할지 모르겠다.

편집 : xBigInteger으로 저장되는 큰 정수입니다.

답변

1

을,이 기능은 아니다 제공됩니다.그러나 자신을 구현하는 것은 쉽습니다.

Random r = new SecureRandom();  
BigInteger q = something_big; 
BigInteger ans; 

do 
    ans = BigInteger(bits_in_q, r); 
while (ans.compareTo(q) >= 0); // bn_rand_range generates numbers < q 
3

Java는 Random 클래스의 서브 클래스 인 SecureRandom을 제공합니다. 설명에는 다음이 포함됩니다.

이 클래스는 암호 학적으로 강력한 난수 생성기 (RNG)를 제공합니다. 많은 구현은 PRNG (pseudo-random number generator) 형식으로되어 있습니다. 즉, 진정한 무작위 시드로부터 의사 랜덤 시퀀스를 생성하는 데 결정 성 알고리즘을 사용합니다. 다른 구현 참 난수를 생성 할 수 있고, 또 다른

자바는 단지 하나의 구현을 제공하는 두 가지 기술은 SHA1PRNG 기능들의 조합을 사용할 수있는 것이 의사 난수 (PRNG) 알고리즘으로 details :

이 구현은 IEEE P1363 표준 인 부록 G.7 "소스 비트 확장"을 따르며 SHA-1을 PRNG의 기초로 사용합니다. 각 연산마다 1 씩 증가하는 64 비트 카운터와 연결된 실제 임의 시드 값에 대한 SHA-1 해시를 계산합니다. 160 비트 SHA-1 출력에서 ​​64 비트 만 사용됩니다.

또한 OpenSSL을에서 bn_rand_range 기능 내가 기능 구현을 산법 무엇을 위해 같은 세부 사항을 찾을 수 있지만, 의사 난수 생성 (PRNG) 알고리즘을 사용하는 것도 considered 것을 주목해야한다.

SecureRandom 때문에 Random 클래스의 서브 클래스, 오브젝트가 SecureRandom.nextInt(int n)Random 방법을 포함하는 모든 방법을 사용할 수있다. nextInt 방법이 제공

0 (포함) 사이의 의사 균일하게 분포 int 값이 난수 생성기 시퀀스에서 그려진 지정된 값 (단독)를 반환.

따라서, 0100]을 다음과 같은 코드를 사용할 수 있습니다 (범위의 암호화 강력한 의사 난수 생성 : 지금까지 내가 말할 수있는

import java.security.SecureRandom; 
class secure{ 
    public static void main(String[] args) throws Exception{ 
     SecureRandom random = SecureRandom.getInstance("SHA1PRNG"); 
     System.out.println(random.nextInt(100)); 
    } 
} 
+0

java에서 bn_rand_range를 구현할 때 이미 SecureRandom을 사용하고 있습니다. 문제는 bn_rand가 아니라 bn_rand_range처럼 작동하는 함수가 구현되었는지 여부입니다. – diedthreetimes

+0

bn_rand_range를 모방 한 코드를 보여주기 위해 답변을 업데이트했습니다. 당신은 0과 X 사이의 숫자를 찾았다 고 언급 했으므로 방금 nextInt를 사용했습니다. X와 Y 사이의 범위를 원하면'random.nextInt (Y-X) + X'를 사용하십시오. – amccormack

+0

죄송합니다. X가 int가 아니라 BigInteger라는 것을 잊어 버렸습니다. 그렇지 않으면 귀하의 접근 방식은 내가 찾고있는 것입니다. – diedthreetimes

관련 문제