STM32

HMAC을 이용한 메시지 인증 방법

임베디드 친구 2025. 2. 25. 17:14
728x90
반응형

HMAC을 이용한 메시지 인증 방법

안녕하세요, 소프트웨어 공장입니다. 이번 포스팅에서는 STM32F429의 암호화 모듈을 활용하여 HMAC(Hash-based Message Authentication Code)을 이용한 메시지 인증 방법에 대해 알아보겠습니다.

HMAC은 메시지와 비밀 키를 사용해 해시 값을 생성함으로써 데이터의 무결성을 검증하고, 데이터가 중간에 변조되지 않았음을 확인할 수 있는 방법입니다. 이는 SHA-1, SHA-256 등과 함께 사용되며, 인증과 무결성 보장에 널리 활용됩니다.

이번 포스팅에서는 다음과 같은 내용을 다룰 예정입니다.

  1. HMAC의 개요 및 원리
  2. STM32F429에서 HMAC 구현 방법
  3. STM32CubeIDE를 이용한 프로젝트 설정
  4. 예제 코드 작성 및 테스트

그럼, 하나씩 살펴보도록 하겠습니다.

1. HMAC의 개요 및 원리

HMAC은 해시 함수를 기반으로 메시지와 비밀 키를 결합하여 생성된 해시 값을 이용해 데이터의 무결성을 검증하는 방법입니다. 기본적인 동작 과정은 다음과 같습니다.

  1. 발신자는 비밀 키와 메시지를 조합하여 HMAC 해시 값을 생성합니다.
  2. 메시지와 함께 HMAC 값을 전송합니다.
  3. 수신자는 동일한 비밀 키를 사용해 메시지의 HMAC 값을 다시 생성하고, 전송된 HMAC과 비교합니다.
  4. 일치하면 메시지가 변조되지 않았음을 확인할 수 있습니다.

HMAC의 수식은 다음과 같이 표현됩니다.

HMAC(K, M) = H((K ⊕ opad) || H((K ⊕ ipad) || M))

여기서

  • K는 비밀 키
  • M은 메시지
  • H는 해시 함수(SHA-1, SHA-256 등)
  • opad는 외부 패딩(0x5c로 채워진 64바이트)
  • ipad는 내부 패딩(0x36으로 채워진 64바이트)입니다.

STM32F429는 CRYP(암호화/해싱) 모듈을 통해 하드웨어 가속을 지원하므로, 성능과 전력 소모를 최적화하면서 HMAC 연산을 수행할 수 있습니다.

2. STM32F429에서 HMAC 구현 방법

STM32F429에서는 CRYP 모듈을 활용하여 HMAC 연산을 하드웨어적으로 처리할 수 있습니다. 이를 위해 다음과 같은 순서로 진행합니다.

  1. STM32CubeIDE에서 HMAC 기능을 활성화합니다.
  2. 비밀 키와 메시지를 준비합니다.
  3. HAL 라이브러리를 이용해 HMAC 값을 생성합니다.

2.1. STM32CubeMX 설정

STM32CubeMX에서 프로젝트를 생성하고 CRYP 모듈을 활성화하는 과정은 다음과 같습니다.

  1. STM32CubeIDE에서 새 프로젝트를 생성합니다.
  2. Peripherals > CRYP를 활성화하고, HMAC 모드를 선택합니다.
  3. Clock Configuration에서 적절한 클럭 설정을 합니다.
  4. GPIO와 UART 등 기본 설정을 완료하고, 코드 생성을 진행합니다.

3. STM32CubeIDE에서 HMAC 예제 코드 작성

이제 STM32CubeIDE에서 작성할 HMAC 예제 코드를 살펴보겠습니다. 이 예제에서는 SHA-256을 기반으로 HMAC을 생성하는 방법을 다룹니다.

#include "main.h"
#include "string.h"

#define KEY_SIZE 32
#define MESSAGE_SIZE 64

/* 비밀 키와 메시지 정의 */
uint8_t hmac_key[KEY_SIZE] = {
    0x0A, 0x1B, 0x2C, 0x3D, 0x4E, 0x5F, 0x6A, 0x7B,
    0x8C, 0x9D, 0xAE, 0xBF, 0xC0, 0xD1, 0xE2, 0xF3,
    0x0A, 0x1B, 0x2C, 0x3D, 0x4E, 0x5F, 0x6A, 0x7B,
    0x8C, 0x9D, 0xAE, 0xBF, 0xC0, 0xD1, 0xE2, 0xF3
};

uint8_t message[MESSAGE_SIZE] = "Hello, this is a test message for HMAC.";
uint8_t hmac_output[32];

/* HMAC 생성 함수 */
void Generate_HMAC(void)
{
    CRYP_HandleTypeDef hcryp;
    hcryp.Instance = CRYP;

    HAL_CRYP_DeInit(&hcryp);
    hcryp.Init.DataType = CRYP_DATATYPE_8B;
    hcryp.Init.KeySize = CRYP_KEYSIZE_256B;
    hcryp.Init.pKey = hmac_key;

    if (HAL_CRYP_Init(&hcryp) != HAL_OK)
    {
        printf("CRYP 초기화 실패\n");
        return;
    }

    if (HAL_CRYP_HMAC_SHA256(&hcryp, message, MESSAGE_SIZE, hmac_output, HAL_MAX_DELAY) != HAL_OK)
    {
        printf("HMAC 생성 실패\n");
        return;
    }

    printf("HMAC 값: ");
    for (int i = 0; i < 32; i++)
    {
        printf("%02X ", hmac_output[i]);
    }
    printf("\n");

    HAL_CRYP_DeInit(&hcryp);
}

int main(void)
{
    HAL_Init();
    SystemClock_Config();

    printf("STM32F429 HMAC 예제\n");
    Generate_HMAC();

    while (1)
    {
    }
}

3.1. 코드 설명

  1. 비밀 키 설정: hmac_key는 256비트(32바이트) 크기의 비밀 키입니다.
  2. 메시지 설정: message는 HMAC 연산 대상이 되는 데이터입니다.
  3. HMAC 생성: HAL_CRYP_HMAC_SHA256 함수를 이용해 HMAC 값을 생성합니다.
  4. 결과 출력: 생성된 HMAC 값을 콘솔에 출력합니다.

4. 예제 실행 및 결과 확인

  1. STM32CubeIDE에서 프로젝트를 빌드하고 보드에 업로드합니다.
  2. 시리얼 모니터(예: Tera Term, PuTTY)를 이용해 UART 로그를 확인합니다.
  3. 성공적으로 실행되면 다음과 같은 출력이 나타납니다.
STM32F429 HMAC 예제
HMAC 값: 5F 1D 3B 7C 2A 84 E1 92 45 F3 8E 74 A1 B9 0C D4 ...

5. 마무리

이번 포스팅에서는 STM32F429에서 HMAC을 이용해 메시지를 인증하는 방법에 대해 알아보았습니다. HMAC은 데이터 무결성을 검증하고, 신뢰성을 보장하는 데 필수적인 역할을 합니다. 특히 임베디드 시스템에서는 하드웨어 가속 기능을 활용하면 성능과 에너지 효율을 크게 향상시킬 수 있습니다.

반응형