RANDOM(4)

명칭
random, urandom - 난수 디바이스

해설
이 디바이스는 디바이스 드라이버등에서 환경 노이즈를 모아 암호에서의 이용에 적당한 좋은 난수를 돌려줍니다. 암호에서의 이용은 물론, 이 수는 TCP 순차 순서 번호를 위한 난수의 종이나, 랜덤인 뿐만이 아니게 공격자의 예상이 어려운 수가 바람직한 그 외의 그런데도 좋은 것입니다.

  조작의 이론
컴퓨터는 매우 예측하기 쉬운 장치입니다. 따라서 컴퓨터로 정말로 난수를 만드는 것은 — 알고리즘을 사용해 간단하게 만들 수 있는 유사 난수란 대조적으로 — 매우 어렵습니다. 불행하게도, 공격자가 유사 난수 생성기의 난수의 열을 추량 하는 것은 매우 간단합니다. 그리고 있는 어플리케이션에 있어서는, 이것은 받아들여지지 않습니다. 거기서 그 대신에, 컴퓨터의 환경으로부터 「환경 노이즈」를 모아, 그것을 사용해 난수를 만들 필요가 있습니다. 「환경 노이즈」는 외부의 공격자에게는 보는 것이 어려워서 없으면 안됩니다. Unix 환경에서는, 이것은 커널중에서 실시하는 것이 최선입니다.

환경으로부터의 난수원에는, 키를 누르는 동안의 타이밍이나 몇개의 세치기의 사이의 타이밍, 그리고 (a) 비결정론적이어 (b) 외부의 관찰자로부터 측정하는 것이 어려운 그 외의 사상이 포함됩니다. 이 근원으로부터의 난수는 「엔트로피의 대기실」에 더해집니다. 「엔트로피의 대기실」은 주기적으로 CBC 모드의 MD5 압축 함수를 사용해 뒤 수 있습니다. 난수가 엔트로피의 대기실로 써 혼합할 수 있을 때, routine는 몇비트의 난수가 난수 생성기의 내부 상태에 저축할 수 있었는지를 견적

난수가 요구되면(자), 카운터와 「엔트로피의 대기실」의 내용의 화의 MD5 해시를 취하는 것으로, 난수를 얻을 수 있습니다. MD5 해시를 사용하는 이유는 난수 생성기의 내부 상태를 밖에 쬐는 것을 막을 수 있기 때문입니다. MD5 해시는 대기실을 보호합니다만, 대기실로부터 만들어지는 난수는 각각 내부 상태로부터 얻을 수 있는 정보를 얼마인가 흘립니다. 그 때문에 정보량이 증가하면(자) 밖의 공격자는 난수 생성기의 내부 상태를 따라가는들이나 추측해 보는 것이 할 수 있게 됩니다. 이 이유로부터 routine는 난수를 출력할 때, 엔트로피의 대기실에 포함되어 있다 「진정한 난수」의 비트수의 내부에서의 견적을 줄입니다.

만약 이 견적이 0 이 되어도, routine는 난수를 계속 만들 수가 있습니다. 그렇지만, 공격자가 난수 생성기의 출력이나 MD5 알고리즘을 해석해 routine의 출력의 추측에 성공할지도 모릅니다. 최악의 경우, 카운터와 발각되지 않은 비밀에 대해서 MD5 핫싱 한 것 (와)과 같게 되므로, Phil Karn (엔트로피의 대기실로부터 난수를 꺼내는데, 카운터를 더했다 MD5 를 사용하는 기구를 생각한 인물)은 이것을 「실용적인 난잡함」이라고 부르고 있습니다. 만약 MD5 가 강력한 암호 해시이면, 이것은 꽤 공격에 견딜 수 있을 것입니다.

  export 된 인터페이스 — 출력
export 된 인터페이스는 3 개 있습니다. 제 1 은 커널의 내부로부터 사용하는 것을 의도한 것입니다.

void get_random_bytes(void *buf, int nbytes);

이 인터페이스는 요구된 바이트수의 난수를 돌려주어, 그것이 요구된 버퍼에 둡니다.

다른 2 개의 인터페이스는 /dev/random (와)과 /dev/urandom 의 2 개의 캐릭터형 디바이스입니다. 최대에서도 엔트로피의 대기실에 포함된다 (난수 생성기에 의해 추측해졌다) 비트수의 난수 밖에 돌려주지 않기 때문에 /dev/random 디바이스는 매우 고품질의 난수가 필요한 때 (예를 들면, 열쇠의 생성)의 사용에 적격입니다.

/dev/urandom 디바이스는 이 제한이 없고, 요구되었을 뿐의 바이트를 돌려줍니다. 엔트로피의 대기실이 재축적하는 시간을 주지 않고 많은 난수를 요구하면(자), 난수의 질이 낮아집니다. 그렇지만, 많은 어플리케이션에 있어서는 이것은 받아들여지겠지요.

  export 된 인터페이스 — 입력
디바이스로부터 환경 노이즈를 모으는 현재의 export 된 인터페이스는 다음의 2 개입니다.

void add_keyboard_randomness(unsigned char scancode);
void add_interrupt_randomness(int irq);

1 번째의 함수는 「엔트로피의 대기실」에의 랜덤인 입력으로서 scancode 는 물론, 키를 누르는 동안의 타이밍도 사용합니다.

2 번째의 함수는 엔트로피의 대기실에의 랜덤인 입력으로서 세치기의 사이의 타이밍을 사용합니다. 모든 세치기가 좋은 난수원이라고 하는 것은 아닌 것에 주의해 주세요! 예를 들면, 타이머 세치기는 좋은 선택이 아닙니다. 왜냐하면 세치기의 주기성이 매우 규칙적이기 때문에 공격자가 예측할 수 있기 때문입니다. 디스크 세치기의 타이밍은 보다 예측할 수 없기 때문에, 디스크 세치기가 보다 좋습니다. routine는 세치기의 타이밍의 1 차와 2 차의 델타를 취하는 것으로 특정의 세치기 채널이 제공하는 랜덤 천성몇 비트인지를 추측하려고 합니다.

사례
원래의 중심이 되는 코드는 Theodore Ts'o 하지만 Linux 플랫폼전용으로 썼습니다. FreeBSD 에 이식한 것은 rndcontrol(8) 유틸리티 도 썼다 Mark Murray 입니다.

이 난수 생성기를 구성할 생각은 Pretty Good Privacy 의 난수 생성기와 Phil Karn 와의 개인적인 논의로부터 얻은 것입니다. 이 설계는 한층 더 나 혼자로 수정했으므로, 어떠한 결함도 나만의 책임이며, PGP 의 저작자나 Phil 에 돌아가야 하는 것이 아닙니다.

MD5 변환의 코드는 퍼블릭 도메인인 Colin Plumb 의 실장으로부터 취했습니다. MD5 암호 체크 섬은 Ronald Rivest 에 의해 발명되어 RFC 1321, "The MD5 Message Digest Algorithm" 로 해설되고 있습니다.

이 화제에 관한 더 이상의 예비 지식은 Donald Eastlake, Steve Crocker, Jeff Schiller 에 의한 RFC 1750,"Randomness Recommendations for Security" 로부터 얻을 수 있겠지요.

관련 항목
rndcontrol(8)

관련 파일
/dev/random
/dev/urandom

역사
random, urandom 파일은 FreeBSD 2.1.5 그리고 등장했습니다.