IT

대칭키와 비대칭키란?

0and24 2024. 11. 18. 19:23

암호화는 데이터를 안전하게 보호하기 위한 기술입니다. 대칭키와 비대칭키는 암호화에서 가장 기본이 되는 개념으로, 데이터를 암호화하고 해독하는 방식에 따라 나뉩니다. 이해하기 쉽게, 두 방식의 원리와 차이점을 살펴보겠습니다.

출처: https://curity.io/resources/learn/encrypted-id-tokens/

1. 대칭키 암호화란?

대칭키는 하나의 키(key) 를 사용하여 데이터를 암호화(Encryption)하고 복호화(Decryption)합니다. 즉, 데이터를 암호화할 때와 해독할 때 동일한 키를 사용합니다.

💡 특징

  • 빠르고 효율적: 하나의 키만 사용하므로 처리 속도가 빠릅니다.
  • 키 관리의 어려움: 암호화된 데이터를 상대방과 공유하려면 동일한 키를 공유해야 하며, 이 과정에서 키가 유출될 위험이 있습니다.

🔑 예시

  1. 비밀번호로 압축 파일 보호
    ZIP 파일을 생성할 때 비밀번호를 입력하면 대칭키 암호화를 사용합니다. 압축 파일을 열 때도 동일한 비밀번호를 입력해야 복호화가 가능합니다.
  2. Wi-Fi 공유기의 암호
    공유기 암호는 대칭키처럼 작동합니다. 암호를 알아야 Wi-Fi에 접속하고 데이터를 주고받을 수 있습니다.

📌 코드 예제 (Java)

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;

public class SymmetricEncryptionExample {
    public static void main(String[] args) throws Exception {
        // 대칭키 생성
        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
        keyGenerator.init(128); // 키 길이
        SecretKey secretKey = keyGenerator.generateKey();

        // 암호화
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] encryptedData = cipher.doFinal("Hello World!".getBytes());

        // 복호화
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        byte[] decryptedData = cipher.doFinal(encryptedData);

        System.out.println("복호화된 데이터: " + new String(decryptedData));
    }
}

. 비대칭키 암호화란?

비대칭키는 두 개의 키, 즉 공개키(Public Key)개인키(Private Key) 를 사용합니다.

  • 공개키: 누구나 볼 수 있습니다. 데이터를 암호화하는 데 사용됩니다.
  • 개인키: 소유자만 알고 있는 비밀 키입니다. 데이터를 복호화하는 데 사용됩니다.

💡 특징

  • 보안성 강화: 키가 두 개로 나뉘어 있으므로, 키를 공유하는 과정에서 보안 문제가 줄어듭니다.
  • 속도 저하: 대칭키보다 복잡한 연산을 사용하므로 속도가 느립니다.

🔑 예시

  1. 전자 서명
    비대칭키를 사용하면 서명자가 개인키로 데이터를 서명하고, 누구든지 공개키로 서명의 진위를 확인할 수 있습니다.
  2. HTTPS
    웹사이트에서 HTTPS를 사용할 때 SSL/TLS 프로토콜은 비대칭키를 사용해 데이터를 암호화하여 안전한 통신을 보장합니다.

📌 코드 예제 (Java)

import java.security.*;
import javax.crypto.Cipher;

public class AsymmetricEncryptionExample {
    public static void main(String[] args) throws Exception {
        // 키 쌍 생성
        KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
        keyPairGen.initialize(2048); // 키 길이
        KeyPair pair = keyPairGen.generateKeyPair();
        PublicKey publicKey = pair.getPublic();
        PrivateKey privateKey = pair.getPrivate();

        // 암호화 (공개키 사용)
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] encryptedData = cipher.doFinal("Hello World!".getBytes());

        // 복호화 (개인키 사용)
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] decryptedData = cipher.doFinal(encryptedData);

        System.out.println("복호화된 데이터: " + new String(decryptedData));
    }
}

3. 대칭키와 비대칭키의 차이점

구분 대칭키 비대칭키
키 개수 1개 (암호화/복호화 동일 키) 2개 (공개키/개인키)
속도 빠름 느림
보안성 키 전달 시 유출 위험 존재 키 전달 과정에서 보안성이 높음
사용 예시 파일 암호화, 데이터베이스 암호화 HTTPS, 전자 서명

4. 대칭키와 비대칭키의 조합: 하이브리드 암호화

현대 암호화 시스템은 두 방식을 조합하여 사용합니다. 이를 하이브리드 암호화라고 부릅니다.
예를 들어, HTTPS에서는 비대칭키를 사용해 대칭키를 안전하게 공유하고, 이후 대칭키로 데이터를 암호화합니다. 이렇게 하면 보안성과 속도를 모두 만족시킬 수 있습니다.


5. 결론

  • 대칭키는 빠르고 간단하지만 키 전달 문제가 단점입니다.
  • 비대칭키는 보안성이 높지만 처리 속도가 느립니다.
  • 두 방식은 각각의 장점을 살려 함께 사용됩니다.

대칭키와 비대칭키의 원리를 이해하면 보안 시스템 설계와 구현 능력을 한 단계 높일 수 있습니다. 글을 읽고 궁금한 점이 있으면 언제든 댓글로 남겨주세요! 😊

 

추가 궁금증으로 인한 내용:

6. JWT는 어디에 속할까?

둘다 가능하다. JWT(Json Web Token)는 사용자 인증을 위한 토큰으로, 클라이언트와 서버 간의 안전한 데이터 교환에 사용한다고 합니다. JWT는 암호화 방식을 적용하여 데이터의 무결성과 신뢰성을 보장합니다.

JWT와 대칭키

  • 서버에서 하나의 비밀키(secret key) 를 사용해 JWT를 서명(Sign)하고 검증(Verify)합니다.
  • HMAC 알고리즘을 사용하며, 대칭키 방식에 해당합니다.
  • : 서버가 단일 인스턴스인 경우 사용하기 적합.

JWT와 비대칭키

  • 서버에서 개인키(private key)로 JWT를 서명하고, 클라이언트는 공개키(public key)로 서명을 검증합니다.
  • RSA, ECDSA와 같은 알고리즘을 사용하며, 비대칭키 방식에 해당합니다.
  • : 서버가 분산되어 있거나 여러 클라이언트가 있는 경우 사용하기 적합.

실제 활용 예시

  • 대칭키 방식: 단일 서버에서만 사용하거나, 키 관리가 간단한 환경.
  • 비대칭키 방식: OAuth 2.0, OpenID Connect와 같은 인증 시스템에서 많이 사용됨.

 

관련 블로그 자료:
https://blog.naver.com/pentamkt/221034449023

 

[하루 3분 IT] 대칭키 (Symmetric Key)

한 줄 요약 대칭키란 암호화 알고리즘의 한 종류로 암호화와 복호화에 같은 암호 키를 쓰는 알고리즘을 의...

blog.naver.com