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의 하드웨어 가속을 활용하면 보다 빠르고 안전한 암호화 연산이 가능하므로, 이를 적극 활용해 보시기 바랍니다.
'ESP32 IDF' 카테고리의 다른 글
ESP32와 서버 간 안전한 통신 구축 (TLS/SSL 활용) (0) | 2025.02.28 |
---|---|
ESP32 IDF 펌웨어 무결성을 보호하는 방법 (0) | 2025.02.28 |
ESP32 난수 생성과 시드(seed) 관리 방법 (0) | 2025.02.28 |
ESP32 HMAC 소개 및 메시지 무결성을 위한 HMAC 활용법 (0) | 2025.02.27 |
ESP32 IDF에서 SHA-256, SHA-512 등 해싱 알고리즘 사용법 (0) | 2025.02.27 |