ESP32 IDF에서 RSA 암호화 활용하기
ESP32는 보안이 중요한 다양한 임베디드 애플리케이션에서 사용되며, Espressif의 ESP-IDF(ESP32 IoT Development Framework)를 통해 강력한 암호화 기능을 제공합니다. 이번 포스팅에서는 ESP32에서 RSA를 사용하는 방법을 설명하고, RSA 키 쌍을 생성하고 암호화 및 복호화를 수행하는 방법을 예제 코드와 함께 소개하겠습니다.
1. RSA 암호화 개요
RSA는 Rivest, Shamir, Adleman이 개발한 공개 키 암호화 기법으로, 비대칭 키 시스템을 사용합니다. 즉, 공개 키(public key)로 데이터를 암호화하고 개인 키(private key)로 복호화하는 방식입니다. ESP32에서는 mbedtls
라이브러리를 활용하여 RSA 암호화를 구현할 수 있습니다.
2. ESP32 IDF에서 RSA 지원
ESP-IDF는 mbedtls
라이브러리를 통해 RSA 암호화를 지원하며, 이를 활용하여 키 생성, 암호화, 복호화 기능을 구현할 수 있습니다. 주요 API는 다음과 같습니다:
mbedtls_rsa_init()
: RSA 구조체 초기화mbedtls_rsa_gen_key()
: RSA 키 생성mbedtls_rsa_pkcs1_encrypt()
: PKCS#1 v1.5 방식으로 암호화mbedtls_rsa_pkcs1_decrypt()
: PKCS#1 v1.5 방식으로 복호화
3. ESP32에서 RSA 키 생성
먼저, ESP32에서 RSA 키 쌍을 생성하는 방법을 알아보겠습니다.
RSA 키 생성 코드 예제
#include "mbedtls/rsa.h"
#include "mbedtls/entropy.h"
#include "mbedtls/ctr_drbg.h"
#include "esp_log.h"
#define KEY_SIZE 2048
#define EXPONENT 65537
static const char *TAG = "RSA";
void generate_rsa_key(mbedtls_rsa_context *rsa) {
mbedtls_entropy_context entropy;
mbedtls_ctr_drbg_context ctr_drbg;
mbedtls_entropy_init(&entropy);
mbedtls_ctr_drbg_init(&ctr_drbg);
mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, NULL, 0);
mbedtls_rsa_init(rsa, MBEDTLS_RSA_PKCS_V15, 0);
int ret = mbedtls_rsa_gen_key(rsa, mbedtls_ctr_drbg_random, &ctr_drbg, KEY_SIZE, EXPONENT);
if (ret == 0) {
ESP_LOGI(TAG, "RSA Key Pair Generated Successfully");
} else {
ESP_LOGE(TAG, "RSA Key Generation Failed");
}
mbedtls_entropy_free(&entropy);
mbedtls_ctr_drbg_free(&ctr_drbg);
}
이 코드에서는 mbedtls_rsa_gen_key()
를 사용하여 RSA 키 쌍을 생성합니다. 키 크기는 2048비트이며, 공개 지수는 65537로 설정하였습니다.
4. RSA 암호화 및 복호화 구현
키를 생성한 후, 이를 사용하여 데이터를 암호화하고 복호화할 수 있습니다.
RSA 암호화 예제 코드
void rsa_encrypt(mbedtls_rsa_context *rsa, const unsigned char *input, size_t input_len, unsigned char *output) {
int ret = mbedtls_rsa_pkcs1_encrypt(rsa, NULL, NULL, MBEDTLS_RSA_PUBLIC, input_len, input, output);
if (ret == 0) {
ESP_LOGI(TAG, "RSA Encryption Successful");
} else {
ESP_LOGE(TAG, "RSA Encryption Failed");
}
}
mbedtls_rsa_pkcs1_encrypt()
함수를 사용하여 공개 키로 데이터를 암호화합니다.
RSA 복호화 예제 코드
void rsa_decrypt(mbedtls_rsa_context *rsa, const unsigned char *input, unsigned char *output, size_t *output_len) {
int ret = mbedtls_rsa_pkcs1_decrypt(rsa, NULL, NULL, MBEDTLS_RSA_PRIVATE, output_len, input, output, 256);
if (ret == 0) {
ESP_LOGI(TAG, "RSA Decryption Successful");
} else {
ESP_LOGE(TAG, "RSA Decryption Failed");
}
}
복호화에는 mbedtls_rsa_pkcs1_decrypt()
를 사용하며, 개인 키를 이용해 원본 데이터를 복원할 수 있습니다.
5. 전체 코드 예제
이제 위의 기능들을 하나의 코드로 정리하여 실행할 수 있도록 합니다.
void app_main(void) {
mbedtls_rsa_context rsa;
generate_rsa_key(&rsa);
const char *message = "Hello ESP32!";
unsigned char encrypted[256];
unsigned char decrypted[256];
size_t output_len;
rsa_encrypt(&rsa, (const unsigned char *)message, strlen(message), encrypted);
rsa_decrypt(&rsa, encrypted, decrypted, &output_len);
decrypted[output_len] = '\0';
ESP_LOGI(TAG, "Decrypted Message: %s", decrypted);
mbedtls_rsa_free(&rsa);
}
이 코드를 ESP32에 업로드하면, "Hello ESP32!" 메시지가 RSA를 통해 암호화된 후 복호화됩니다.
6. 마무리
이번 포스팅에서는 ESP32 IDF에서 RSA를 활용하여 키를 생성하고, 데이터를 암호화 및 복호화하는 방법을 소개하였습니다. mbedtls
라이브러리를 활용하면 비교적 쉽게 RSA 암호화를 적용할 수 있으며, IoT 환경에서 보안이 중요한 애플리케이션에 활용할 수 있습니다.
'STM32' 카테고리의 다른 글
HMAC을 활용한 안전한 부팅 과정 구현 (0) | 2025.02.26 |
---|---|
STM32F429 펌웨어 무결성 검증 - SHA-256을 이용한 검증 방법 (0) | 2025.02.26 |
STM32F429 암호화 모듈 사용법 - OTP(One-Time Programmable) 메모리 활용 (0) | 2025.02.26 |
STM32F429 하드웨어 키 저장소 사용법 (0) | 2025.02.26 |
DMA를 이용한 STM32F429 암호화 비동기 처리 방법 (0) | 2025.02.26 |