SEO June 21, 2026 5 min 4,439 words AutoSEO Team

난수 생성기 - 즉시, 무료로, 진정한 무작위 생성

난수 생성기 - 즉시, 무료로, 진정한 무작위 생성

난수 생성기란 무엇인가요?

난수 생성기(RNG)는 계산 시스템, 물리적 시스템 또는 이 둘을 결합한 시스템으로서, 우연보다 더 정확하게 예측할 수 없는 일련의 숫자를 생성합니다. 각 출력값은 이전 값들과 통계적으로 독립적이며, 전체 시퀀스에는 관찰자가 미래 출력값을 예측하는 데 사용할 수 있는 명확한 패턴이 없습니다. 이 정의는 간단해 보이지만, 실제로 이를 구현하는 것은 응용 수학 및 컴퓨터 과학 분야에서 가장 어려운 문제 중 하나입니다.

"난수 생성기"라는 용어는 종종 혼동되는 두 가지 근본적으로 다른 개념을 포괄합니다. 하나는 결정론적 알고리즘을 사용하여 무작위처럼 보이는 수열을 생성하는 의사난수 생성기(PRNG) 이고, 다른 하나는 우주의 물리적 엔트로피에서 실제 난수를 추출하는 참난수 생성기(TRNG)입니다 . 세 번째 범주인 암호학적으로 안전한 의사난수 생성기(CSPRNG) 는 이 둘의 중간에 위치합니다. CSPRNG는 구현 방식은 결정론적이지만, 계산적으로 가능한 공격으로는 그 출력을 참난수와 구별할 수 없도록 설계되었습니다.

난수 생성기가 중요한 이유

난수 생성기(RNG)는 과학, 보안, 그리고 일상적인 소프트웨어 전반에 걸쳐 핵심적인 역할을 담당합니다. 신뢰할 수 있는 난수가 없다면 현대 암호화 기술은 무너질 수밖에 없습니다. 모든 TLS 세션, 모든 암호화된 메시지, 모든 디지털 서명은 예측 불가능해야 하는 비밀 키에 의존합니다. 카지노, 복권, 온라인 게임은 공정성을 위해 RNG를 사용합니다. 기후 모델링부터 신약 개발에 이르기까지 과학 시뮬레이션은 분석적으로 해결하기 어려운 해를 근사하기 위해 무작위 샘플링을 활용합니다. 통계적 샘플링, A/B 테스트, 절차적 게임 세계 생성, 심지어 신경망 가중치 초기화까지 모두 고품질의 난수를 필요로 합니다.

잘못된 난수 생성의 결과는 심각하며 이미 잘 알려져 있습니다. 2012년 연구원들은 인터넷에 있는 수백만 개의 RSA 공개 키가 동일한 소인수를 공유한다는 사실을 발견했는데, 이는 키를 생성하는 장치의 부팅 시 엔트로피가 부족했기 때문입니다. 공유된 소인수를 인수분해할 수 있는 공격자는 개인 키를 복구하고 모든 통신 내용을 해독할 수 있습니다. 2010년에는 소니 플레이스테이션 3가 ECDSA 구현에서 모든 서명에 동일한 "랜덤" 논스를 재사용하는 바람에 해킹당했습니다. 단 하나의 반복된 값만으로도 대수적으로 개인 키를 추출할 수 있는 것입니다. 이러한 사례들은 예외적인 경우가 아니라, 난수성을 이미 해결된 문제로 취급할 때 발생하는 예측 가능한 결과입니다.

주요 응용 분야

  • 암호학 및 보안: 키 생성, 초기화 벡터, 논스, 솔트, 세션 토큰 및 인증서 일련 번호.
  • 시뮬레이션 및 모델링: 몬테카를로 방법, 확률 미분 방정식, 입자 물리학 시뮬레이션, 역학 모델.
  • 게임 및 도박: 카드 섞기, 주사위 굴리기, 슬롯머신 결과, 절차적 레벨 생성, 전리품 표.
  • 통계 및 연구: 무작위 표본 추출, 무작위 대조 시험, 부트스트래핑, 교차 검증 분할.
  • 분산 시스템: 리더 선출, 지터가 있는 로드 밸런싱, 임의 지연이 있는 지수 백오프.
  • 머신러닝: 가중치 초기화, 드롭아웃 마스크, 데이터 증강, 확률적 경사 하강법.

의사난수 생성기의 작동 원리

의사난수 생성기(PRNG)는 시드 (단일 숫자 또는 작은 데이터 블록)로 시작하여 결정론적 수학 함수를 반복적으로 적용하여 긴 출력 시퀀스를 생성합니다. 동일한 시드를 사용하면 시퀀스는 완벽하게 재현 가능합니다. 다른 시드를 사용하면 시퀀스는 완전히 다르게 나타납니다. PRNG의 품질은 무작위성에 대한 통계적 테스트를 얼마나 잘 통과하는지, 그리고 보안 애플리케이션의 경우 출력으로부터 내부 상태를 추론할 수 있는지 여부로 판단됩니다.

선형 합동 생성기

가장 오래되고 간단한 의사난수 생성기(PRNG) 계열은 X n+1 = (aX n + c) mod m이라는 점화식을 사용하는데, 여기서 a, c, m은 신중하게 선택된 상수입니다. C 표준 라이브러리의 rand() 함수는 많은 구현에서 선형 합동 생성기(LCG)로 작동합니다. LCG는 빠르고 구현하기 쉽지만 심각한 약점이 있습니다. 하위 비트가 짧은 주기로 순환하고, 전체 시퀀스 주기는 최대 m이며, 내부 상태는 몇 개의 출력만으로 쉽게 복구할 수 있습니다. 보안 요구 사항이 없는 간단한 시뮬레이션이나 게임에는 적합하지만, 암호학적 용도로는 절대 사용할 수 없습니다.

메르센 트위스터

1998년 마쓰모토와 니시무라가 발표한 메르센 트위스터(MT19937)는 파이썬, 루비, R, PHP를 비롯한 여러 언어에서 기본 의사난수 생성기(PRNG)로 사용되었습니다. 이 난수는 2¹⁹⁹⁸⁷⁻¹ 이라는 천문학적으로 큰 주기를 가지며, 거의 모든 통계적 검증을 통과하고 실행 속도가 빠릅니다. 내부 상태는 624개의 32비트 정수로 구성됩니다. 치명적인 약점은 공격자가 624개의 연속된 출력을 관찰할 경우, 전체 내부 상태를 재구성하여 미래의 모든 출력을 예측할 수 있다는 것입니다. 따라서 메르센 트위스터는 보안에 민감한 용도에는 전혀 적합하지 않지만, 그러한 목적으로 널리 오용되고 있습니다.

