안전한 난수 만들기 (1/2)

Sam (sangho kim)
Hexlant
Published in
3 min readMay 1, 2023
alea iacta est (주사위는 던져졌다!)

난수(random number)는 결과를 예측할 수 없는 어떠한 값을 의미합니다. 우리는 아주 오래전부터 특정 참가자의 의지가 반영되지 않으며, 그 결과를 예측할 수 없게 하기 위한 다양한 방법들을 사용해왔습니다. 동전 던지기, 주사위 굴리기 등이 쉽게 생각할 수 있는 예시입니다.

동전 던지기의 시작은 카이사르 집권기의 로마 시대로 거슬러 올라갑니다. 당시 로마의 동전엔 액수 외엔 특별한 도안이 없었는데, 카이사르의 명령으로 자신의 얼굴이 동전의 한쪽 면에 새겨지게 됩니다. 이 때부터 사람들은 동전을 던져 황제의 얼굴이 있는 면이 나오면 긍정적인 의미로 해석하기 시작했습니다. 이러한 동전 던지기는 지금까지 이어져 현대의 축구 경기 시작 전 진영을 선택할 권리를 결정하는 데에도 사용됩니다.

주사위의 기원은 확실하지 않지만 선사시대 이전으로 거슬러 올라갑니다. 기원전 3000년 경부터 이집트인들은 “세네트”라는 우리나라의 윷놀이와 비슷한 보드게임을 즐겼습니다. 또한 기원전 2600년 경의 인더스 문명의 유적에선 현재 우리가 사용하는 주사위와 흡사한 6면체 형태의 주사위가 출토되었습니다.

이처럼 우리는 과거부터 현재까지 어떠한 값을 무작위성에 의해 결정해야 할 상황이 존재합니다. 이는 컴퓨터 과학의 세계에서도 마찬가지입니다. 컴퓨터 게임에서 별이 가득한 밤하늘을 그릴 때, 포커와 같은 카드 게임에서 특정 카드의 등장 확률을 계산할 때, 그리고 암호화 통신을 하기 위해서도 사용됩니다.

컴퓨터로 그린 별이 가득한 밤하늘

그런데 이러한 난수를 추측할 수 있다면 어떻게 될까요? 게임에서의 문제는 크게 중요하지 않을 수 있습니다. 적의 패턴을 쉽게 알 수 있게 된다던지, 무조건 승리할 수 있는 필승 전략이 생기는 정도의 문제일겁니다. 하지만 암호화 관점에선 문제가 커집니다. 금융IT, 블록체인 시스템, 암호화 통신 등 암호화를 사용하는 대부분의 시스템에선 난수를 키(Key)로 사용하기 때문에, 추측 가능한 난수의 존재는 시스템 전체의 붕괴를 의미합니다. 쉽게 말해 모든 공인인증서, 웹사이트의 비밀번호, 블록체인 지갑이 전부 탈취된 상태라고 생각할 수 있습니다.

하지만 문제는, 생각 외로 컴퓨터는 난수를 간단히 만들 수 없다는 점에 있습니다. 무의식적으로 임의의 선택을 내릴 수 있는 사람과 달리 (물론 사람의 선택은 주변 환경에 의한 편향(bias)을 갖기 쉽습니다), 컴퓨터는 기본적으로 입력에 의해 출력이 결정되는 결정적(deterministic) 시스템이기 때문입니다. 따라서 컴퓨터는 밀리초 또는 나노초 단위의 시간, CPU의 온도, 생성 시 마우스의 움직임 등을 이용해 최대한 난수에 가까운 의사 난수(Pseudo Random Number)를 생성합니다.

따라서 우리가 프로그램을 만들 때, 난수에 대한 이해와 사용하는 난수 라이브러리가 쓸만한 난수를 생성하는 지 확인할 필요가 있습니다. 다음 글에서 난수의 유형과 생성, 그리고 라이브러리 선택 기준에 대해 설명하겠습니다.

--

--