이번 블로그에서는 보안의 가장 기본이 되는 대칭키와 비대칭키 암호화에 대한 글을 작성해보겠습니다.
대칭키 & 비대칭키란?
대칭키(Symmetric Key) 암호화는 암호화와 복호화에 같은 키 하나를 쓰는 방식입니다.
비대칭키(Asymmetric / Public Key) 암호화는 공개키와 개인키 한 쌍을 씁니다. 한 키로 암호화한 데이터는 짝이 되는 다른 키로만 풀 수 있습니다.
대칭키 (Symmetric)
- 하나의 비밀키로 암호화와 복호화를 모두 합니다.
- 대표 알고리즘으로는 AES(AES-256), ChaCha20이 있고, 예전에는 DES/3DES를 썼습니다.
- 장점
- 매우 빠르고, 대용량 데이터를 처리하는 데 효율적입니다.
- 단점
- 키 분배 문제: 상대에게 비밀키를 안전하게 전달할 방법이 따로 필요합니다.
- 키 폭증 문제: 통신 상대가 N명이면 필요한 키 개수가 N²에 가깝게 늘어납니다.
비대칭키 (Asymmetric)
- 공개키(Public Key)와 개인키(Private Key) 한 쌍을 씁니다.
- 두 키는 수학적으로 연결되어 있지만, 공개키로 개인키를 알아낼 수는 없습니다.
- 대표 알고리즘으로는 RSA, ECC(타원곡선), ECDSA, Ed25519가 있습니다.\
비대칭키는 크게 두 가지 용도로 쓰입니다.
- 암호화 (기밀성)
- 공개키로 암호화하고, 개인키로만 복호화합니다.
- 누구나 수신자의 공개키로 암호화해 보낼 수 있지만,
- 읽을 수 있는 사람은 개인키를 가진 수신자뿐입니다.
- 전자서명 (인증·무결성)
- 개인키로 서명하고, 공개키로 검증합니다.
- 개인키 소유자만 서명할 수 있으므로 누가 보냈는지,
- 내용이 바뀌지 않았는지를 증명할 수 있습니다.
장점: 공개키는 공개해도 되므로 키 분배 문제가 해결됩니다. 전자서명도 할 수 있습니다.
단점: 대칭키보다 훨씬 느려서 대용량 데이터를 직접 암호화하기에는 맞지 않습니다.
실전은 하이브리드로, 둘을 함께 쓴다.
실무에서는 두 방식을 같이 씁니다. 느린 비대칭키로 대칭 세션키를 안전하게 교환한 뒤, 빠른 대칭키로 실제 데이터를 암호화합니다.
- 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
이것으로 대칭키 및 비대칭키에 대한 글을 마치겠습니다. 감사합니다!