최신 의사난수 생성기: Xoshiro, PCG, SFC

현재 모범 사례로 꼽히는 비암호화 의사난수 생성기(PRNG)에는 PCG 계열 (Permuted Congruential Generators), xoshiro256** , SFC64 등이 있습니다. 이 생성기들은 Mersenne Twister보다 크기가 작고 속도가 빠르며 통계적으로 우수합니다. 특히 PCG는 의사난수 생성기에 대한 가장 까다로운 표준 통계 테스트 모음인 TestU01 BigCrush에서 뛰어난 성능을 보여줍니다. NumPy는 바로 이러한 이유로 버전 1.17에서 기본 생성기를 Mersenne Twister에서 PCG64로 변경했습니다.

암호학적으로 안전한 의사난수 생성기(PRNG)는 어떻게 작동할까요?

CSPRNG는 일반적인 통계적 난수성 외에도 두 가지 속성을 만족해야 합니다. 첫째, 다음 비트 예측 불가능성 : 이전의 모든 출력값이 주어졌을 때, 어떤 다항 시간 알고리즘도 50%보다 의미 있게 높은 확률로 다음 비트를 예측할 수 없어야 합니다. 둘째, 상태 손상 저항성 : 공격자가 현재 내부 상태를 알게 되더라도 과거 출력값을 복원할 수 없어야 합니다(이를 역방향 비밀성 또는 역추적 저항성이라고 합니다).

최신 운영 체제는 핵심 서비스로 CSPRNG(컴퓨터 지원 의사 난수 생성기)를 제공합니다. Linux는 /dev/urandomgetrandom() 시스템 호출을 제공하며, 둘 다 하드웨어 이벤트로 초기화된 커널 엔트로피 풀에서 난수를 생성합니다. Windows는 BCryptGenRandom() 제공합니다. macOS와 iOS는 arc4random_buf() 를 사용하며, macOS 10.12부터는 ChaCha20을 기반으로 합니다. 실제 운영 체제에서 사용되는 CSPRNG의 기본 구조에는 Hash_DRBG , HMAC_DRBG , CTR_DRBG (모두 NIST SP 800-90A에 표준화됨)와 BSD 및 최신 Linux에서 사용되는 ChaCha20 기반 생성기가 포함됩니다.

진정한 난수 생성기의 작동 방식

TRNG(진정한 난수 생성기)는 근본적으로 양자 역학적이거나 측정 불가능한 초기 조건에 민감한 혼돈적인 고전 시스템을 포함하는 등 진정으로 예측 불가능한 물리적 과정에서 무작위성을 추출합니다.

일반적인 물리적 엔트로피 발생원

  • 열잡음(존슨-나이퀴스트 잡음): 저항기 내 전자의 무작위 운동은 샘플링 및 디지털화할 수 있는 전압 변동을 발생시킵니다.
  • 샷 노이즈: 검출기에 광자 또는 전자가 불규칙적이고 무작위로 도달하면서 측정 가능한 무작위 신호가 생성됩니다.
  • 방사성 붕괴: 방사성 물질에서 발생하는 붕괴 현상의 시기는 양자 역학적으로 무작위적입니다. RANDOM.ORG는 이와 유사하게 예측 불가능한 대기 전파 잡음을 이용합니다.
  • 양자 광학 소스: 광자 도착 시간, 호모다인 검출로 측정된 진공 요동, 빔 분할기 경로 선택은 모두 검증된 양자 무작위성의 원천입니다.
  • 소비자 기기의 하드웨어 엔트로피: 최신 CPU에는 전용 하드웨어 난수 생성기(RNG) 명령어 세트가 포함되어 있습니다. 인텔의 RDRAND는 AES-CBC-MAC으로 처리된 온칩 열 잡음 소스를 사용합니다. AMD의 유사 기술도 비슷한 방식으로 작동합니다. ARM의 TrustZone은 운영 체제에서 접근 가능한 하드웨어 엔트로피 소스를 제공합니다.
  • 운영 체제 엔트로피 풀: Linux는 인터럽트 타이밍, 디스크 I/O 지연 시간, 네트워크 패킷 도착 시간 및 하드웨어 RNG 명령어에서 엔트로피를 수집하고, 이를 암호화 구조를 통해 혼합하여 커널의 엔트로피 풀을 생성합니다.

조건화 문제

물리적 잡음은 균일하게 분포하는 경우가 드뭅니다. 열 잡음원은 회로 비대칭으로 인해 1보다 0을 약간 더 많이 생성할 수 있습니다. 따라서 TRNG(열 잡음 생성기)는 원시 샘플을 더 짧고 균일한 출력으로 압축하는 조건화 단계(일반적으로 암호화 해시 또는 추출 함수)를 포함합니다. 소모된 원시 비트 수 대비 생성된 출력 비트 수의 비율을 최소 엔트로피율 이라고 하며, 잘 설계된 TRNG는 이 비율을 신중하게 특성화합니다. NIST SP 800-90B는 연방 시스템에 사용되는 엔트로피 소스에 대한 테스트 및 검증 요구 사항을 정의합니다.

PRNG, CSPRNG 및 TRNG 비교

재산 PRNG CSPRNG TRNG
결정론적 네 (파종 후) 아니요
씨앗으로부터 번식 가능 아니요
통계 테스트를 통과합니다 대개 예 (조건부 적용 후)
예측에 대한 보안 아니요
속도 매우 빠름 빠른 속도가 느림 (하드웨어 제한)
하드웨어 엔트로피가 필요합니다 파종용으로만 사용 가능 파종용으로만 사용 가능 언제나
일반적인 사용 사례 시뮬레이션, 게임, 샘플링 키 생성, 토큰, 암호화 고보안 키, 도박 규제, 연구

무작위성의 통계적 정의

