ex)
rand() (C/C++)
random() (Python)
UUID.randomUUID() (Java, SecureRandom 기반)
수학적 알고리즘을 사용하여 난수를 생성(예측 가능성 존재)
같은 seed(초기값) 를 사용하면 동일한 숫자 패턴이 반복됨
하드웨어 기반의 난수 생성기
물리적 현상(전자기 노이즈, 방사능 붕괴, 양자 효과 등)을 활용하여 난수를 생성(예측 불가능)
ex)
nrfx_rng (Nordic MCU 하드웨어 기반 RNG)
secrets (Python, 보안 난수 생성)
💡일반적인 난수는 rand()나 random()으로 충분하지만, 보안이 중요한 경우 secrets 또는 저전력이 중요한 경우(CPU 개입 X) nrfx_rng 같은 TRNG를 사용해야 한다
nrfx_rng 를 사용해 5개의 랜덤값 생성
#include <nrfx_example.h> // NRFX 예제 관련 공통 설정 포함 #include <nrfx_rng.h> // NRFX RNG 드라이버 사용을 위한 헤더
#define NRFX_LOG_MODULE EXAMPLE // 로그 모듈 이름을 `EXAMPLE`로 설정 #define NRFX_EXAMPLE_CONFIG_LOG_ENABLED 1 // 로그 시스템 활성화 #define NRFX_EXAMPLE_CONFIG_LOG_LEVEL 3 // 로그 레벨을 INFO(3)로 설정 #include <nrfx_log.h> // NRFX 로그 기능 헤더 파일 포함
#define RNG_ITERATIONS 5UL // 랜덤 값 5개만 생성하도록 설정 (UL은 부호 없는 정수)
static void rng_handler(uint8_t rng_data) // 랜덤 값이 생성될 때마다 실행되는 이벤트 핸들러 함수 { // rng_data: RNG 하드웨어가 생성한 8비트 무작위 값(0~255) // 랜덤 값 생성 횟수를 저장하는 정적 변수 static uint32_t i = 0; if (i < RNG_ITERATIONS) // 5번 미만일 경우 { NRFX_LOG_INFO("Generated value: %d", rng_data); // 생성된 랜덤 값을 로그 출력 i++; } else { nrfx_rng_stop(); } }
int main(void) { nrfx_err_t status; // NRFX 드라이버 함수가 반환하는 오류 상태를 저장하는 변수 (void)status; // 사용되지 않는 status 변수에 대한 경고를 방지
#if defined(__ZEPHYR__) // NRF RNG(하드웨어 난수 생성기)의 인터럽트를 Zephyr RTOS에서 사용할 수 있도록 설정 IRQ_CONNECT(NRFX_IRQ_NUMBER_GET(NRF_RNG), IRQ_PRIO_LOWEST, nrfx_rng_irq_handler, 0, 0); #endif

프로그램에 이미 IRQ가 정의되어 있어서 실습에서는 주석처리 함
NRFX_EXAMPLE_LOG_INIT(); // NRFX 로그 시스템 초기화 NRFX_LOG_INFO("Starting nrfx_rng example:"); NRFX_EXAMPLE_LOG_PROCESS(); // 로그 처리를 위해 NRFX 로그 시스템을 실행
nrfx_rng_config_t config = NRFX_RNG_DEFAULT_CONFIG; // 기본 RNG 설정 값 로드 status = nrfx_rng_init(&config, rng_handler); // RNG 드라이버 초기화 함수 NRFX_ASSERT(status == NRFX_SUCCESS); // RNG 초기화가 실패하면 프로그램을 중지 nrfx_rng_start(); // RNG 하드웨어를 활성화하여 랜덤 숫자 생성 시작
while (1) // 로그 처리를 계속 유지하기 위한 무한 루프 { NRFX_EXAMPLE_LOG_PROCESS(); // 로그 메시지를 처리하고, UART나 RTT 같은 출력 장치로 데이터를 전송하는 역할 } }