로또 추첨기는 공을 공기로 섞습니다. 프랑스제 VENUS 추첨 시스템이 공기 혼합과 드럼링 회전으로 공 여섯 개를 뽑고, 그 과정을 매주 토요일 저녁에 생방송으로 내보내요.
컴퓨터에는 섞을 공이 없습니다. 그런데도 random 함수는 숫자를 하나 반환합니다. 그 숫자는 어떻게 생성되고, 어디까지 무작위일까요.
정해진 규칙에서 흩어져 나오는 수열 — 출처: 개념 컷 · agy 자가 생성
의사난수의 계산 구조
프로그램이 쓰는 난수는 대부분 의사난수입니다. 무작위처럼 보이는 수열을 정해진 식으로 만들어 내는 것이라, 시작값만 같으면 결과도 같아요.
가장 단순한 형태인 선형 합동 생성기는 이렇게 생겼습니다.
Xₙ₊₁ = (a × Xₙ + c) mod m
a = 1,664,525, c = 1,013,904,223, m = 2³²로 두고 시작값 42를 넣으면 다음 값은 1,083,814,273입니다. 이 값을 다시 식에 넣으면 그다음 값이 나오고, 이 과정이 반복돼요.
여기서 시작값이 시드입니다. 시드가 같으면 같은 수열이 그대로 생성되고, 이건 결함이 아니라 기능이에요. 시뮬레이션을 다시 돌려 같은 결과를 얻거나, 게임 맵을 코드 한 줄로 재현하거나, 실패한 테스트를 그대로 재현할 때 필요한 성질입니다.
파이썬의 random 모듈은 Mersenne Twister를 씁니다. 주기가 2¹⁹⁹³⁷ − 1이라 같은 수열이 되풀이될 걱정은 없어요.
다만 주기가 길다는 것과 예측이 어렵다는 것은 다릅니다. Mersenne Twister는 출력 624개를 모으면 내부 상태를 복원할 수 있고, 그러면 그다음 값은 계산으로 나옵니다.
예측 가능한 난수로 발생한 사고
난수가 사고와 기술을 가른 순간 — 출처: 보도·발표 자료 기반 자가 렌더
시드가 3만 개뿐이었던 Debian OpenSSL
2006년 9월, Debian 패키지에서 난수 시드로 들어가던 값 일부가 실수로 제거됐습니다. 남은 난수 입력값은 사실상 프로세스 ID 하나였어요.
리눅스에서 프로세스 ID의 기본 최대값은 32,768입니다. 시드가 3만 개 남짓이면 만들어지는 키도 그만큼이라, 공격자가 키를 미리 모두 생성해 대조하면 됩니다.
2008년 5월에 공개된 이 문제(CVE-2008-0166)로, 그 사이 Debian 계열에서 만든 SSL·SSH 키는 전부 폐기하고 다시 만들어야 했습니다.
같은 난수를 두 번 쓴 PS3
전자서명 ECDSA는 서명할 때마다 새 난수를 하나 써야 합니다. 이 값이 같은 서명이 두 개 나오면 연립방정식이 성립해 개인키를 계산할 수 있어요.
2010년 12월에 공개된 분석에서 PlayStation 3는 이 값을 고정해 쓰고 있었습니다. 서명 두 개로 콘솔의 서명 키가 노출됐습니다.
두 사고 모두 암호 알고리즘 자체가 공격된 게 아닙니다. 알고리즘에 넣는 난수 쪽이 예측 가능했을 뿐이에요.
용도별 난수 선택
| 쓰임 | 필요한 성질 | 쓰는 것 |
|---|---|---|
| 시뮬레이션·통계 표본 | 재현성과 속도 | Mersenne Twister 같은 PRNG |
| 게임 맵·카드 셔플 | 속도 | PRNG |
| 암호키·세션 토큰·비밀번호 | 예측 불가 | OS 암호용 난수(CSPRNG) |
| 장비 인증·대량 키 생성 | 물리적 무작위 | 하드웨어 RNG·QRNG |
random은 시뮬레이션용이고, secrets가 보안용이에요.
💻 [소스코드: 보안용 난수는 secrets로]
import secrets
token = secrets.token_urlsafe(32)
pin = secrets.randbelow(1000000)
리눅스·macOS라면 이 모듈이 운영체제의 난수를 그대로 가져옵니다. 커널은 키보드 입력 간격, 디스크 응답 시간, 인터럽트 도착 시각처럼 예측하기 어려운 사건을 엔트로피 풀에 축적하고, 이를 암호 알고리즘으로 확장해 출력해요.
물리 현상에서 생성하는 난수
계산으로 만든 수열은 아무리 잘 만들어도 계산을 기반으로 합니다. 그래서 무작위성의 근원은 물리 현상에서 가져옵니다.
하드웨어 난수 생성기
CPU 안의 회로가 열잡음처럼 통제되지 않는 물리 신호를 재서 비트로 바꿉니다. 인텔·AMD 프로세서의 RDRAND 명령이 이 방식이에요.
양자 난수 생성기
광자를 반투명 거울에 쏘면 통과할지 반사될지가 확률로만 정해집니다. 숨은 규칙이 있어서 그렇게 보이는 것이 아니라 원리적으로 결정돼 있지 않아, 되돌려 계산할 대상 자체가 없어요.
국내에서는 이 기술이 휴대폰에 먼저 적용됐습니다. SK텔레콤과 ID Quantique가 2020년 갤럭시 퀀텀에 QRNG 칩을 넣은 것이 시작이고, 갤럭시 퀀텀 5에는 2.5 × 2.5mm 크기의 칩이 탑재됐습니다.
2026년 7월 퀀텀코리아에서는 10 × 10mm 칩에 10Gbps급 QRNG를 구현한 결과와, 송수신부와 QRNG를 한 칩에 넣는 양자키분배 통합 칩 개발 계획이 공개됐어요.
사람이 만드는 난수의 편향
기계 이야기를 했지만, 실제로 사람이 만든 난수는 편향이 크게 나타납니다.
1부터 10 사이에서 아무 숫자나 골라 보라고 하면 7에 선택이 집중됩니다. 조사마다 차이는 있지만 네 명 중 한 명꼴로 7을 고른다는 보고가 반복돼요. 가운데를 피하고 끝을 피하고 짝수를 피하다 보면 남는 자리가 비슷해지기 때문입니다.
언어 모델도 같은 편향을 학습했습니다. 1부터 50에서 고르라고 하면 여러 모델의 선택이 27 부근에 집중된다는 실험이 있어요. 사람이 쓴 글에서 배운 결과라 사람의 편향이 그대로 나타납니다.
1탄에서 본 로또 번호 고르기가 정확히 같은 사례입니다. 사람이 고른 번호는 남들과 겹치고, 겹치면 당첨금을 나눠 갖습니다.
무작위 (1) — 로또 1등 확률 815만분의 1, 운은 어디까지일까
정리
난수 정리 — 출처: 본문 정리 · 자가 렌더
무작위가 필요할 때 던져야 할 질문은 하나입니다. 이 숫자를 누가 역산할 수 있으면 곤란한가. 곤란하면 운영체제나 물리 장치에서 가져오고, 아니면 빠르고 재현 가능한 쪽이 낫습니다.
참고 출처
- [동행복권] 로또6/45 추첨 방법 (VENUS 추첨 시스템·공기 혼합 방식)
- [CERT/CC VU#925211] Debian and Ubuntu OpenSSL packages contain a predictable random number generator (CVE-2008-0166)
- [fail0verflow] Console Hacking 2010, PS3 Epic Fail (ECDSA 난수 재사용)
- [SK텔레콤 뉴스룸] 퀀텀코리아 2026 양자암호 기술 공개 (10Gbps QRNG 칩·QKD 통합 칩)
- [양자신문] SK텔레콤, ID Quantique와 갤럭시 퀀텀 5 공개 (2.5 × 2.5mm QRNG 칩셋)
- [Python 공식 문서] secrets, Generate secure random numbers for managing secrets