무작위성은 이분법적인 속성이 아니라 스펙트럼상에 존재하며, 적절한 기준은 전적으로 적용 분야에 따라 달라집니다. 특정 목적에 대해 어떤 시퀀스가 무작위적이라고 간주되려면, 해당 목적과 관련된 어떤 테스트도 이론적으로 이상적인 무작위 시퀀스와 구별할 수 없어야 합니다. 미국 국립표준기술연구소(NIST)는 빈도 분석, 실행 테스트, 스펙트럼 분석, 선형 복잡도 등을 포함한 15가지 테스트로 구성된 통계적 테스트 모음(SP 800-22)을 발표했습니다. 몬트리올 대학교에서 개발한 TestU01 라이브러리의 BigCrush 테스트 모음은 이보다 훨씬 더 까다롭고, 106가지의 서로 다른 테스트를 적용합니다. BigCrush 테스트를 통과하지 못한 생성기는 실행 속도가 아무리 빠르더라도 진지한 시뮬레이션 작업에 적합하지 않습니다.

무작위성이 무엇을 의미하지 않는지 정확히 짚어볼 필요가 있습니다. 1, 2, 3, 4, 5와 같은 수열은 각각의 숫자가 나올 확률이 모두 같더라도 무작위적인 것이 아닙니다. 패턴 자체가 예측 가능하기 때문입니다. 반대로, 어떤 수열이 우연히 특정 패턴을 보이는 것처럼 보일지라도(공정한 동전에서 앞면이 세 번 연속 나오는 경우처럼) 무작위성이 아니라고 단정할 수는 없습니다. 무작위성은 생성 과정의 속성이지, 특정 결과 수열 자체의 속성이 아닙니다.

난수 생성기의 작동 원리: 핵심 메커니즘 및 실용적인 전략

난수 생성기는 크게 두 가지 범주로 나뉩니다. 하나는 초기값을 시드(seed)로 사용하는 결정론적 알고리즘 기반의 의사난수 생성기(PRNG)이고, 다른 하나는 물리적 현상으로부터 엔트로피를 도출하는 진정한 난수 생성기(TRNG)입니다. 적절한 유형의 난수 생성기를 선택하고, 초기값을 올바르게 설정하며, 특정 사용 사례에 적용하는 것이 결과의 통계적 건전성, 암호학적 안전성 또는 예측 가능성 여부를 결정합니다.

난수 생성기(RNG) 선택 및 사용을 위한 단계별 전략

난수를 생성하기 전에 먼저 작업에 적합한 생성기를 선택해야 합니다. 암호화 키 생성에 빠른 의사 난수 생성기(PRNG)를 사용하는 것은 소프트웨어 보안에서 가장 심각한 오류 중 하나입니다. 마찬가지로 수십억 번의 반복이 필요한 몬테카를로 시뮬레이션에 느린 하드웨어 난수 생성기(RNG)를 사용하는 것은 불필요하게 자원을 낭비하는 행위입니다. 다음 단계에서는 기본 원칙부터 시작하여 의사 결정 과정을 안내합니다.

1단계: 필요한 무작위성 요건을 정의하세요

어떤 도구나 라이브러리를 사용하기 전에 다음 세 가지 질문을 스스로에게 해보세요.

  • 예측 가능성이 중요할까요? 암호화, 도박, 복권 또는 보안 토큰과 같이 공격자가 숫자를 추측하여 피해를 입히는 경우에는 암호학 수준의 난수성이 필요합니다. 하지만 물리 시뮬레이션을 실행하거나 재생 목록을 섞는 경우에는 고품질 의사 난수 생성기(PRNG)로도 충분합니다.
  • 숫자가 몇 개나 필요하신가요? 일부 난수 생성기는 유한한 주기를 가지고 있습니다. 파이썬의 random 모듈과 여러 언어에서 널리 사용되는 메르센 트위스터(Mersenne Twister)는 2¹⁹⁹³⁷⁻¹ 의 주기를 가지는데, 이는 대부분의 목적에는 천문학적으로 큰 값이지만 여전히 유한하고 결정론적입니다.
  • 재현성이 필요하신가요? 과학 실험이나 절차적 게임 생성에서는 종종 정확히 동일한 순서가 재현되어야 합니다. 시드가 있는 의사 난수 생성기(PRNG)는 이를 제공하지만, 참/거짓 난수 생성기(TRNG)는 그렇지 않습니다.

2단계: 적합한 발전기 유형 선택

사용 사례 추천 발전기 예시
암호화 키, 비밀번호, 토큰 CSPRNG(암호학적으로 안전한 의사난수 생성기) secrets 모듈(Python), crypto.randomBytes (Node.js), /dev/urandom (Linux)
시뮬레이션, 통계, 머신러닝 고품질 의사난수기 메르센 트위스터, PCG64, xoshiro256**
복권, 감사 가능한 추첨 TRNG 또는 인증된 하드웨어 RNG RANDOM.ORG, 하드웨어 보안 모듈(HSM)
게임, 절차적 생성 시드된 PRNG 메르센 트위스터, 좋은 상수를 가진 LCG
실시간 임베디드 시스템 온칩 하드웨어 RNG 인텔 RDRAND, ARM TrueRNG

3단계: 생성기에 올바르게 초기값을 입력합니다.

시드(seed)는 대부분의 의사난수 생성기(PRNG) 배포에서 단일 실패 지점입니다. 아무리 정교한 알고리즘을 사용하더라도, 취약하거나 예측 가능한 시드 때문에 PRNG의 전체 보안 모델이 무너질 수 있습니다.

  • 높은 엔트로피 시드를 사용하십시오. 운영 체제 엔트로피 풀(Unix의 /dev/urandom , Windows의 CryptGenRandom )은 키보드 타이밍, 디스크 인터럽트, 네트워크 패킷 도착과 같은 하드웨어 이벤트를 결합하여 사실상 예측 불가능한 시드를 생성합니다.
  • 시스템 시계만으로 시드 값을 설정하지 마십시오. 프로그램 시작 시간을 대략적으로 알고 있는 공격자는 타임스탬프 기반 시드 값을 무차별 대입 공격으로 단 몇 초 만에 알아낼 수 있습니다. 이러한 취약점은 온라인 포커 사이트와 복권 시스템에 대한 실제 공격에서 악용된 바 있습니다.
  • 실제 운영 환경에서는 절대로 시드 값을 하드코딩하지 마세요. 고정된 시드 값은 실행할 때마다 동일한 시퀀스를 생성합니다. 이는 테스트에는 유용할 수 있지만 보안에는 치명적입니다.
  • 장시간 실행되는 애플리케이션의 경우 주기적으로 시드 값을 다시 생성하십시오. 애플리케이션이 며칠 또는 몇 주 동안 실행되는 경우, 주기적으로 새로운 엔트로피를 주입하면 생성기가 예측 가능한 상태로 반복되는 것을 방지할 수 있습니다.

