랜덤값은 두 가지 요소를 갖춰야 한다.
Uniform distribution
여러 가지 반환값이 각자 비슷한 확률로 뽑히는 상태를 말한다.
Independence
값들 사이의 연관성이 없는 상태를 말한다.
Unpredictability
이전의 출력값을 알고 있다고 하더라도 새로 만들어질 출력값을 전혀 유추할 수 없어야 한다,
시드값을 이용해서 마치 랜덤넘버를 만드는 것처럼 생성한다
랜덤 넘버를 생성하는 데 적절한지 알아보기 위해 테스트를 진행한다.
랜덤 숫자의 unpredictability는 forward와 backward로 나뉜다.
forward unpredictability
시드가 공개되지 않았을 때 랜덤으로 만들어진 값을 보더라도 앞으로 만들어질 랜덤 넘버를 예측할 수 없어야 한다.
backward unpredictability
만들어진 데이터를 이용해서 시드 값을 추측할 수 없어야 한다.
이러한 요소를 지키기 위해서 PRNG design에서는 랜덤값을 몇 번 생성한 뒤 시드 값을 재생성하라는 등의 가이드라인을 제시하고 있다.
시드 값을 입력받아 internal state에서 초기화하고, 이 값을 one-way hash function 에 넣으면 고정된 크기의 출력(hash)으로 psudorandom output을 얻는다.
여기서 one-way라는 말은 입력값으로 출력값을 만들기는 쉽지만, 출력값으로 입력값을 유추하기는 불가능하거나 아주 어렵다는 뜻이다.
CTR
one-way hash function과 거의 비슷하다. 시드값과 key값을 이용해서 랜덤값을 생성한다.
OFB
출력값을 다시 입력값으로 써서 랜덤을 만드는데, 이 때 새로운 key를 붙여서 이용하므로 one-way hash function과는 다르다. 그래도 시드 값이 입력값과 연관될 가능성은 있다.
NIST SP 800에서는 CTR을 더 권장하고 있다.
PRNG 기능은 소프트웨어보다 하드웨어 상에 구현되어있는 경우가 많아서 고치기 어렵기 때문에 꾸준한 테스트가 필요하다. 이러한 테스팅 모델은 하드웨어에 함께 내장되어있다.
random generator로 만들어진 값이 랜덤이 맞는지, 시드 값이 적절한지 판단하는 역항를 한다.