STM32

ESP32 IDF에서 RSA 암호화 활용하기

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

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 환경에서 보안이 중요한 애플리케이션에 활용할 수 있습니다.

반응형