Encryption Algorithm

3DES(Triple DES) 대칭키 암호화 알고리즘

임베디드 친구 2024. 11. 15. 09:13
728x90
반응형

3DES(Triple DES) 대칭키 암호화 알고리즘

안녕하세요, 오늘은 대칭키 암호화 알고리즘 중 하나인 3DES (Triple Data Encryption Standard)에 대해 알아보겠습니다. 대칭키 암호화는 하나의 키를 이용해 데이터를 암호화하고 복호화하는 방식인데, 그 중에서도 3DES는 기존 DES의 보안성 문제를 해결하기 위해 개발된 알고리즘입니다. 이 글에서는 3DES의 동작 방식, 장단점, 그리고 Java와 Linux C로 구현한 예제를 소개하겠습니다.

1. 3DES란?

3DES(Triple DES)는 기존 DES(Data Encryption Standard) 알고리즘을 3번 반복하여 암호화하는 방식입니다. DES는 56비트의 키를 사용해 데이터를 블록 단위로 암호화하는 알고리즘이지만, 키 길이가 짧아 현재 기준으로는 보안이 취약합니다. 이를 보완하기 위해 동일한 데이터를 3번 암호화함으로써 보안을 강화한 것이 3DES입니다.

3DES는 DES 알고리즘을 세 번 적용하기 때문에 보안 강도가 증가하지만, 속도 면에서는 원래 DES보다 느린 단점이 있습니다. 3DES의 기본 구조는 다음과 같습니다:

  1. 첫 번째 DES 암호화 (암호화 키: K1)
  2. 두 번째 DES 복호화 (복호화 키: K2)
  3. 세 번째 DES 암호화 (암호화 키: K3)

이 과정을 통해 데이터를 안전하게 보호할 수 있습니다. 3DES는 크게 3개의 키(K1, K2, K3)를 사용하는 경우와, 두 개의 키(K1, K2)를 사용하는 경우로 나눌 수 있습니다. 세 개의 키를 모두 다르게 사용하면 보안성이 가장 높습니다.

2. 3DES의 장단점

장점

  • 강화된 보안성: DES를 세 번 적용하므로, 단일 DES에 비해 보안성이 크게 증가합니다.
  • DES와의 호환성: 기존 DES와의 하위 호환성을 제공하여 기존 시스템에서 비교적 쉽게 전환할 수 있습니다.

단점

  • 느린 속도: DES를 세 번 적용하기 때문에 암호화/복호화 속도가 느립니다.
  • 키 관리의 복잡성: 키가 세 개 필요하기 때문에 키 관리가 어렵습니다. 키 길이도 168비트(56비트 * 3)로 상대적으로 깁니다.
  • 보안 문제: 3DES도 결국 DES의 확장판이기 때문에 현재 기준으로는 완벽하게 안전하지 않습니다. 이러한 이유로 3DES는 점차 AES(Advanced Encryption Standard)와 같은 다른 암호화 알고리즘으로 대체되고 있습니다.

3. 3DES Java 구현 예제

먼저, Java 언어를 사용하여 3DES 암호화 알고리즘을 구현하는 방법을 살펴보겠습니다. Java에서는 javax.crypto 패키지를 사용하여 간편하게 3DES를 구현할 수 있습니다.

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class TripleDESExample {
    public static void main(String[] args) throws Exception {
        String text = "Hello, 3DES!";

        // 키 생성
        KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede");
        keyGenerator.init(168); // 168비트 키
        SecretKey secretKey = keyGenerator.generateKey();

        // 암호화
        Cipher cipher = Cipher.getInstance("DESede");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] encryptedBytes = cipher.doFinal(text.getBytes("UTF-8"));
        String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);
        System.out.println("Encrypted: " + encryptedText);

        // 복호화
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));
        String decryptedText = new String(decryptedBytes, "UTF-8");
        System.out.println("Decrypted: " + decryptedText);
    }
}

위 Java 예제는 간단하게 3DES 암호화를 구현한 것입니다. KeyGenerator를 이용해 3DES 키를 생성하고, Cipher 클래스를 통해 암호화와 복호화를 수행합니다. 암호화된 데이터는 Base64 인코딩을 통해 문자열로 변환하여 출력합니다.

4. 3DES Linux C 구현 예제

다음으로는 Linux 환경에서 C 언어를 이용해 3DES를 구현하는 방법을 살펴보겠습니다. 이 예제에서는 openssl 라이브러리를 사용합니다.

먼저 OpenSSL 라이브러리가 설치되어 있어야 하며, 이를 통해 3DES 암호화를 수행할 수 있습니다.

#include <openssl/des.h>
#include <string.h>
#include <stdio.h>

void handleErrors() {
    fprintf(stderr, "An error occurred\n");
    exit(1);
}

int main() {
    DES_cblock key1, key2, key3;
    DES_key_schedule ks1, ks2, ks3;

    // 키 설정
    DES_string_to_key("key1key1", &key1);
    DES_string_to_key("key2key2", &key2);
    DES_string_to_key("key3key3", &key3);

    // 키 스케줄 설정
    DES_set_key_checked(&key1, &ks1);
    DES_set_key_checked(&key2, &ks2);
    DES_set_key_checked(&key3, &ks3);

    // 평문 설정
    const char *plaintext = "Hello, 3DES!";
    unsigned char ciphertext[1024];
    unsigned char decryptedtext[1024];
    DES_cblock ivec = {0}; // 초기화 벡터

    // 암호화
    DES_ede3_cbc_encrypt((unsigned char *)plaintext, ciphertext, strlen(plaintext) + 1, &ks1, &ks2, &ks3, &ivec, DES_ENCRYPT);
    printf("Encrypted: %s\n", ciphertext);

    // 복호화 (초기화 벡터 초기화)
    memset(ivec, 0, sizeof(ivec));
    DES_ede3_cbc_encrypt(ciphertext, decryptedtext, strlen(plaintext) + 1, &ks1, &ks2, &ks3, &ivec, DES_DECRYPT);
    printf("Decrypted: %s\n", decryptedtext);

    return 0;
}

이 C 언어 예제에서는 OpenSSL의 DES 라이브러리를 사용해 3DES 암호화를 수행합니다. DES_key_schedule을 통해 키 스케줄을 생성하고, DES_ede3_cbc_encrypt 함수를 통해 암호화와 복호화를 진행합니다. 초기화 벡터(ivec)를 이용해 CBC 모드를 구현합니다.

5. 마무리

3DES는 DES의 약점을 보완하기 위해 개발된 알고리즘으로, 보안 강도를 높였지만 속도와 키 관리 측면에서 한계가 있습니다. 이러한 이유로 현재는 AES와 같은 더 안전하고 효율적인 알고리즘이 널리 사용되고 있지만, 3DES는 여전히 많은 기존 시스템에서 사용되고 있습니다. 이번 포스팅에서는 3DES의 개념과 장단점을 설명하고, Java와 Linux C 언어로 구현하는 예제를 함께 살펴보았습니다.

추가로 궁금한 점이 있으시거나 다른 암호화 알고리즘에 대해 알고 싶다면 언제든지 댓글 남겨주세요! 감사합니다.

728x90
반응형