ESP32 IDF

ESP32 ECDSA를 이용한 서명 생성과 검증

임베디드 친구 2025. 2. 28. 09:00
728x90
반응형

ESP32 ECDSA를 이용한 서명 생성과 검증

ESP32는 강력한 보안 기능을 제공하며, 그중 하나가 ECDSA(Elliptic Curve Digital Signature Algorithm)를 이용한 디지털 서명입니다. 본 포스팅에서는 ESP32 IDF를 활용하여 ECDSA 서명을 생성하고 검증하는 방법을 설명합니다.

1. ECDSA 개요

ECDSA(Elliptic Curve Digital Signature Algorithm)는 타원 곡선 암호(ECC, Elliptic Curve Cryptography)를 기반으로 한 디지털 서명 알고리즘입니다. ECDSA는 다음과 같은 특징을 가집니다.

  • 고속 연산: RSA에 비해 작은 키 크기로 동일한 보안성을 제공하며 연산 속도가 빠릅니다.
  • 서명 생성: 개인 키를 사용하여 특정 데이터에 대한 서명을 생성합니다.
  • 서명 검증: 공개 키를 사용하여 서명의 유효성을 확인할 수 있습니다.
  • 무결성 보장: 데이터가 변조되지 않았음을 증명할 수 있습니다.

ESP32는 하드웨어 가속을 이용하여 ECDSA 연산을 효율적으로 수행할 수 있습니다.

2. ESP32에서 ECDSA 사용 준비

ESP32 IDF에서는 mbedtls 라이브러리를 사용하여 ECDSA 서명과 검증을 수행할 수 있습니다. 먼저, 필요한 헤더 파일을 포함해야 합니다.

#include <stdio.h>
#include "mbedtls/ecdsa.h"
#include "mbedtls/ecp.h"
#include "mbedtls/sha256.h"
#include "mbedtls/md.h"
#include "mbedtls/ctr_drbg.h"
#include "mbedtls/entropy.h"

2.1 랜덤 숫자 생성기 초기화

ECDSA에서 키 생성 및 서명 과정에는 안전한 난수가 필요합니다. 이를 위해 mbedtls의 난수 생성기를 초기화합니다.

mbedtls_entropy_context entropy;
mbedtls_ctr_drbg_context ctr_drbg;
const char *pers = "ecdsa_demo";

mbedtls_entropy_init(&entropy);
mbedtls_ctr_drbg_init(&ctr_drbg);
mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, (const unsigned char *)pers, strlen(pers));

3. ECDSA 키 페어 생성

ECDSA 서명을 생성하려면 먼저 키 쌍(개인 키, 공개 키)을 생성해야 합니다.

mbedtls_ecp_group grp;
mbedtls_ecp_point Q;
mbedtls_mpi d;

mbedtls_ecp_group_init(&grp);
mbedtls_ecp_point_init(&Q);
mbedtls_mpi_init(&d);

// 타원 곡선 SECP256R1 사용
mbedtls_ecp_group_load(&grp, MBEDTLS_ECP_DP_SECP256R1);

// 개인 키 생성
mbedtls_ecp_gen_keypair(&grp, &d, &Q, mbedtls_ctr_drbg_random, &ctr_drbg);

4. 메시지 해싱 및 서명 생성

ECDSA 서명은 해시된 데이터에 대해 생성됩니다. 일반적으로 SHA-256을 사용합니다.

unsigned char hash[32];
const char *message = "Hello, ESP32!";

mbedtls_sha256((const unsigned char *)message, strlen(message), hash, 0);

// 서명 생성
mbedtls_mpi r, s;
mbedtls_mpi_init(&r);
mbedtls_mpi_init(&s);

mbedtls_ecdsa_sign(&grp, &r, &s, &d, hash, sizeof(hash), mbedtls_ctr_drbg_random, &ctr_drbg);

5. 서명 검증

서명을 검증하기 위해서는 공개 키와 원본 해시 값이 필요합니다.

int ret = mbedtls_ecdsa_verify(&grp, hash, sizeof(hash), &Q, &r, &s);
if (ret == 0) {
    printf("서명 검증 성공\n");
} else {
    printf("서명 검증 실패\n");
}

6. 코드 전체 예제

아래는 ECDSA 서명 생성 및 검증을 수행하는 전체 코드입니다.

#include <stdio.h>
#include "mbedtls/ecdsa.h"
#include "mbedtls/ecp.h"
#include "mbedtls/sha256.h"
#include "mbedtls/md.h"
#include "mbedtls/ctr_drbg.h"
#include "mbedtls/entropy.h"

int main() {
    mbedtls_entropy_context entropy;
    mbedtls_ctr_drbg_context ctr_drbg;
    mbedtls_ecp_group grp;
    mbedtls_ecp_point Q;
    mbedtls_mpi d, r, s;
    unsigned char hash[32];
    const char *message = "Hello, ESP32!";

    // 난수 생성기 초기화
    mbedtls_entropy_init(&entropy);
    mbedtls_ctr_drbg_init(&ctr_drbg);
    mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, NULL, 0);

    // 키 생성
    mbedtls_ecp_group_init(&grp);
    mbedtls_ecp_point_init(&Q);
    mbedtls_mpi_init(&d);
    mbedtls_mpi_init(&r);
    mbedtls_mpi_init(&s);

    mbedtls_ecp_group_load(&grp, MBEDTLS_ECP_DP_SECP256R1);
    mbedtls_ecp_gen_keypair(&grp, &d, &Q, mbedtls_ctr_drbg_random, &ctr_drbg);

    // 메시지 해싱
    mbedtls_sha256((const unsigned char *)message, strlen(message), hash, 0);

    // 서명 생성
    mbedtls_ecdsa_sign(&grp, &r, &s, &d, hash, sizeof(hash), mbedtls_ctr_drbg_random, &ctr_drbg);

    // 서명 검증
    if (mbedtls_ecdsa_verify(&grp, hash, sizeof(hash), &Q, &r, &s) == 0) {
        printf("서명 검증 성공\n");
    } else {
        printf("서명 검증 실패\n");
    }

    // 정리
    mbedtls_ecp_group_free(&grp);
    mbedtls_ecp_point_free(&Q);
    mbedtls_mpi_free(&d);
    mbedtls_mpi_free(&r);
    mbedtls_mpi_free(&s);

    return 0;
}

7. 마무리

본 포스팅에서는 ESP32에서 ECDSA를 활용하여 서명을 생성하고 검증하는 방법을 설명하였습니다. ECDSA는 보안성이 뛰어나며, IoT 환경에서 안전한 데이터 전송 및 인증을 수행하는 데 유용하게 활용될 수 있습니다. ESP32의 하드웨어 가속을 활용하면 보다 빠르고 안전한 암호화 연산이 가능하므로, 이를 적극 활용해 보시기 바랍니다.

728x90
반응형