ESP32 IDF

ESP32 IDF에서 AES-128, AES-192, AES-256 및 ECB, CBC, CFB, GCM 모드 소개

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

ESP32 IDF에서 AES-128, AES-192, AES-256 및 ECB, CBC, CFB, GCM 모드 소개

1. 개요

ESP32는 보안 기능이 강화된 마이크로컨트롤러로, Espressif에서 제공하는 ESP-IDF(ESP32 IoT Development Framework)를 활용하면 다양한 암호화 알고리즘을 쉽게 구현할 수 있습니다. 그중 대칭 암호화 방식인 AES(Advanced Encryption Standard)는 보안성이 뛰어나고 속도가 빠르기 때문에 IoT 디바이스에서 많이 사용됩니다.

이 글에서는 ESP32 IDF를 이용하여 AES-128, AES-192, AES-256 암호화를 수행하는 방법과 ECB, CBC, CFB, GCM 등의 다양한 운영 모드(Mode of Operation)에 대해 소개하겠습니다.

2. AES 개요

AES는 미국 표준 기술 연구소(NIST)에서 선정한 대칭키 암호화 알고리즘으로, 128비트 블록 크기를 가지며, 키 길이에 따라 AES-128(128비트 키), AES-192(192비트 키), AES-256(256비트 키)로 구분됩니다.

AES는 암호화 모드에 따라 데이터의 처리 방식이 달라지며, 각 모드는 보안성과 성능 측면에서 차이를 보입니다. ESP32 IDF는 다양한 AES 운영 모드를 지원하며, 하드웨어 가속 기능을 이용해 성능을 향상시킬 수 있습니다.

3. AES 키 크기와 운영 모드

3.1 AES 키 크기

AES 유형 키 길이
AES-128 128비트
AES-192 192비트
AES-256 256비트

3.2 AES 운영 모드

모드 설명
ECB (Electronic Codebook) 블록별 개별 암호화, 동일한 입력 데이터는 같은 출력 생성
CBC (Cipher Block Chaining) 이전 블록의 암호문을 다음 블록의 평문과 XOR 연산 후 암호화
CFB (Cipher Feedback) 암호문을 피드백하여 평문을 암호화하는 방식
GCM (Galois/Counter Mode) 인증과 암호화를 동시에 수행하는 방식으로 보안성이 높음

ECB 모드는 간단하지만 보안성이 낮아 실무에서는 잘 사용되지 않습니다. CBC, CFB, GCM 모드는 보다 높은 보안성을 제공합니다.

4. ESP32 IDF에서 AES 암호화 예제

ESP-IDF에서 AES 암호화를 수행하기 위해 mbedtls 라이브러리를 사용합니다. 아래 예제는 AES-128 CBC 모드를 사용하여 데이터를 암호화하는 방법을 보여줍니다.

4.1 AES-128 CBC 암호화 예제

#include <stdio.h>
#include <string.h>
#include "mbedtls/aes.h"

#define AES_KEY_SIZE 16 // AES-128 (16 bytes)
#define AES_BLOCK_SIZE 16

static const unsigned char key[AES_KEY_SIZE] = "0123456789abcdef"; // 128비트 키
static const unsigned char iv[AES_BLOCK_SIZE] = "abcdef0123456789"; // 초기화 벡터

void encrypt_aes_cbc(const unsigned char *input, size_t length) {
    mbedtls_aes_context aes;
    unsigned char output[length];
    mbedtls_aes_init(&aes);
    mbedtls_aes_setkey_enc(&aes, key, 128);

    mbedtls_aes_crypt_cbc(&aes, MBEDTLS_AES_ENCRYPT, length, iv, input, output);

    printf("Encrypted Data: ");
    for (size_t i = 0; i < length; i++) {
        printf("%02x", output[i]);
    }
    printf("\n");

    mbedtls_aes_free(&aes);
}

void app_main() {
    const unsigned char data[] = "HelloESP32AES!123"; // 16바이트
    encrypt_aes_cbc(data, sizeof(data));
}

4.2 AES-128 CBC 복호화 예제

void decrypt_aes_cbc(const unsigned char *input, size_t length) {
    mbedtls_aes_context aes;
    unsigned char output[length];
    unsigned char iv_dec[AES_BLOCK_SIZE];
    memcpy(iv_dec, iv, AES_BLOCK_SIZE);

    mbedtls_aes_init(&aes);
    mbedtls_aes_setkey_dec(&aes, key, 128);
    mbedtls_aes_crypt_cbc(&aes, MBEDTLS_AES_DECRYPT, length, iv_dec, input, output);

    printf("Decrypted Data: %s\n", output);

    mbedtls_aes_free(&aes);
}

5. 기타 AES 모드 예제

5.1 AES-256 GCM 예제

ESP32 IDF에서는 AES GCM 모드를 지원하며, 이는 무결성 검증 기능을 포함한 강력한 암호화 방식입니다.

#include "mbedtls/gcm.h"

void encrypt_aes_gcm(const unsigned char *input, size_t length) {
    mbedtls_gcm_context gcm;
    unsigned char output[length];
    unsigned char tag[16];

    mbedtls_gcm_init(&gcm);
    mbedtls_gcm_setkey(&gcm, MBEDTLS_CIPHER_ID_AES, key, 256);

    mbedtls_gcm_crypt_and_tag(&gcm, MBEDTLS_GCM_ENCRYPT, length, iv, AES_BLOCK_SIZE, NULL, 0, input, output, 16, tag);

    printf("Encrypted GCM Data: ");
    for (size_t i = 0; i < length; i++) {
        printf("%02x", output[i]);
    }
    printf("\n");

    mbedtls_gcm_free(&gcm);
}

6. 결론

ESP32 IDF는 AES-128, AES-192, AES-256을 포함한 다양한 암호화 키 길이를 지원하며, ECB, CBC, CFB, GCM과 같은 여러 운영 모드를 제공합니다. 특히 CBC, CFB, GCM 모드는 보안성이 뛰어나며 실무 환경에서 많이 사용됩니다.

이번 글에서는 ESP32 IDF에서 AES 암호화를 수행하는 방법을 다양한 예제 코드와 함께 설명하였습니다. 향후 ESP32에서 암호화를 활용하여 보안을 강화하는 방법을 연구하고 적용할 수 있도록 참고하시기 바랍니다.

반응형