Security

대칭키와 비대칭키

Jinseung's Blog 2026. 9. 30. 20:16

이번 블로그에서는 보안의 가장 기본이 되는 대칭키와 비대칭키 암호화에 대한 글을 작성해보겠습니다.

 

대칭키 & 비대칭키란?

대칭키(Symmetric Key) 암호화는 암호화와 복호화에 같은 키 하나를 쓰는 방식입니다.

비대칭키(Asymmetric / Public Key) 암호화는 공개키와 개인키 한 쌍을 씁니다.  한 키로 암호화한 데이터는 짝이 되는 다른 키로만 풀 수 있습니다.

 

대칭키 (Symmetric)

  • 하나의 비밀키로 암호화와 복호화를 모두 합니다.
  • 대표 알고리즘으로는 AES(AES-256), ChaCha20이 있고, 예전에는 DES/3DES를 썼습니다.
  • 장점
    • 매우 빠르고, 대용량 데이터를 처리하는 데 효율적입니다.
  • 단점
    •   키 분배 문제: 상대에게 비밀키를 안전하게 전달할 방법이 따로 필요합니다.
    •   키 폭증 문제: 통신 상대가 N명이면 필요한 키 개수가 N²에 가깝게 늘어납니다.

 

비대칭키 (Asymmetric)

 
  • 공개키(Public Key)와 개인키(Private Key) 한 쌍을 씁니다.
  • 두 키는 수학적으로 연결되어 있지만, 공개키로 개인키를 알아낼 수는 없습니다.
  • 대표 알고리즘으로는 RSA, ECC(타원곡선), ECDSA, Ed25519가 있습니다.\

 

비대칭키는 크게 두 가지 용도로 쓰입니다.

 

  1. 암호화 (기밀성)
    • 공개키로 암호화하고, 개인키로만 복호화합니다.
    • 누구나 수신자의 공개키로 암호화해 보낼 수 있지만,
    • 읽을 수 있는 사람은 개인키를 가진 수신자뿐입니다.
  2. 전자서명 (인증·무결성)
    • 개인키로 서명하고, 공개키로 검증합니다.   
    • 개인키 소유자만 서명할 수 있으므로 누가 보냈는지,
    • 내용이 바뀌지 않았는지를 증명할 수 있습니다.

장점: 공개키는 공개해도 되므로 키 분배 문제가 해결됩니다. 전자서명도 할 수 있습니다.
단점: 대칭키보다 훨씬 느려서 대용량 데이터를 직접 암호화하기에는 맞지 않습니다.

 

실전은 하이브리드로, 둘을 함께 쓴다.

실무에서는 두 방식을 같이 씁니다. 느린 비대칭키로 대칭 세션키를 안전하게 교환한 뒤, 빠른 대칭키로 실제 데이터를 암호화합니다.

 

  • TLS / mTLS: handshake 단계에서 비대칭키(ECDHE/RSA)로 세션키를 합의하고, 그 뒤 통신은 AES로 암호화합니다.
  • KMS 봉투 암호화: 데이터는 대칭키인 DEK로 암호화하고, DEK는 다시 마스터키로 보호합니다. KMS는 대칭 마스터키를 기본으로 쓰지만, 개념적으로는 이런 키 계층 구조입니다.
  • PGP / SSH: 세션키를 교환한 뒤 대칭키로 통신합니다.

 

목적에 따른 분류

항목 대칭키 비대칭키
키 하나 (공유 비밀키) 공개키 + 개인키 쌍
속도 빠름 느림
키 분배 어려움 (안전한 전달 필요) 쉬움 (공개키는 공개 가능)
대상 데이터 대용량 실데이터 소량 데이터 (키 교환, 서명)
서명 불가 가능
대표 알고리즘 AES, ChaCha20 RSA, ECC, Ed25519
확장성 (N명) 키 폭증 (N²) 각자 키쌍 하나 (선형)

 

 

예시 코드 (OpenSSL)

# 대칭키: AES-256으로 파일 암호화 / 복호화
openssl enc -aes-256-cbc -salt -in secret.txt -out secret.enc -k mypassword
openssl enc -d -aes-256-cbc -in secret.enc -out secret.txt -k mypassword

# 비대칭키: RSA 키쌍 생성
openssl genrsa -out private.pem 2048
openssl rsa -in private.pem -pubout -out public.pem

# 공개키로 암호화 → 개인키로 복호화 (기밀성)
openssl pkeyutl -encrypt -pubin -inkey public.pem -in msg.txt -out msg.enc
openssl pkeyutl -decrypt -inkey private.pem -in msg.enc -out msg.txt

# 개인키로 서명 → 공개키로 검증 (인증/무결성)
openssl dgst -sha256 -sign private.pem -out sig.bin msg.txt
openssl dgst -sha256 -verify public.pem -signature sig.bin msg.txt

 

이것으로 대칭키 및 비대칭키에 대한 글을 마치겠습니다. 감사합니다!