4단계: 생성기를 특정 작업에 적용합니다.

단순히 난수를 생성하는 것 자체가 최종 목표는 아닌 경우가 많습니다. 실제 응용 분야인 샘플링, 셔플링, 범위 매핑 과정에서 여러 가지 오류 발생 가능성이 있습니다.

범위 내 숫자 생성

모듈로 연산자( rand() % N )를 사용하는 단순한 접근 방식은 모듈로 편향을 유발합니다. 생성기의 출력 범위가 N으로 나누어 떨어지지 않으면 일부 값이 다른 값보다 더 자주 나타납니다. 예를 들어, 생성기가 0에서 32767까지의 값을 생성하고 원하는 숫자가 0에서 99까지인 경우, 32768은 100으로 나누어 떨어지지 않으므로 0~67이 68~99보다 약간 더 자주 나타납니다.

  • 거부 샘플링을 사용하세요. 편향된 꼬리 부분에 해당하는 값을 버리고 다시 그리세요. 대부분의 잘 구현된 표준 라이브러리는 이 작업을 자동으로 수행합니다.
  • 내장 범위 함수를 사용하세요. Python의 random.randint(a, b) , Java의 ThreadLocalRandom.nextInt(origin, bound) 및 유사한 함수는 편향을 내부적으로 처리합니다.
  • 암호화 용도로는 기본적으로 편향되지 않은 범위 선택을 구현하는 Python의 secrets 모듈 또는 그와 동등한 모듈을 사용하십시오 .

목록을 공정하게 섞기

피셔-예이츠 셔플(또는 너스 셔플)은 균일하게 무작위적인 순열을 생성하는 유일하게 정확한 알고리즘입니다. 이 알고리즘은 마지막 요소부터 첫 번째 요소까지 순차적으로 진행하면서 각 요소를 현재 위치 또는 그 이전 위치에 있는 무작위로 선택된 요소와 교환합니다.

  1. 마지막 인덱스 i = n−1부터 시작합니다.
  2. 0 ≤ j ≤ i 중에서 임의의 인덱스 j 를 선택합니다.
  3. 위치 ij 에 있는 요소를 서로 바꿉니다.
  4. i를 1씩 감소시키고 i 가 0이 될 때까지 반복합니다.

단순한 대안, 즉 각 요소의 위치를 독립적으로 무작위로 선택하는 방식은 균일한 분포를 만들어내지 못합니다. 어떤 순열은 다른 순열보다 더 자주 나타나는데, 이는 카드 게임이나 복권에서 측정 가능하고 악용될 수 있는 결함입니다.

비복원 추출

n개의 모집단에서 k개의 고유값을 추출해야 할 때, 중복을 제거하고 다시 추출하는 방식은 비효율적입니다. 대규모 데이터셋이나 스트리밍 데이터셋에는 리저버 샘플링을, 소규모 데이터셋에는 모집단의 복사본에 피셔-예이츠 추출법을 사용하는 것이 좋습니다. 파이썬의 random.sample(population, k) 함수는 이러한 방식을 정확하고 효율적으로 구현합니다.

5단계: 발전기 출력 품질 테스트

제대로 구현된 난수 생성기(RNG)라도 통계적 특성이 응용 프로그램의 요구 사항과 일치하지 않으면 특정 응용 프로그램에서 제대로 작동하지 않을 수 있습니다. 하지만 표준 테스트 스위트를 사용하면 대부분의 결함을 잡아낼 수 있습니다.

  • TestU01(BigCrush): 의사난수 생성기(PRNG)에 대한 가장 엄격한 통계적 테스트 모음입니다. 수백 가지의 테스트를 적용하며, 간단한 테스트로는 놓칠 수 있는 미묘한 상관관계까지 감지할 수 있습니다. 일부 LCG 변형을 포함한 많은 구형 생성기가 BigCrush 테스트를 통과하지 못합니다.
  • 다이하드/다이하더: 조지 마르살리아가 개발한 널리 사용되는 통계 검정 도구 모음입니다. 다이하더는 업데이트되고 확장된 버전입니다.
  • NIST SP 800-22: 암호화 난수 생성기(RNG)에 대한 표준 테스트 모음으로, FIPS 인증에 필수적입니다. 빈도, 실행 횟수, 스펙트럼 특성 등을 테스트합니다.
  • PractRand: 특히 짧은 주기 또는 불량한 확산 특성을 가진 발전기의 고장을 감지하는 데 탁월합니다.
Do this automatically

Let AutoSEO write & rank this for you — on autopilot

Enter your site: we scan it, build a keyword plan, and publish ranking-ready articles for Google and AI answers. Start for $1.

First 3 articles instantly Cancel anytime in 3 days 30-day money-back

흔히 저지르는 실수들을 피하는 방법

실제 운영 시스템에서 발생하는 대부분의 난수 생성기(RNG) 오류는 소수의 반복적인 오류에서 비롯됩니다. 이러한 오류를 사전에 파악하면 실제 취약점과 통계적 오류를 대부분 예방할 수 있습니다.

실수 1: 보안을 위해 Math.random() 또는 그와 유사한 함수를 사용하는 것

JavaScript의 Math.random() , Python의 random 모듈( secrets 제외), PHP의 rand() 및 이와 유사한 범용 함수들은 암호화 용도로 사용하기에 부적합하다고 명시적으로 문서화되어 있습니다. 이러한 함수들은 예측 불가능성보다 속도를 우선시합니다. 충분한 출력값을 관찰할 수 있는 공격자는 단 624개의 연속적인 32비트 출력값만으로 메르센 트위스터의 내부 상태를 재구성하고 미래의 모든 값을 예측할 수 있습니다. 이러한 공격은 실제 도박 플랫폼에서 시연된 바 있습니다.

두 번째 실수: 세션 간에 동일한 시드 값을 재사용하는 것

웹 애플리케이션이 세션 토큰 생성기에 서버 프로세스 ID 또는 시작 타임스탬프를 시드 값으로 사용하는 경우, 동일한 초에 생성된 모든 세션 토큰은 동일한 시드를 공유하게 됩니다. 이는 이론적인 문제가 아니라, 실제 운영 환경에서 세션 하이재킹 취약점의 근본 원인으로 작용해 왔습니다.

세 번째 실수: 필요한 엔트로피에 비해 너무 적은 비트를 생성함

