QKD와 양자 암호: 도청이 불가능한 이유
양자 키 분배(QKD)는 양자역학의 근본 원리를 이용해 두 사람이 절대적으로 안전한 암호 키를 공유할 수 있게 하는 기술이다. 도청자가 통신을 엿보는 순간 양자 상태가 교란되어 흔적이 남는다는 점이 고전 암호와 근본적으로 다른 핵심이다. 이 챕터에서는 QKD의 작동 원리와 대표 프로토콜인 BB84를 입문 수준에서 소개한다.
개념 소개
우편으로 자물쇠와 열쇠를 함께 보내면 누군가 중간에 열쇠를 복사할 수 있다. 고전 암호 시스템은 이 문제를 수학적 어려움(소인수분해 등)으로 해결해 왔다. 그러나 양자 컴퓨터가 등장하면 이 수학적 장벽이 무너질 수 있다.
양자 키 분배(Quantum Key Distribution, QKD) 는 수학적 복잡도가 아닌 물리 법칙 자체에 보안을 기댄다. 핵심 아이디어는 단순하다.
도청하면 반드시 들킨다.
이는 수학적 추측이 아니라 양자역학의 두 원리에서 직접 도출된다.
- 측정이 상태를 바꾼다 — 알 수 없는 양자 상태를 측정하면 그 상태가 변한다.
- 복제 불가 정리(No-Cloning Theorem) — 임의의 미지 양자 상태를 완벽히 복사하는 것은 불가능하다.
핵심 원리
편광 큐비트와 기저
빛의 편광을 이용하면 큐비트를 물리적으로 구현할 수 있다. 수평(→)과 수직(↑) 편광을 각각 , 로 정의하는 직선 기저(+) 와, 45°와 135° 편광을 사용하는 대각 기저(×) 가 대표적이다.
| 기저 | 해당 편광 | 해당 편광 | |------|------------|------------| | + (직선) | → (0°) | ↑ (90°) | | × (대각) | ↗ (45°) | ↖ (135°) |
다른 기저로 측정하면 결과가 무작위가 된다. 예를 들어 → 편광 광자를 × 기저로 측정하면 ↗ 또는 ↖가 50:50 확률로 나온다.
BB84 프로토콜
1984년 Bennett과 Brassard가 제안한 BB84는 최초의 QKD 프로토콜이다.
① 양자 채널 단계
- 송신자(Alice)는 무작위로 비트값(0 또는 1)과 기저(+ 또는 ×)를 선택해 광자를 전송한다.
- 수신자(Bob)도 무작위로 기저를 선택해 측정한다.
② 기저 공개 단계 (공개 채널)
- Alice와 Bob은 사용한 기저만 서로 공개한다 (비트값은 공개하지 않는다).
- 기저가 일치한 경우의 비트만 남긴다. 이것이 원시 키(raw key) 다.
③ 도청 감지 단계
- 원시 키의 일부를 공개 채널로 비교한다.
- 도청자(Eve)가 중간에 측정했다면, 잘못된 기저 선택으로 인해 오류율이 상승한다.
- 이상적인 채널의 오류율은 0%이지만, Eve가 모든 광자를 도청하면 약 25% 의 오류가 발생한다.
오류율이 임계값을 초과하면 키 사용을 중단하고 재시도한다.
복제 불가 정리와의 연결
Eve가 광자를 복사해 두었다가 나중에 분석하면 되지 않을까? 복제 불가 정리가 이를 막는다.
임의의 미지 상태 를 복제하는 유니터리 연산 는 존재하지 않는다. 따라서 Eve는 광자를 복사할 수 없고, 측정해야만 정보를 얻을 수 있으며, 측정은 곧 흔적을 남긴다.
예시·응용
파이썬 시뮬레이션 (BB84 단순 모델)
import random
def bb84_simulation(n_bits=20, eve_present=False):
bases = ['+', 'x']
# Alice: 비트값과 기저 선택
alice_bits = [random.randint(0, 1) for _ in range(n_bits)]
alice_bases = [random.choice(bases) for _ in range(n_bits)]
# Eve (도청 시): 무작위 기저로 측정 후 재전송
transmitted_bits = alice_bits[:]
if eve_present:
for i in range(n_bits):
if random.choice(bases) != alice_bases[i]:
transmitted_bits[i] = random.randint(0, 1) # 교란
# Bob: 무작위 기저로 측정
bob_bases = [random.choice(bases) for _ in range(n_bits)]
bob_bits = [
transmitted_bits[i] if bob_bases[i] == alice_bases[i]
else random.randint(0, 1)
for i in range(n_bits)
]
# 기저 일치한 인덱스만 원시 키로
matched = [i for i in range(n_bits) if alice_bases[i] == bob_bases[i]]
alice_key = [alice_bits[i] for i in matched]
bob_key = [bob_bits[i] for i in matched]
errors = sum(a != b for a, b in zip(alice_key, bob_key))
error_rate = errors / len(alice_key) if alice_key else 0
return alice_key, bob_key, error_rate
key_a, key_b, err = bb84_simulation(n_bits=100, eve_present=True)
print(f"원시 키 길이: {len(key_a)}, 오류율: {err:.1%}")
# 예) 원시 키 길이: 49, 오류율: 24.5%
실제 응용
- 금융·정부 통신: 중국의 묵자(Micius) 위성은 위성 기반 QKD를 통해 장거리 양자 암호 통신을 실증했다.
- 양자 인터넷의 기반: QKD는 향후 양자 인터넷에서 노드 간 보안 채널을 담당할 핵심 기술이다.
- 포스트 양자 암호(PQC)와의 비교: PQC는 수학적 난제를 이용하는 반면, QKD는 물리 법칙에 기반하므로 원리적으로 더 강력하다.
정리
QKD는 도청 행위 자체가 물리적으로 탐지 가능하다는 점에서 고전 암호와 본질적으로 다르다. 측정이 상태를 교란한다는 양자역학의 원리와 복제 불가 정리가 결합되어, 완벽한 보안을 물리 법칙 수준에서 보장한다. BB84 프로토콜은 이 원리를 편광 광자와 무작위 기저 선택만으로 구현한 우아한 방법이다.
연습문제
Q1.Alice가 + 기저로 $|0\rangle$ (→ 편광) 광자를 보냈다. Bob이 × 기저로 측정했을 때 얻는 비트값과 그 확률은?
힌트 보기
× 기저의 두 상태 $|+\rangle = \frac{1}{\sqrt{2}}(|0\rangle+|1\rangle)$, $|-\rangle = \frac{1}{\sqrt{2}}(|0\rangle-|1\rangle)$로 $|0\rangle$를 전개해 보라.
해설 보기
$|0\rangle = \frac{1}{\sqrt{2}}|+\rangle + \frac{1}{\sqrt{2}}|-\rangle$ 이므로, Bob이 × 기저로 측정하면 0(↗) 또는 1(↖)을 각각 50% 확률로 얻는다. 결과가 무작위이므로 이 비트는 키 생성에 사용하지 않는다.
Q2.Eve가 모든 광자를 도청하되, 기저를 항상 + 로만 선택한다고 가정하자. Alice가 + 기저로 보낸 광자에 대한 오류율과 × 기저로 보낸 광자에 대한 오류율은 각각 얼마인가?
해설 보기
Alice가 + 기저로 보낸 경우, Eve의 기저가 일치하므로 오류 없이 통과한다(오류율 0%). Alice가 × 기저로 보낸 경우, Eve가 + 기저로 측정해 결과가 무작위가 되고, Bob이 × 기저로 측정할 때 50% 확률로 틀린 값을 받는다(오류율 50%). 전체 평균 오류율은 약 25%가 된다.
Q3.복제 불가 정리가 없다면 QKD의 보안에 어떤 영향을 미치는가?
해설 보기
Eve가 광자를 완벽히 복사해 원본은 Bob에게 전달하고 복사본은 나중에 기저가 공개된 뒤 측정할 수 있다. 이 경우 양자 상태 교란 없이 정보를 도청할 수 있어 BB84의 도청 탐지 메커니즘이 완전히 무력화된다. 복제 불가 정리는 QKD 보안의 필수 물리적 전제다.