nrfx - TRNG (True Random Number Generator)

모코코개발자·2025년 1월 30일

nrfx

목록 보기
3/3
post-thumbnail

PRNG vs TRNG

PRNG (Pseudo-Random Number Generator)

  • 소프트웨어 기반의 난수 생성기

ex)
rand() (C/C++)
random() (Python)
UUID.randomUUID() (Java, SecureRandom 기반)

  • 수학적 알고리즘을 사용하여 난수를 생성(예측 가능성 존재)

  • 같은 seed(초기값) 를 사용하면 동일한 숫자 패턴이 반복됨

TRNG (True Random Number Generator)

  • 하드웨어 기반의 난수 생성기

  • 물리적 현상(전자기 노이즈, 방사능 붕괴, 양자 효과 등)을 활용하여 난수를 생성(예측 불가능)

ex)
nrfx_rng (Nordic MCU 하드웨어 기반 RNG)
secrets (Python, 보안 난수 생성)

💡일반적인 난수는 rand()random()으로 충분하지만, 보안이 중요한 경우 secrets 또는 저전력이 중요한 경우(CPU 개입 X) nrfx_rng 같은 TRNG를 사용해야 한다

실습

nrfx_rng 를 사용해 5개의 랜덤값 생성

1️⃣ 헤더 파일 포함 (필요한 라이브러리 불러오기)

#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은 부호 없는 정수)

2️⃣ RNG 이벤트 핸들러

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();
    }
}

3️⃣ main() 함수 시작

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가 정의되어 있어서 실습에서는 주석처리 함

4️⃣ NRFX 로그 시스템 초기화 및 실행 정보 출력

  NRFX_EXAMPLE_LOG_INIT();  // NRFX 로그 시스템 초기화
  NRFX_LOG_INFO("Starting nrfx_rng example:");
  NRFX_EXAMPLE_LOG_PROCESS();  // 로그 처리를 위해 NRFX 로그 시스템을 실행

5️⃣ NRFX RNG 드라이버 설정 및 초기화

 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 같은 출력 장치로 데이터를 전송하는 역할
  }
}
profile
모코코개발자

0개의 댓글