8월 5일 - 대칭키 & 공개키

Yullgiii·2024년 8월 5일
0

TIL: 대칭키 & 공개키 암호화

오늘은 정보 보안에서 중요한 역할을 하는 대칭키(Symmetric Key)공개키(Public Key) / 비대칭키(Asymmetric Key) 암호화에 대해 알아보자. 각 방식의 특징과 장단점을 이해하고, 이를 통해 보안 문제를 어떻게 해결할 수 있는지 살펴보겠다.

대칭키 암호화 (Symmetric Key)

대칭키 암호화는 암호화와 복호화에 같은 키를 사용하는 알고리즘이다. 이 방식은 동일한 키를 사용하므로 매우 빠르다는 장점이 있지만, 키를 전달하는 과정에서 해킹 위험에 노출될 수 있다.

대칭키의 장점

  • 속도: 암호화와 복호화가 빠르다.
  • 단순성: 알고리즘이 간단하여 구현이 쉽다.

대칭키의 단점

  • 키 분배 문제: 키를 안전하게 전달하는 것이 어렵다.
  • 확장성 부족: 사용자 수가 많아질수록 키 관리가 복잡해진다.

공개키 암호화 (Public Key)

공개키 암호화는 암호화와 복호화에 사용하는 키가 다른 알고리즘이다. 이는 대칭키의 키 분배 문제를 해결하기 위해 고안되었다. 송수신자 간의 키 분배가 복잡한 대칭키와 달리, 공개키 방식에서는 공개키를 대중에 공개하고 비밀키로만 복호화할 수 있다.

공개키의 장점

  • 보안성: 키 분배 문제가 해결된다.
  • 확장성: 다수의 사용자 간에도 키 관리가 용이하다.

공개키의 단점

  • 속도: 암호화와 복호화가 복잡하여 대칭키보다 느리다.

공개키 암호화 방식 진행 과정

  1. A가 웹 상에 공개된 'B의 공개키'를 이용해 평문을 암호화하여 B에게 보냄.
  2. B는 자신의 비밀키로 복호화하여 평문을 확인하고, A의 공개키로 응답을 암호화하여 A에게 보냄.
  3. A는 자신의 비밀키로 암호화된 응답문을 복호화함.

이 방식은 기밀성(Confidentiality)만 보장해줄 뿐, 무결성(Integrity)이나 인증(Authenticity)는 보장해주지 못한다. 이를 해결하기 위해 MAC(Message Authentication Code)전자 서명(Digital Signature)를 사용한다. (주의: MAC은 대칭키 방식이다)

하이브리드 암호화 방식

대칭키와 공개키 암호화 방식을 혼합하여 장점을 극대화한 하이브리드 방식이 등장하게 되었고, 이는 SSL/TLS 프로토콜의 시초가 되었다.

하이브리드 암호화 과정

  1. A가 B의 공개키로 암호화 통신에 사용할 대칭키를 암호화하여 B에게 보냄.
  2. B는 암호문을 받고, 자신의 비밀키로 복호화함.
  3. B는 A로부터 얻은 대칭키로 A에게 보낼 평문을 암호화하여 A에게 보냄.
  4. A는 자신의 대칭키로 암호문을 복호화함.
  5. 이후 이 대칭키로 암호화하여 통신함.

즉, 대칭키를 주고받을 때만 공개키 암호화 방식을 사용하고, 이후에는 대칭키 암호화 방식으로 통신하는 것이다.

예제: 암호화 통신 구현

import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class HybridEncryptionExample {

    // 대칭키 생성
    public static SecretKey generateSymmetricKey() throws NoSuchAlgorithmException {
        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        keyGen.init(128); // AES 키 크기 128비트
        return keyGen.generateKey();
    }

    // 대칭키 암호화
    public static String encryptSymmetric(String data, SecretKey key) throws Exception {
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] encrypted = cipher.doFinal(data.getBytes());
        return Base64.getEncoder().encodeToString(encrypted);
    }

    // 대칭키 복호화
    public static String decryptSymmetric(String encryptedData, SecretKey key) throws Exception {
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, key);
        byte[] decrypted = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
        return new String(decrypted);
    }

    public static void main(String[] args) {
        try {
            SecretKey symmetricKey = generateSymmetricKey();
            String originalData = "Hello, Secure World!";
            
            // 데이터 암호화 및 복호화
            String encryptedData = encryptSymmetric(originalData, symmetricKey);
            String decryptedData = decryptSymmetric(encryptedData, symmetricKey);
            
            System.out.println("Original Data: " + originalData);
            System.out.println("Encrypted Data: " + encryptedData);
            System.out.println("Decrypted Data: " + decryptedData);
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

예제 설명

  • 대칭키 생성: AES 알고리즘을 사용하여 대칭키를 생성한다.
  • 암호화 및 복호화: 대칭키를 사용하여 데이터를 암호화하고 복호화한다.
  • 이 예제는 대칭키 암호화를 보여주지만, 공개키 암호화를 통해 대칭키를 안전하게 교환할 수 있다.

So...

암호화 방식은 보안의 핵심 요소로, 상황에 따라 대칭키와 공개키를 적절히 사용해야 한다. 대칭키는 빠르지만 키 분배가 어렵고, 공개키는 안전하지만 속도가 느리다. 하이브리드 방식을 통해 두 가지 방식의 장점을 결합하여 보안을 강화할 수 있다.

profile
개발이란 무엇인가..를 공부하는 거북이의 성장일기 🐢

0개의 댓글