2014-04-12 2 views
1

나는 암호문에서 학생 숙제를 위해 난수를 생성해야합니다.암호화 목적으로 C에서 의사 난수를 생성하는 가장 쉬운 방법은 무엇입니까?

은 우선은 내가

srand(time(NULL)); 
int r = rand(); 

를 사용하고 싶어하지만 난 그 암호화를 위해 그것을 사용해서는 안 읽어 보시기 바랍니다. 가능한 경우 이 아닌을 작성하겠습니다. 제 자신의 의사 난수 생성기를 작성하십시오.

암호화 목적으로 C에서 의사 난수를 생성하는 가장 빠르고 쉬운 방법은 무엇입니까?

저는 Linux를 사용하고 있으며 플랫폼에 구애받지 않는 대답이라도 괜찮습니다.

+2

/dev/urandom에서 읽기 – paj28

+3

이것은 트릭 질문입니다. 쉬운 방법이 있고 좋은 방법이 있지만 쉬운 방법이 없습니다. 암호화 RNG는 __hard__입니다. –

+0

언급하지 않은 해결책에 대한 요구가없는 한,'/ dev/random'을 사용하는 것은'srand (time)'(그리고 실제로'rand)')는 그렇지 않습니다. –

답변

2

크로스 플랫폼 솔루션이 없습니다. Linux의 경우 /dev/urandom (fread 또는 복잡성이있는 경우 read)을 읽으십시오. /dev/urandom에서 읽은 바이트는 새로 시작된 임베디드 시스템이나 엔트로피가없는 서버를 제외하고는 암호화 용도로 적합합니다.

설명서는 지나치게 보수적입니다 (공격자가 단순히 전세계의 모든 컴퓨터를 사용하는 것보다 무한한 계산 능력을 가진 이론적 인 보안 개념 때문). 대부분의 경우 it is perfectly fine to use /dev/urandom to generate cryptographic keys입니다.

많은 임의의 바이트를 생성해야하는 경우 코드 내에 pseudo-random number generator을 구현하고 /dev/urandom 만 사용하여 엔트로피를 시드 할 수 있습니다. 몇 개의 키와 유사한 작은 양의 자료를 생성하거나 많은 난수를 생성해야하지만 /dev/urandom의 속도가 병목 현상이 아니거나 이것이 학교 운동이고 PRNG를 구현하는 경우 운동의 요점이 아니라면 /dev/urandom에서 읽는 것이 좋습니다.

2

가짜 난수 생성기 만 있으면 충분하지 않습니다. 시작하기에 충분한 엔트로피를 뿌려야합니다. 일반적으로 운영 체제 호출 중 하나에서 검색 한 시드를 설정하면됩니다. 어느 것을 사용해야하는지는 사용하는 방법에 따라 다릅니다. 나중에 더 높은 품질의 난수를 원하면 시드에서 혼합 할 수 있습니다.

Linux 시스템의 경우 /dev/random은 가장 많은 엔트로피를 반환하고 /dev/urandom은 자체 시드 PRNG이며 응용 프로그램에서 직접 사용할 수 있습니다. /dev/random 그러나 엔트로피가 충분하지 않으면 차단됩니다. 대부분의 경우 조언이 /dev/urandom입니다. /dev/random/에서 너무 많이 읽으면 엔트로피가 멈추는 것을 요청하는 것으로서 전체 시스템이 다운 될 수 있습니다. 다른 운영 체제에서 모두 /dev/random/dev/urandom은 단순히 시드 PRNG에 연결됩니다.

Windows의 경우 this article on MSDN을 살펴보십시오.

+0

또 다른 대답을 추가, 나는 당신이 자신의 PRNG를 사과하고 싶다고 사과했다. 제거 된 Java SHA1PRNG 샘플 코드. 대답의 나머지 부분은 여전히 ​​유효하지만 OpenSSL을 대신 API로 사용하는 것이 좋습니다. –

+0

OpenSSL의 계속되는 문제로 인해 다른 게시물을 삭제했습니다. –

관련 문제