6자리 PIN은 대략 20비트의 엔트로피를 가지고 있습니다. UUID v4는 122비트입니다. 암호화 키는 대칭 암호화를 위해 최소 128비트, 향후 하드웨어 변화에 대한 장기적인 보안을 위해서는 256비트가 필요합니다. 짧은 토큰을 생성하고 추측이 불가능하다고 가정하는 것은 구현상의 세부 사항이 아니라 구조적인 결함입니다.

실수 4: 플랫폼별 동작 방식을 무시하는 것

  • 일부 구형 Linux 커널에서는 엔트로피 풀이 고갈되면 /dev/random 에서 읽기 작업이 차단됩니다. 하지만 /dev/urandom 차단되지 않으며 초기 부팅 후에는 대부분의 암호화 용도로 안전하게 사용할 수 있습니다.
  • 가상 머신은 물리적 머신에 비해 하드웨어 이벤트 다양성이 부족하기 때문에 시작 시 엔트로피가 낮을 수 있습니다. 가상 머신 인스턴스 생성 직후 시딩을 수행하면 취약한 키가 생성될 수 있습니다.
  • 일부 임베디드 시스템에는 하드웨어 난수 생성기가 전혀 없습니다. 개발자들은 때때로 겉보기보다 훨씬 약한 소프트웨어 기반의 엔트로피 소스에 의존해야 합니다.

실수 5: 검증 없이 무작위로 섞인 출력을 균일한 난수로 취급하는 것

만약 기본 난수 생성기의 주기가 데이터 세트의 가능한 순열 수보다 짧다면, 모든 순열을 생성할 수 없습니다. 표준 52장 카드 덱은 52! ≈ 2²²⁶ 가지의 가능한 순서를 가지고 있습니다. 32비트 시드를 사용하는 생성기는 최대 2³² ≈ 40억 개의 서로 다른 순서를 생성할 수 있는데, 이는 가능한 모든 순서의 극히 작은 부분에 불과합니다. 실제 판돈이 걸린 카드 게임에서 이는 구체적이고 악용 가능한 약점입니다.

실수 6: 독립성과 획일성을 혼동하는 것

연속적인 추출값들 사이에 높은 상관관계를 가지면서도, 각 값이 동일한 빈도로 나타나는 균일 분포를 보이는 경우가 있습니다. 품질이 낮은 많은 선형 확률 그래프(LCG)는 빈도 테스트는 통과하지만, 연속적인 값들이 다차원 공간에서 소수의 초평면(hyperplane)에 분포하기 때문에 스펙트럼 테스트는 통과하지 못합니다. LCG의 격자 구조라고 알려진 이러한 현상 때문에 LCG는 다차원 몬테카를로 적분에 적합하지 않습니다.

프로그래밍 언어별 실용적인 전략

