공개 키 (Public Key)
1. 개요
공개 키(Public Key)란 비대칭 암호화(Asymmetric Encryption) 체계에서 누구나 접근할 수 있도록 공개된 키로, 데이터의 암호화나 디지털 서명의 검증에 사용되는 암호학적 도구이다.
비대칭 암호화는 서로 다른 두 개의 키, 즉 공개 키(Public Key)와 비밀 키(Private Key)가 한 쌍(Key Pair)을 이루어 작동하는 방식이다. 공개 키는 외부로 공개되어 누구나 사용할 수 있지만, 이와 쌍을 이루는 비밀 키는 오직 소유자만이 안전하게 보관해야 한다. 이 체계의 핵심은 공개 키로 암호화된 데이터는 오직 그와 쌍을 이루는 비밀 키로만 복호화(Decryption, 암호문을 평문으로 되돌리는 과정)할 수 있다는 점에 있다.
2. 동작 원리
공개 키 방식은 수학적으로 계산하기는 쉽지만, 역산하기는 매우 어려운 수학적 난제(One-way Function)를 기반으로 설계되었다.
2.1 수학적 기반
공개 키 암호화의 핵심은 함정문(Trapdoor) 개념에 있다. 이는 특정 정보(비밀 키)가 없으면 역산이 사실상 불가능하지만, 그 정보가 있다면 매우 쉽게 풀 수 있는 구조를 의미한다. 이를 통해 단순한 단방향 해시 함수와 차별화되는 암복호화 메커니즘을 구현한다.
- 소인수분해 문제: 매우 큰 두 소수의 곱을 구하는 것은 쉽지만, 그 결과값으로부터 원래의 두 소수를 찾아내는 것은 현대 컴퓨팅 성능으로 매우 오랜 시간이 걸린다는 점을 이용한다. (예: RSA 알고리즘)
- 이산 로그 문제: 유한체 위에서 지수 연산은 쉽지만, 결과값과 밑을 알 때 지수를 찾아내는 것은 매우 어렵다는 점을 이용한다. (예: ECC 알고리즘)
2.2 대칭 키 방식과의 비교
| 구분 |
대칭 키 (Symmetric Key) |
비대칭 키 (Asymmetric Key) |
| 키의 개수 |
1개 (공유 키) |
2개 (공개 키 + 비밀 키) |
| 키 전달 |
키를 안전하게 전달해야 하는 문제 발생 |
공개 키는 자유롭게 배포 가능 |
| 속도 |
암복호화 속도가 매우 빠름 |
수학적 연산 복잡도로 인해 상대적으로 느림 |
| 주요 용도 |
대량의 데이터 암호화 |
키 교환, 디지털 서명, 소량 데이터 암호화 |
2.3 하이브리드 암호화 (Hybrid Encryption)
비대칭 키 방식은 보안성이 높지만 연산 속도가 느리다는 단점이 있다. 이를 해결하기 위해 실제 환경에서는 하이브리드 암호화 방식을 사용한다. 이는 '대칭 키(세션 키)를 공개 키로 암호화하여 안전하게 전달'한 뒤, 실제 대량의 데이터는 전달받은 대칭 키로 빠르게 주고받는 방식이다.
3. 대표적 알고리즘
공개 키 체계를 구현하는 알고리즘은 수학적 접근 방식에 따라 여러 종류로 나뉜다.
- RSA (Rivest-Shamir-Adleman): 가장 널리 사용되는 알고리즘으로, 큰 정수의 소인수분해 난제를 기반으로 한다. 구현이 단순하고 범용적이지만, 보안 강도를 높이려면 키의 길이가 매우 길어져야 한다는 단점이 있다.
- ECC (Elliptic Curve Cryptography): 타원 곡선 암호학을 기반으로 한다. RSA보다 훨씬 짧은 키 길이로도 동일한 수준의 보안 강도를 제공하므로, 연산 속도가 빠르고 메모리 사용량이 적어 모바일 기기나 IoT 환경에서 주로 사용된다.
- Diffie-Hellman (DH): 데이터를 암호화하는 용도가 아니라, 통신하는 두 당사자가 안전하지 않은 채널을 통해 공통의 비밀 키를 생성(키 교환)하기 위해 사용되는 알고리즘이다.
4. 주요 활용 사례
4.1 데이터 암호화 (기밀성 유지)
송신자가 수신자의 공개 키로 데이터를 암호화하여 보내면, 수신자는 자신이 가진 비밀 키로만 이를 풀 수 있다. 이를 통해 전송 과정에서 데이터가 탈취되더라도 비밀 키가 없는 제3자는 내용을 알 수 없다.
4.2 디지털 서명 (무결성 및 인증)
송신자가 자신의 비밀 키로 데이터의 해시값(데이터의 고유 지문)을 암호화하여 서명을 생성한다. 수신자는 송신자의 공개 키를 사용하여 서명된 해시값을 검증(Verify)하고, 이를 실제 데이터의 해시값과 비교하여 데이터가 변조되지 않았는지(무결성), 그리고 실제 송신자가 보낸 것이 맞는지(인증) 확인한다.
4.3 HTTPS 연결 과정의 공개 키 활용
웹 브라우저와 서버가 보안 연결(TLS/SSL)을 맺을 때 공개 키가 핵심적인 역할을 한다.
1. 인증서 확인: 서버가 자신의 공개 키가 포함된 디지털 인증서를 브라우저에 전달한다.
2. 신뢰 검증: 브라우저는 내장된 CA의 공개 키로 서버 인증서의 서명을 검증하여 서버의 신원을 확인한다.
3. 세션 키 교환: 브라우저는 임시 대칭 키(세션 키)를 생성하고, 이를 서버의 공개 키로 암호화하여 서버에 전송한다.
4. 대칭 암호화 통신: 서버는 자신의 비밀 키로 세션 키를 복호화하여 획득하며, 이후 모든 데이터는 이 세션 키를 이용한 대칭 암호화 방식으로 빠르게 주고받는다.
4.4 암복호화 및 서명 흐름도 (의사코드)
# [시나리오 1: A가 B에게 비밀 메시지를 보낼 때 (기밀성 유지)]
# 1. 준비 단계
B_public_key, B_private_key = generate_key_pair()
A_gets(B_public_key)
# 2. 암호화 (A의 동작)
message = "Hello, Secret!"
encrypted_data = encrypt(message, B_public_key) # B의 공개 키로 암호화
send(encrypted_data)
# 3. 복호화 (B의 동작)
received_data = receive()
decrypted_message = decrypt(received_data, B_private_key) # 자신의 비밀 키로 복호화
print(decrypted_message) # "Hello, Secret!"
# [시나리오 2: A가 메시지에 서명하여 B에게 보낼 때 (인증 및 무결성)]
# 1. 서명 생성 (A의 동작)
message = "I agree to this contract."
hash_value = compute_hash(message)
signature = encrypt(hash_value, A_private_key) # 자신의 비밀 키로 해시값 암호화
send(message, signature)
# 2. 서명 검증 (B의 동작)
received_msg, received_sig = receive()
# A의 공개 키로 서명을 검증하여 원래의 해시값을 추출
decrypted_hash = decrypt(received_sig, A_public_key)
# 수신한 메시지로 직접 해시를 계산하여 비교
current_hash = compute_hash(received_msg)
if decrypted_hash == current_hash:
print("검증 성공: 신뢰할 수 있는 메시지입니다.")
else:
print("검증 실패: 메시지가 변조되었거나 송신자가 다릅니다.")
5. 공개 키 기반 구조 (PKI)
5.1 공개 키 배포의 취약점과 해결책
공개 키 방식의 치명적인 약점은 '중간자 공격(Man-in-the-Middle Attack)'이다. 공격자가 수신자의 공개 키를 자신의 공개 키로 바꿔치기하여 송신자에게 전달하면, 송신자는 공격자의 키로 데이터를 암호화하게 되고 공격자는 이를 자신의 비밀 키로 복호화하여 내용을 훔쳐볼 수 있다.
이를 해결하기 위해 PKI(Public Key Infrastructure, 공개 키 기반 구조)가 도입되었다. 신뢰할 수 있는 제3자 기관인 CA(Certificate Authority, 인증 기관)가 공개 키의 소유자를 확인하고, 해당 공개 키가 정당하다는 것을 보증하는 디지털 인증서를 발행하는 방식이다.
5.2 디지털 인증서 (X.509)
X.509는 공개 키 인증서의 국제 표준 규격이다. 인증서에는 사용자의 공개 키, 소유자 정보, CA의 디지털 서명, 유효 기간 등이 포함되어 있다.
실제 사용되는 인증서 파일 확장자 예시:
- .pem: Base64로 인코딩된 텍스트 형식 (가장 범용적)
- .crt / .cer: 인증서 파일 (CRT는 주로 Unix/Linux, CER은 Windows에서 사용)
- .der: 바이너리 형식의 인코딩 파일
- .p12 / .pfx: 비밀 키와 인증서를 함께 포함하는 보관 파일 (암호 필요)
6. 보안 고려사항 및 관리
6.1 비밀 키 관리의 중요성
비대칭 암호화의 모든 보안은 비밀 키의 기밀성에 의존한다. 비밀 키가 유출되면 해당 키로 암호화된 모든 과거 데이터가 복호화될 수 있으며, 공격자가 소유자를 사칭하여 디지털 서명을 생성할 수 있다.
6.2 안전한 저장 및 관리 방법
- HSM (Hardware Security Module): 키를 하드웨어 칩 내부에 저장하여 외부로 추출하는 것이 불가능하게 만드는 물리적 보안 장치이다.
- Key Vault: 클라우드 환경(Azure Key Vault, AWS KMS 등)에서 제공하는 논리적 키 관리 서비스로, 접근 제어 및 감사 로그를 제공한다.
- 키 교체 (Key Rotation): 특정 주기마다 키를 새로 생성하고 교체함으로써, 만약의 키 유출 시 피해 범위를 최소화하고 공격자가 키를 분석할 시간을 줄이는 전략이다.
# 공개 키 (Public Key)
## 1. 개요
**공개 키(Public Key)**란 비대칭 암호화(Asymmetric Encryption) 체계에서 누구나 접근할 수 있도록 공개된 키로, 데이터의 암호화나 디지털 서명의 검증에 사용되는 암호학적 도구이다.
비대칭 암호화는 서로 다른 두 개의 키, 즉 **공개 키(Public Key)**와 **비밀 키(Private Key)**가 한 쌍(Key Pair)을 이루어 작동하는 방식이다. 공개 키는 외부로 공개되어 누구나 사용할 수 있지만, 이와 쌍을 이루는 비밀 키는 오직 소유자만이 안전하게 보관해야 한다. 이 체계의 핵심은 공개 키로 암호화된 데이터는 오직 그와 쌍을 이루는 비밀 키로만 복호화(Decryption, 암호문을 평문으로 되돌리는 과정)할 수 있다는 점에 있다.
## 2. 동작 원리
공개 키 방식은 수학적으로 계산하기는 쉽지만, 역산하기는 매우 어려운 **수학적 난제(One-way Function)**를 기반으로 설계되었다.
### 2.1 수학적 기반
공개 키 암호화의 핵심은 **함정문(Trapdoor)** 개념에 있다. 이는 특정 정보(비밀 키)가 없으면 역산이 사실상 불가능하지만, 그 정보가 있다면 매우 쉽게 풀 수 있는 구조를 의미한다. 이를 통해 단순한 단방향 해시 함수와 차별화되는 암복호화 메커니즘을 구현한다.
- **소인수분해 문제:** 매우 큰 두 소수의 곱을 구하는 것은 쉽지만, 그 결과값으로부터 원래의 두 소수를 찾아내는 것은 현대 컴퓨팅 성능으로 매우 오랜 시간이 걸린다는 점을 이용한다. (예: RSA 알고리즘)
- **이산 로그 문제:** 유한체 위에서 지수 연산은 쉽지만, 결과값과 밑을 알 때 지수를 찾아내는 것은 매우 어렵다는 점을 이용한다. (예: ECC 알고리즘)
### 2.2 대칭 키 방식과의 비교
| 구분 | 대칭 키 (Symmetric Key) | 비대칭 키 (Asymmetric Key) |
| :--- | :--- | :--- |
| **키의 개수** | 1개 (공유 키) | 2개 (공개 키 + 비밀 키) |
| **키 전달** | 키를 안전하게 전달해야 하는 문제 발생 | 공개 키는 자유롭게 배포 가능 |
| **속도** | 암복호화 속도가 매우 빠름 | 수학적 연산 복잡도로 인해 상대적으로 느림 |
| **주요 용도** | 대량의 데이터 암호화 | 키 교환, 디지털 서명, 소량 데이터 암호화 |
### 2.3 하이브리드 암호화 (Hybrid Encryption)
비대칭 키 방식은 보안성이 높지만 연산 속도가 느리다는 단점이 있다. 이를 해결하기 위해 실제 환경에서는 **하이브리드 암호화** 방식을 사용한다. 이는 **'대칭 키(세션 키)를 공개 키로 암호화하여 안전하게 전달'**한 뒤, 실제 대량의 데이터는 전달받은 대칭 키로 빠르게 주고받는 방식이다.
## 3. 대표적 알고리즘
공개 키 체계를 구현하는 알고리즘은 수학적 접근 방식에 따라 여러 종류로 나뉜다.
- **RSA (Rivest-Shamir-Adleman):** 가장 널리 사용되는 알고리즘으로, 큰 정수의 소인수분해 난제를 기반으로 한다. 구현이 단순하고 범용적이지만, 보안 강도를 높이려면 키의 길이가 매우 길어져야 한다는 단점이 있다.
- **ECC (Elliptic Curve Cryptography):** 타원 곡선 암호학을 기반으로 한다. RSA보다 훨씬 짧은 키 길이로도 동일한 수준의 보안 강도를 제공하므로, 연산 속도가 빠르고 메모리 사용량이 적어 모바일 기기나 IoT 환경에서 주로 사용된다.
- **Diffie-Hellman (DH):** 데이터를 암호화하는 용도가 아니라, 통신하는 두 당사자가 안전하지 않은 채널을 통해 공통의 비밀 키를 생성(키 교환)하기 위해 사용되는 알고리즘이다.
## 4. 주요 활용 사례
### 4.1 데이터 암호화 (기밀성 유지)
송신자가 수신자의 공개 키로 데이터를 암호화하여 보내면, 수신자는 자신이 가진 비밀 키로만 이를 풀 수 있다. 이를 통해 전송 과정에서 데이터가 탈취되더라도 비밀 키가 없는 제3자는 내용을 알 수 없다.
### 4.2 디지털 서명 (무결성 및 인증)
송신자가 자신의 비밀 키로 데이터의 해시값(데이터의 고유 지문)을 암호화하여 서명을 생성한다. 수신자는 송신자의 공개 키를 사용하여 서명된 해시값을 **검증(Verify)**하고, 이를 실제 데이터의 해시값과 비교하여 데이터가 변조되지 않았는지(무결성), 그리고 실제 송신자가 보낸 것이 맞는지(인증) 확인한다.
### 4.3 HTTPS 연결 과정의 공개 키 활용
웹 브라우저와 서버가 보안 연결(TLS/SSL)을 맺을 때 공개 키가 핵심적인 역할을 한다.
1. **인증서 확인:** 서버가 자신의 공개 키가 포함된 디지털 인증서를 브라우저에 전달한다.
2. **신뢰 검증:** 브라우저는 내장된 CA의 공개 키로 서버 인증서의 서명을 검증하여 서버의 신원을 확인한다.
3. **세션 키 교환:** 브라우저는 임시 대칭 키(세션 키)를 생성하고, 이를 서버의 공개 키로 암호화하여 서버에 전송한다.
4. **대칭 암호화 통신:** 서버는 자신의 비밀 키로 세션 키를 복호화하여 획득하며, 이후 모든 데이터는 이 세션 키를 이용한 대칭 암호화 방식으로 빠르게 주고받는다.
### 4.4 암복호화 및 서명 흐름도 (의사코드)
```python
# [시나리오 1: A가 B에게 비밀 메시지를 보낼 때 (기밀성 유지)]
# 1. 준비 단계
B_public_key, B_private_key = generate_key_pair()
A_gets(B_public_key)
# 2. 암호화 (A의 동작)
message = "Hello, Secret!"
encrypted_data = encrypt(message, B_public_key) # B의 공개 키로 암호화
send(encrypted_data)
# 3. 복호화 (B의 동작)
received_data = receive()
decrypted_message = decrypt(received_data, B_private_key) # 자신의 비밀 키로 복호화
print(decrypted_message) # "Hello, Secret!"
# [시나리오 2: A가 메시지에 서명하여 B에게 보낼 때 (인증 및 무결성)]
# 1. 서명 생성 (A의 동작)
message = "I agree to this contract."
hash_value = compute_hash(message)
signature = encrypt(hash_value, A_private_key) # 자신의 비밀 키로 해시값 암호화
send(message, signature)
# 2. 서명 검증 (B의 동작)
received_msg, received_sig = receive()
# A의 공개 키로 서명을 검증하여 원래의 해시값을 추출
decrypted_hash = decrypt(received_sig, A_public_key)
# 수신한 메시지로 직접 해시를 계산하여 비교
current_hash = compute_hash(received_msg)
if decrypted_hash == current_hash:
print("검증 성공: 신뢰할 수 있는 메시지입니다.")
else:
print("검증 실패: 메시지가 변조되었거나 송신자가 다릅니다.")
```
## 5. 공개 키 기반 구조 (PKI)
### 5.1 공개 키 배포의 취약점과 해결책
공개 키 방식의 치명적인 약점은 **'중간자 공격(Man-in-the-Middle Attack)'**이다. 공격자가 수신자의 공개 키를 자신의 공개 키로 바꿔치기하여 송신자에게 전달하면, 송신자는 공격자의 키로 데이터를 암호화하게 되고 공격자는 이를 자신의 비밀 키로 복호화하여 내용을 훔쳐볼 수 있다.
이를 해결하기 위해 **PKI(Public Key Infrastructure, 공개 키 기반 구조)**가 도입되었다. 신뢰할 수 있는 제3자 기관인 **CA(Certificate Authority, 인증 기관)**가 공개 키의 소유자를 확인하고, 해당 공개 키가 정당하다는 것을 보증하는 **디지털 인증서**를 발행하는 방식이다.
### 5.2 디지털 인증서 (X.509)
X.509는 공개 키 인증서의 국제 표준 규격이다. 인증서에는 사용자의 공개 키, 소유자 정보, CA의 디지털 서명, 유효 기간 등이 포함되어 있다.
**실제 사용되는 인증서 파일 확장자 예시:**
- `.pem`: Base64로 인코딩된 텍스트 형식 (가장 범용적)
- `.crt` / `.cer`: 인증서 파일 (CRT는 주로 Unix/Linux, CER은 Windows에서 사용)
- `.der`: 바이너리 형식의 인코딩 파일
- `.p12` / `.pfx`: 비밀 키와 인증서를 함께 포함하는 보관 파일 (암호 필요)
## 6. 보안 고려사항 및 관리
### 6.1 비밀 키 관리의 중요성
비대칭 암호화의 모든 보안은 **비밀 키의 기밀성**에 의존한다. 비밀 키가 유출되면 해당 키로 암호화된 모든 과거 데이터가 복호화될 수 있으며, 공격자가 소유자를 사칭하여 디지털 서명을 생성할 수 있다.
### 6.2 안전한 저장 및 관리 방법
- **HSM (Hardware Security Module):** 키를 하드웨어 칩 내부에 저장하여 외부로 추출하는 것이 불가능하게 만드는 물리적 보안 장치이다.
- **Key Vault:** 클라우드 환경(Azure Key Vault, AWS KMS 등)에서 제공하는 논리적 키 관리 서비스로, 접근 제어 및 감사 로그를 제공한다.
- **키 교체 (Key Rotation):** 특정 주기마다 키를 새로 생성하고 교체함으로써, 만약의 키 유출 시 피해 범위를 최소화하고 공격자가 키를 분석할 시간을 줄이는 전략이다.