파이썬

  • 보안에 민감한 값의 경우 secrets.token_bytes(n) , secrets.token_hex(n) 또는 secrets.randbelow(n) 사용하십시오.
  • 운영체제 엔트로피에 기반한 표준 인터페이스가 필요한 경우 random.Random( random.SystemRandom() random.Random() 사용하십시오.
  • 수치 계산에는 numpy.random.default_rng() 사용하세요. 이 함수는 BigCrush 테스트를 통과하는 최신 고품질 의사 난수 생성기인 PCG64를 기본값으로 사용합니다.

자바스크립트 / Node.js

  • 모든 보안 목적을 위해 crypto.randomBytes(n) 또는 crypto.getRandomValues() (브라우저의 웹 암호화 API)를 사용하십시오.
  • 토큰, ID 또는 공격자가 예측하려고 시도할 수 있는 어떤 것에도 Math.random() 절대 사용하지 마십시오.

자바

  • 암호화 목적으로는 java.security.SecureRandom 사용하십시오. 이 클래스는 한 번만 인스턴스화하고 재사용하십시오. 인스턴스 생성에는 비용이 많이 듭니다.
  • 다중 스레드 환경에서 높은 처리량을 요구하는 비보안 애플리케이션의 경우 ThreadLocalRandom 사용하십시오.
  • 동시 실행 환경에서는 java.util.Random 사용하지 마십시오. 이 함수는 공유 시드를 사용하므로 경쟁 상황에서 충돌이 발생할 수 있습니다.

C / C++

  • C 표준 라이브러리의 rand() 는 사용하지 않는 것이 좋습니다. 이 함수는 구현 정의 함수이며, 종종 취약한 LCG(Long-Term Computing) 방식이고, 스레드 안전성이 보장되지 않습니다.
  • 일반적인 용도로는 std::random_device 로 시드된 <random>std::mt19937 사용하십시오.
  • 암호화 용도로 사용하려면 운영체제 기본 함수를 직접 호출하십시오. Linux에서는 getrandom() , Windows에서는 BCryptGenRandom 사용하십시오.

난수 생성 도구, 소프트웨어 및 자동화

가장 널리 사용되는 난수 생성 도구는 RANDOM.ORG와 같은 브라우저 기반 서비스(대기 잡음에서 엔트로피를 추출함)부터 주요 프로그래밍 언어에 내장된 암호화 라이브러리에 이르기까지 다양합니다. 적합한 도구를 선택하는 것은 사용 사례에 따라 다릅니다. 통계 시뮬레이션에는 속도와 통계적 품질이 필요하고, 보안 애플리케이션에는 암호학적 예측 불가능성이 필요하며, 물리적 실험에는 진정한 하드웨어 기반 난수성이 필요합니다.

브라우저 기반 및 온라인 난수 생성기 도구

온라인 난수 생성 도구는 설치가 필요 없으며 간단한 추첨, 수업 시연 및 빠른 결정에 적합합니다. 가장 평판이 좋은 옵션은 다음과 같습니다.

  • RANDOM.ORG — 대기 전파 잡음을 진정한 엔트로피 소스로 활용합니다. 정수 생성기, 순열 셔플러, 가우스 생성기, 그리고 프로그램 접근을 위한 할당량 기반 API를 제공합니다.
  • 구글에 내장된 난수 생성기(RNG)를 사용 하면, 구글에서 "1에서 100 사이의 난수"를 검색했을 때 시스템 엔트로피를 기반으로 생성된 의사 난수 생성기(PRNG)를 사용하여 즉시 결과를 얻을 수 있습니다.
  • 숫자 선택 휠 도구 — JavaScript의 Math.random() 함수를 내부적으로 사용하는 시각적인 회전 휠 인터페이스로, 교실 수업이나 게임 쇼 스타일의 선택에 적합합니다.
  • 여론조사 및 이름 추첨 방식 — 목록 입력과 무작위 선택을 결합하여 팀 배정, 상품 추첨 및 그룹 의사 결정을 진행합니다.

대부분의 브라우저 도구는 자바스크립트의 Math.random() 은 의사 난수 생성기(PRNG)이며 암호학적으로 안전하지 않습니다. 보안, 토큰 또는 금융 거래와 관련된 모든 경우에는 전용 암호화 도구나 라이브러리를 사용하는 것이 좋습니다.

프로그래밍 언어 라이브러리 및 내장 함수

주요 프로그래밍 언어에는 대부분 하나 이상의 난수 생성기(RNG) 모듈이 포함되어 있습니다. 아래 표는 가장 일반적으로 사용되는 옵션과 해당 보안 등급을 요약한 것입니다.

언어 표준 의사난수 생성기 암호화 난수 생성기 메모
파이썬 랜덤(메르센 트위스터) 비밀, os.urandom() 토큰, 비밀번호, 키에는 비밀 키를 사용하세요.
자바스크립트 수학.랜덤() crypto.getRandomValues() 웹 암호화 API는 모든 최신 브라우저에서 사용할 수 있습니다.
자바 java.util.랜덤 java.security.SecureRandom SecureRandom은 충분한 엔트로피가 확보될 때까지 블록을 생성합니다.
C / C++ rand() 함수 사용 (실제 운영 환경에서는 사용을 피하십시오) /dev/urandom, RDRAND 명령어 rand() 함수는 취약합니다. 중요한 작업에는 운영체제 수준의 엔트로피를 사용하세요.
가다 수학/랜덤 크립토/란드 crypto/rand는 OS CSPRNG에서 직접 값을 읽습니다.
루비 랜덤(MT 기반) SecureRandom SecureRandom은 OpenSSL 또는 /dev/urandom을 래핑합니다.
PHP rand(), mt_rand() random_bytes(), random_int() PHP 7부터 random_int() 함수는 CSPRNG(컴퓨터 지원 의사 난수 생성기)를 사용합니다.

하드웨어 난수 생성기

인증 기관 키 생성, 하드웨어 보안 모듈(HSM) 또는 과학 기기와 같이 최고 품질의 엔트로피가 필요한 애플리케이션의 경우 전용 하드웨어 난수 생성기(HRNG)를 사용할 수 있습니다.

  • Intel RDRAND/RDSEED — 온칩 회로에서 발생하는 열 잡음을 샘플링하는 CPU 수준 명령어로, 아이비 브리지(2012년) 이후 대부분의 최신 x86 프로세서에서 사용할 수 있습니다.
  • 전용 USB HRNG — OneRNG 또는 TrueRNG와 같은 장치는 USB 포트에 연결되어 Linux의 경우 /dev/random 또는 /dev/urandom을 통해 OS 풀에 엔트로피를 공급합니다.
  • HSM(하드웨어 보안 모듈) 은 Thales, Entrust, AWS CloudHSM과 같은 공급업체의 엔터프라이즈급 장치로, 인증된 하드웨어 엔트로피 소스를 사용하여 암호화 키를 생성하고 저장합니다.
  • 양자 난수 생성기(RNG) 서비스 - ID Quantique와 호주국립대학교(ANU)의 클라우드 API는 양자 진공 요동에서 파생된 난수를 제공하며, 비결정적 출력을 보장합니다.

자동화 및 워크플로우 통합

대규모 워크플로(A/B 테스트 파이프라인, 몬테카를로 시뮬레이션, 예약 추첨 또는 무작위 감사 샘플링) 내에서 난수 생성을 자동화하는 데는 일반적으로 다음 세 가지 접근 방식 중 하나가 사용됩니다.

  1. API 통합 — RANDOM.ORG는 진정한 난수 정수, 시퀀스, 문자열 및 UUID를 반환하는 JSON-RPC API를 제공합니다. 인증된 요청을 사용하면 더 높은 할당량을 사용할 수 있으며, 검증 가능한 인증서를 통해 서명된 난수를 생성할 수 있습니다.
  2. CI/CD 파이프라인 시딩 — TestU01 또는 Dieharder와 같은 통계적 테스트 도구를 지속적 통합 파이프라인에서 자동으로 실행하여 사용자 지정 난수 생성기(RNG) 구현이 코드 변경 전반에 걸쳐 통계적 품질을 유지하는지 확인할 수 있습니다.
  3. 플랫폼 기반 스케줄링 — 클라우드 플랫폼(AWS Lambda, Google Cloud Functions, Azure Functions)은 보안 감사를 위해 로그 항목을 무작위로 샘플링하거나 행동 실험에서 매일 무작위로 그룹을 할당하는 등 RNG 기반 프로세스를 예약된 시간에 실행할 수 있습니다.

AutoSEO와 같은 도구는 자동화가 무작위 샘플링에 의존하는 콘텐츠 및 데이터 워크플로까지 확장될 수 있음을 보여줍니다. AutoSEO는 대규모 크롤링 데이터 세트에서 대표적인 페이지 하위 집합을 선택하기 위해 무작위 샘플링 기법을 사용하여 SEO 작업을 식별, 감사 및 우선순위 지정하는 프로세스를 자동화합니다. 이를 통해 품질 검사가 편향되지 않고 트래픽이 많은 동일한 페이지만 감사하는 데서 발생하는 체계적인 사각지대가 없도록 보장합니다. 이는 무작위 대조 시험에서 사용되는 논리와 동일합니다. 선택 프로세스에 구조화된 무작위성을 도입함으로써 AutoSEO는 결정론적 규칙 기반 감사 도구보다 통계적으로 더 유효한 사이트 상태 평가를 제공합니다.

난수 생성기의 품질과 성공 여부를 측정하는 방법

우수한 난수 생성기는 균일성, 독립성 및 예측 불가능성에 대한 통계적 테스트를 통과해야 합니다. 주요 기준은 실제 테스트 모음, 이론적 주기 분석, 그리고 암호화 난수 생성기의 경우 상태 재구성 공격에 대한 저항성입니다.

통계 테스트 스위트

유한한 수열이 완전히 무작위적이라는 것을 증명할 수는 없지만, 수열이 무작위적이지 않은지 여부를 탐지할 수 있습니다. 가장 권위 있는 테스트 도구는 다음과 같습니다.

  • NIST SP 800-22 — 미국 국립표준기술연구소(NIST)에서 발표한 15가지 통계 테스트 모음으로, 암호화 인증을 위해 제출된 난수 생성기(RNG)를 평가하는 데 사용됩니다. 테스트에는 빈도 테스트, 실행 테스트, 스펙트럼(DFT) 테스트 및 직렬 테스트가 포함됩니다.
  • TestU01(BigCrush) — 몬트리올 대학교에서 개발된 BigCrush는 공개적으로 사용 가능한 통계 테스트 모음 중 가장 까다로운 테스트입니다. LCG 및 기존 Wichmann-Hill 생성기와 같은 알고리즘은 이 테스트를 통과하지 못하지만, Xoshiro256** 및 PCG는 통과합니다.
  • Dieharder 는 George Marsaglia의 오리지널 Diehard 배터리를 기반으로 하는 오픈 소스 확장 프로그램으로, 대규모 발전기 출력 샘플에 대해 100가지 이상의 테스트를 수행했습니다.
  • PractRand — 매우 큰 표본 크기(테라바이트 규모의 출력)까지 확장 가능하며, 소규모 표본 테스트에서는 감지할 수 없는 미묘한 편향을 탐지할 수 있는 최신 테스트 도구 모음입니다.

주요 품질 지표

  • 주기 길이 — 시퀀스가 반복되기 전에 생성되는 값의 개수입니다. 메르센 트위스터의 주기는 2¹⁹⁹³⁷⁻¹ 이며, 이는 거의 모든 비암호화 응용 분야에 충분합니다.
  • 균등 분포 — 값이 1차원, 2차원 및 고차원 투영에서 출력 범위 전체에 걸쳐 균일하게 분포되어 있는지 여부.
  • 종자 민감도 — 종자의 작은 변화가 완전히 다른 출력 시퀀스를 생성하는지 여부 (시뮬레이션 재현성에 중요).
  • 처리량 — 초당 수십억 개의 숫자를 처리하는 MB/s 단위의 출력 속도로, 고성능 몬테카를로 워크로드에 중요합니다.
  • 순방향 및 역방향 비밀성 — CSPRNG의 경우, 시간 T에 출력을 관찰한 공격자가 과거 또는 미래 출력을 재구성할 수 있는지 여부입니다. 이는 관찰된 비트로부터 상태를 재구성하려는 시도를 통해 검증됩니다.

실제 적용 맥락에서의 성공 측정

기술적 품질 외에도 성공 지표는 배포 환경에 따라 달라집니다.

  • 복권 및 추첨 — 감사 추적, 제3자 검증, 그리고 서명된 무작위성 인증서(RANDOM.ORG에서 제공)는 참가자에게 공정성을 보장합니다.
  • 암호화 애플리케이션 — FIPS 140-3 또는 공통 기준 인증 준수는 엔트로피 소스와 CSPRNG가 정부 및 산업 표준을 충족함을 확인시켜 줍니다.
  • 과학적 시뮬레이션 — 재현성(동일한 시드 값을 사용했을 때 동일한 결과가 생성됨) 및 시뮬레이션에 사용된 샘플 크기에서 BigCrush 또는 PractRand 테스트를 통과할 수 있는 능력.
  • A/B 테스트 — 균형 검사를 통해 실험 전 공변량에 대해 처리군과 대조군이 통계적으로 동등한지 확인하여 무작위 배정이 편향되지 않았음을 검증합니다.

자주 묻는 질문

진정한 난수 생성기와 의사 난수 생성기의 차이점은 무엇입니까?

진정한 난수 생성기(TRNG)는 열 잡음, 방사성 붕괴 또는 대기 전파 잡음과 같은 물리적이고 예측 불가능한 과정에서 난수를 생성하여 진정으로 비결정적인 결과를 출력합니다. 의사 난수 생성기(PRNG)는 초기값을 시드(seed)로 사용하는 결정론적 수학적 알고리즘을 사용합니다. 동일한 시드를 사용하면 항상 동일한 시퀀스를 생성합니다. PRNG는 속도가 빠르고 재현성이 뛰어나 시뮬레이션 및 게임에 적합합니다. TRNG는 속도는 느리지만 암호화 키 생성과 같이 예측 불가능성이 보안 요구 사항인 경우에 필요합니다.

자바스크립트의 Math.random() 함수는 보안 측면에서 안전하게 사용할 수 있을까요?

아니요. JavaScript의 Math.random() 은 암호학적으로 안전하지 않다고 명시적으로 문서화된 의사난수 생성기(PRNG)입니다. 내부 상태는 출력 결과를 통해 재구성될 가능성이 있으므로, 암호, 세션 토큰, API 키 또는 공격자가 출력 결과를 추측하여 피해를 줄 수 있는 값을 생성하는 데 절대 사용해서는 안 됩니다. 브라우저에서 보안에 민감한 애플리케이션을 실행할 때는 운영 체제의 컴퓨터 지원 의사난수 생성기(CSPRNG)를 사용하는 웹 암호화 API의 crypto.getRandomValues() 를 사용하십시오.

난수 생성기는 정말 예측 불가능할 수 있을까요?

양자 현상(예: 광자 도착 시간 또는 양자 진공 요동)에서 생성되는 하드웨어 기반 TRNG는 양자 역학에 따라 근본적으로 예측 불가능한 것으로 간주됩니다. 즉, 어떤 알고리즘이나 추가 정보도 관찰자가 그 출력을 우연보다 더 정확하게 예측할 수 있도록 해주지 않습니다. PRNG와 대부분의 소프트웨어 CSPRNG는 표준 암호화 가정 하에서 계산적으로 예측 불가능합니다. 이는 실질적으로는 안전하지만 절대적인 물리적 의미에서 예측 불가능하다는 것을 증명할 수는 없다는 것을 의미합니다.

시드(seeding)는 난수 생성기에 어떤 영향을 미치나요?

시드는 의사난수 생성기(PRNG) 알고리즘에 입력되는 초기 값입니다. 동일한 시드를 사용하면 항상 동일한 난수 시퀀스가 생성되는데, 이는 실험의 재현성을 보장하는 과학 컴퓨팅의 중요한 특징입니다. 현재 초 단위의 시간만을 엔트로피 소스로 사용하는 것과 같이 부적절한 시드는 공격자가 모든 가능한 시드를 열거할 수 있게 하여 실질적인 난수성을 크게 저하시킵니다. 좋은 시드는 여러 엔트로피 소스를 결합하는 방식으로 생성됩니다. 예를 들어, 나노초 단위의 현재 시간, 프로세스 ID, 메모리 주소, 그리고 Windows의 경우 /dev/urandom 또는 CryptGenRandom에서 제공하는 운영체제 제공 엔트로피 등을 활용할 수 있습니다.

파이썬의 random 모듈은 어떤 난수 생성기를 사용하나요?

Python의 random 모듈은 2¹⁹⁹⁸⁷⁻¹ 의 주기를 가지며 대부분의 통계적 검증을 통과하는 Mersenne Twister 알고리즘(MT19937)을 사용합니다. 이 알고리즘은 시뮬레이션, 게임 및 통계적 샘플링에 적합합니다. 그러나 암호학적으로 안전하지 않습니다. 624개의 연속된 32비트 출력을 관찰하면 내부 상태를 재구성할 수 있습니다. Python에서 보안에 민감한 작업을 수행하려면 os.urandom() 을 기반으로 하고 운영체제 수준의 CSPRNG를 사용하는 secrets 모듈을 사용하는 것이 좋습니다.

컴퓨터 없이 난수를 생성하는 방법은 무엇일까요?

컴퓨터가 발명되기 전에는 주사위를 굴리거나, 회전하는 드럼에서 번호가 적힌 공을 뽑거나, 동전을 던지거나, 카드를 섞는 등의 물리적인 방법으로 난수를 생성했습니다. 랜드 연구소는 1955년에 전자 룰렛 휠을 이용해 생성한 난수를 다룬 유명한 책, "10만 개의 정규분포를 따르는 백만 개의 난수(A Million Random Digits with 100,000 Normal Deviates)" 를 출간했습니다. 난수 통계표는 설문 조사 표본 추출과 임상 시험에 널리 사용되었습니다. 오늘날에도 일부 규제된 복권이나 교육 현장 시연에서는 수동 방식이 여전히 사용되고 있지만, 전자 방식보다 속도가 느리고 감사가 어렵다는 단점이 있습니다.

난수 생성기는 왜 테스트가 필요할까요?

무작위처럼 보이는 출력을 생성하도록 설계된 알고리즘조차도 미묘한 편향, 특정 차원에서의 짧은 주기, 또는 일반적인 관찰로는 보이지 않지만 통계적 테스트를 통해 감지할 수 있는 연속적인 값 사이의 상관관계를 포함할 수 있습니다. 이러한 결함은 시뮬레이션 결과를 무효화하고, 암호 시스템의 보안을 저하시키거나, 게임이나 복권에 불공정성을 초래할 수 있습니다. NIST SP 800-22, BigCrush, PractRand와 같은 테스트 도구를 사용하면 배포 전에 이러한 문제를 발견할 수 있습니다. PHP의 초기 mt_rand() 함수나 2008년 데비안 OpenSSL 버그와 같은 결함 있는 난수 생성기의 사례는 테스트되지 않은 난수 생성기가 실제 보안 문제를 야기할 수 있음을 보여줍니다.

암호학적으로 안전한 의사난수 생성기(CSPRNG)란 무엇입니까?

CSPRNG(Complete System Predictive Nangest)는 통계적 품질 외에 두 가지 추가 보안 요구 사항을 충족하는 의사 난수 생성기입니다. 첫째는 차기 비트 테스트 (이전의 모든 비트가 주어졌을 때 어떤 알고리즘도 다음 비트를 50%보다 유의미하게 높은 확률로 예측할 수 없음)이고, 둘째는 상태 손상 확장 저항성 (공격자가 시점 T의 내부 상태를 알게 되더라도 T 이전의 출력을 재구성할 수 없음)입니다. 최신 CSPRNG에는 ChaCha20 기반 생성기(리눅스 커널 4.8부터 /dev/urandom에서 사용됨), Fortuna(macOS 및 iOS에서 사용됨), CTR_DRBG(NIST SP 800-90A에서 표준화됨) 등이 있습니다.

난수 생성기는 중복된 값을 생성할 수 있습니까?

네, 그리고 이는 예상되는 동작입니다. 진정한 난수 생성 과정은 과거 출력값을 기억하지 않기 때문에 중복이 발생하는 것은 자연스러운 현상입니다. 이는 확률 이론의 생일 문제로 설명됩니다. 1부터 N까지 균일하게 값을 추출하는 경우, 대략 √N개의 값이 추출되면 중복이 발생할 가능성이 높아집니다. 만약 애플리케이션에서 고유한 값이 필요한 경우(예: 고유 ID 할당 또는 중복 없이 카드 덱 섞기), 난수 생성기의 출력값에 의존하여 충돌을 방지하는 대신, 미리 정의된 값 집합에 Fisher-Yates와 같은 셔플 알고리즘을 적용하거나, 이미 사용된 값 집합을 유지하고 중복을 제거하는 방식을 사용하는 것이 좋습니다.

온라인 복권 및 경품 추첨 도구는 어떻게 공정성을 보장합니까?

신뢰할 수 있는 온라인 추첨 도구는 다음과 같은 요소들을 통해 공정성을 보장합니다. 고품질 엔트로피 소스(이상적으로는 Math.random()이 아닌 TRNG) 사용, 추첨 전에 알고리즘과 시드를 공개하여 결과의 독립적인 검증을 가능하게 함, 추첨 마감 전에 숫자가 생성되었음을 증명하는 서명된 난수성 인증서 제공, 그리고 독립 감사관 입회 하에 추첨 진행. RANDOM.ORG는 각 추첨에 타임스탬프를 찍고 암호화 서명을 하여 감사 가능한 기록을 생성하는 제3자 추첨 서비스를 제공합니다. 규제 대상 복권의 경우, 국가 게임 당국은 시스템 가동 전에 인증된 하드웨어 RNG와 독립 테스트 연구소의 승인을 요구합니다.

Stop doing SEO by hand

Put your SEO on autopilot — your first 3 articles for $1

Auto SEO scans your site, builds a content plan, and writes ranking-ready articles automatically. Start your $1 trial — the AI writes your first 3 the moment you begin. Cancel anytime in 3 days.

2,147+ businesses · Cancel anytime · No lock-in

난수 생성기 - 즉시, 무료로, 진정한 무작위 생성