네트워크 보안의 원리 (1) - 암호화의 수학적 기초 - soo:bak
작성일 :
네트워크에서 보안이 필요한 이유
네트워크 통신의 원리 시리즈에서 데이터가 어떻게 전송되는지 살펴보았습니다.
하지만 중요한 문제가 있습니다.
네트워크를 지나는 데이터는 누구나 볼 수 있습니다.
이더넷은 같은 세그먼트의 모든 트래픽이 보입니다.
Wi-Fi는 공기 중에 방송됩니다.
인터넷은 수많은 라우터를 거칩니다.
이 중 어디서든 도청이 가능합니다.
네트워크 보안의 세 가지 목표:
- 기밀성(Confidentiality): 허가되지 않은 자가 내용을 볼 수 없어야 함
- 무결성(Integrity): 데이터가 전송 중 변조되지 않았음을 보장
- 인증(Authentication): 통신 상대방이 실제로 그 사람인지 확인
이 세 가지를 달성하는 핵심 도구가 암호화(Cryptography)입니다.
암호화의 기본 개념
암호화는 평문(plaintext)을 암호문(ciphertext)으로 변환하는 것입니다.
복호화는 암호문을 다시 평문으로 변환하는 것입니다.
1
2
평문 ──[암호화]──► 암호문 ──[복호화]──► 평문
키 사용 키 사용
핵심은 키(Key)입니다.
같은 알고리즘을 사용해도 키가 다르면 결과가 다릅니다.
키를 모르면 복호화할 수 없습니다.
암호화 방식은 크게 두 가지:
- 대칭키 암호(Symmetric Key): 암호화와 복호화에 같은 키 사용
- 비대칭키 암호(Asymmetric Key): 서로 다른 키 사용
대칭키 암호: 빠르고 효율적
대칭키 암호는 암호화와 복호화에 동일한 키를 사용합니다.
1
2
3
4
5
6
7
Alice Bob
│ │
│ 평문 ──[키 K로 암호화]──► 암호문 │
│ ────────────────────► │
│ │
│ [키 K로 복호화] │
│ 암호문 ──► 평문 │
장점:
- 빠른 연산 (하드웨어 가속 가능)
- 적은 계산 비용
단점:
- 키 교환 문제: 키를 어떻게 안전하게 전달할 것인가?
- 통신 상대마다 별도의 키 필요 (n명이면 n(n-1)/2개의 키)
대표적인 대칭키 알고리즘: AES(Advanced Encryption Standard)
AES: 현대 대칭키 암호의 표준
AES는 2001년 NIST가 DES를 대체하기 위해 선정한 표준입니다.
벨기에 암호학자 Joan Daemen과 Vincent Rijmen이 설계한 Rijndael 알고리즘입니다.
AES의 구조:
- 블록 크기: 128비트 (16바이트)
- 키 크기: 128, 192, 또는 256비트
- 라운드 수: 10, 12, 또는 14 (키 크기에 따라)
AES는 치환-순열 네트워크(Substitution-Permutation Network, SPN) 구조입니다.
한 라운드의 연산:
- SubBytes (바이트 치환)
- 각 바이트를 S-box를 통해 다른 값으로 변환
- 비선형성 제공 (분석을 어렵게 함)
- ShiftRows (행 이동)
- 4×4 행렬의 각 행을 왼쪽으로 시프트
- 0, 1, 2, 3바이트씩
- MixColumns (열 혼합)
- 각 열에 행렬 곱셈 적용
- 바이트들을 섞어 확산(diffusion) 제공
- AddRoundKey (라운드 키 덧셈)
- 현재 상태와 라운드 키를 XOR
- 키의 영향력 주입
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
입력 블록 (128비트)
│
▼
┌─────────────┐
│ SubBytes │ ← 비선형 치환
└─────────────┘
│
▼
┌─────────────┐
│ ShiftRows │ ← 행 이동
└─────────────┘
│
▼
┌─────────────┐
│ MixColumns │ ← 열 혼합
└─────────────┘
│
▼
┌─────────────┐
│AddRoundKey │ ← 라운드 키 XOR
└─────────────┘
│
▼
(반복)
왜 이렇게 설계했을까요?
혼돈(Confusion): SubBytes가 담당. 키와 암호문의 관계를 복잡하게.
확산(Diffusion): ShiftRows와 MixColumns가 담당. 평문의 한 비트가 바뀌면 암호문의 많은 비트가 바뀜.
이 두 성질이 결합되어 통계적 분석을 어렵게 만듭니다.
블록 암호 운용 모드
AES는 128비트 블록을 암호화합니다.
더 긴 데이터는 어떻게 처리할까요?
ECB(Electronic Codebook): 가장 단순, 각 블록을 독립적으로 암호화
1
2
3
평문1 ──[암호화]──► 암호문1
평문2 ──[암호화]──► 암호문2
평문3 ──[암호화]──► 암호문3
문제: 같은 평문 블록은 같은 암호문이 됨. 패턴이 드러남.
유명한 예: ECB 펭귄 (이미지를 ECB로 암호화하면 원본 윤곽이 보임)
CBC(Cipher Block Chaining): 각 블록을 이전 암호문과 XOR 후 암호화
1
2
3
평문1 ⊕ IV ──[암호화]──► 암호문1
평문2 ⊕ 암호문1 ──[암호화]──► 암호문2
평문3 ⊕ 암호문2 ──[암호화]──► 암호문3
IV(Initialization Vector)는 무작위 값.
같은 평문도 IV가 다르면 다른 암호문.
GCM(Galois/Counter Mode): 암호화와 인증을 동시에
- CTR 모드로 암호화 (카운터를 암호화하여 평문과 XOR)
- GHASH로 인증 태그 생성
- AEAD(Authenticated Encryption with Associated Data) 제공
GCM이 현대 네트워크 보안에서 가장 널리 사용됩니다.
TLS 1.3에서 AES-GCM이 필수입니다.
비대칭키 암호: 키 교환 문제의 해결
대칭키의 문제: 키를 어떻게 안전하게 공유할까?
1976년, Whitfield Diffie와 Martin Hellman이 새로운 방식을 발표합니다.
공개키 암호화(Public Key Cryptography).
핵심 아이디어:
- 두 개의 키: 공개키(public key)와 개인키(private key)
- 공개키로 암호화하면 개인키로만 복호화 가능
- 개인키로 서명하면 공개키로 검증 가능
1
2
3
4
5
6
7
Alice Bob
│ │
│ Bob의 공개키로 암호화 ──────────► │
│ 암호문 │
│ │
│ Bob의 개인키로 │
│ 복호화 │
Bob의 공개키는 누구나 알 수 있습니다.
하지만 복호화는 Bob의 개인키로만 가능합니다.
Bob만 개인키를 가지고 있으므로 Bob만 읽을 수 있습니다.
어떻게 이것이 수학적으로 가능할까요?
RSA: 소인수분해의 어려움
RSA는 1977년 Ron Rivest, Adi Shamir, Leonard Adleman이 발명했습니다.
수학적 기반: 큰 수의 소인수분해는 어렵다.
키 생성:
- 두 개의 큰 소수 p와 q를 선택 (각각 1024비트 이상)
- n = p × q 계산
- φ(n) = (p-1) × (q-1) 계산 (오일러 파이 함수)
- 1 < e < φ(n)이고 gcd(e, φ(n)) = 1인 e 선택 (보통 65537)
- e × d ≡ 1 (mod φ(n))인 d 계산
공개키: (n, e)
개인키: d
암호화: c = m^e mod n
복호화: m = c^d mod n
왜 안전할까요?
공격자는 n과 e를 알 수 있습니다.
d를 알아내려면 φ(n)이 필요합니다.
φ(n) = (p-1)(q-1)이므로 p와 q가 필요합니다.
n = p × q에서 p와 q를 찾는 것이 소인수분해 문제입니다.
작은 수는 쉽습니다: 15 = 3 × 5
큰 수는 어렵습니다: 2048비트 수를 소인수분해하는 알려진 효율적인 방법이 없습니다.
현재 컴퓨터로 2048비트 RSA를 깨는 데는 우주의 나이보다 긴 시간이 걸릴 것으로 추정됩니다.
Diffie-Hellman: 안전한 키 교환
RSA는 암호화에 쓸 수 있지만, 계산 비용이 큽니다.
대칭키 암호가 훨씬 빠릅니다.
해결책: 비대칭키로 대칭키를 교환하고, 대칭키로 실제 데이터를 암호화.
Diffie-Hellman 키 교환은 공개 채널에서 공유 비밀을 만드는 방법입니다.
수학적 기반: 이산 로그 문제
g^x mod p에서 g, p, g^x mod p가 주어졌을 때 x를 찾기 어렵다.
과정:
- Alice와 Bob이 공개 값 p(큰 소수)와 g(원시근)에 합의
- Alice는 비밀 값 a를 선택하고 A = g^a mod p를 Bob에게 전송
- Bob은 비밀 값 b를 선택하고 B = g^b mod p를 Alice에게 전송
- Alice는 s = B^a mod p 계산
- Bob은 s = A^b mod p 계산
1
2
3
4
5
6
7
8
9
10
11
12
Alice Bob
│ │
│ a (비밀) │ b (비밀)
│ A = g^a mod p ─────────────────► │
│ │
│ ◄───────────────── B = g^b mod p │
│ │
│ s = B^a mod p │ s = A^b mod p
│ = (g^b)^a mod p │ = (g^a)^b mod p
│ = g^(ab) mod p │ = g^(ab) mod p
│ │
└────────► 같은 비밀 s ◄─────────────┘
도청자는 p, g, A, B를 알 수 있습니다.
하지만 a나 b를 모르면 s를 계산할 수 없습니다.
A에서 a를 알아내는 것이 이산 로그 문제입니다.
ECDH(Elliptic Curve Diffie-Hellman)
타원곡선 위에서 Diffie-Hellman을 수행합니다.
같은 보안 수준에서 키 크기가 훨씬 작습니다.
- RSA 2048비트 ≈ ECDH 224비트
전방향 비밀성: 과거를 보호하다
일반적인 키 교환:
서버의 개인키가 유출되면?
과거에 기록된 모든 통신을 복호화할 수 있습니다.
전방향 비밀성(Forward Secrecy, FS)은 이 문제를 해결합니다.
임시 Diffie-Hellman(Ephemeral DH):
매 세션마다 새로운 DH 키 쌍을 생성합니다.
세션이 끝나면 임시 개인키를 폐기합니다.
1
2
3
4
5
세션 1: a₁, b₁ → s₁
세션 2: a₂, b₂ → s₂
세션 3: a₃, b₃ → s₃
각 세션의 임시 개인키는 세션 후 폐기됨
서버의 장기 개인키가 유출되어도:
- 과거 세션의 임시 키는 이미 폐기됨
- 과거 세션을 복호화할 수 없음
TLS 1.3은 전방향 비밀성을 필수로 요구합니다.
해시 함수: 디지털 지문
해시 함수는 임의 길이의 입력을 고정 길이의 출력으로 변환합니다.
1
2
"Hello" ──[SHA-256]──► 185f8db32271fe25f561a6fc938b2e26...
"Hello!" ──[SHA-256]──► 33b55d... (완전히 다른 값)
암호학적 해시 함수의 속성:
- 일방향성: 해시값에서 원본을 찾기 불가능
- 충돌 저항성: 같은 해시값을 가지는 두 입력을 찾기 어려움
- 눈사태 효과: 입력이 조금만 바뀌어도 출력이 크게 변함
주요 해시 함수:
- MD5: 128비트 출력, 충돌 발견됨 (사용 금지)
- SHA-1: 160비트 출력, 충돌 발견됨 (사용 금지)
- SHA-256: 256비트 출력, 현재 안전
- SHA-3: NIST 표준, SHA-2와 다른 구조
해시의 용도:
- 무결성 검증: 파일/메시지가 변조되지 않았는지 확인
- 비밀번호 저장: 원본 대신 해시값 저장
- 디지털 서명: 메시지 전체 대신 해시에 서명
HMAC: 키가 있는 해시
일반 해시는 누구나 계산할 수 있습니다.
공격자가 메시지와 해시를 모두 변조할 수 있습니다.
HMAC(Hash-based Message Authentication Code)은 키를 사용합니다.
1
2
3
4
5
6
HMAC(K, m) = H((K ⊕ opad) || H((K ⊕ ipad) || m))
K: 비밀 키
m: 메시지
H: 해시 함수
opad, ipad: 패딩 상수
키를 모르면 올바른 HMAC을 생성할 수 없습니다.
수신자는 같은 키로 HMAC을 계산하여 검증합니다.
HMAC-SHA256은 TLS에서 메시지 인증에 사용됩니다.
디지털 서명: 부인 방지
HMAC은 대칭키를 사용합니다.
송신자와 수신자 모두 같은 키를 알고 있습니다.
누가 메시지를 보냈는지 제3자에게 증명할 수 없습니다.
디지털 서명은 비대칭키를 사용합니다.
서명 과정:
- 메시지의 해시를 계산
- 해시를 개인키로 암호화 (서명)
- 메시지와 서명을 전송
검증 과정:
- 수신한 메시지의 해시를 계산
- 서명을 공개키로 복호화
- 두 해시가 일치하면 검증 성공
1
2
3
4
5
6
7
8
9
10
Alice (서명) Bob (검증)
│ │
│ H(m) = 해시 │
│ sig = H(m)^d mod n │
│ │
│ ───────── m, sig ─────────────► │
│ │
│ H(m) 계산 │
│ sig^e mod n 계산 │
│ 두 값 비교 │
서명의 의미:
- 인증: 개인키 소유자만 서명 가능
- 무결성: 메시지 변조 시 서명 검증 실패
- 부인 방지: 서명자가 나중에 부인할 수 없음
암호화 시스템의 조합
실제 시스템은 여러 암호화 기법을 조합합니다.
하이브리드 암호화:
- 무작위 대칭키(세션 키) 생성
- 세션 키를 수신자의 공개키로 암호화
- 데이터를 세션 키로 암호화 (AES-GCM)
- 암호화된 세션 키 + 암호화된 데이터 전송
1
2
3
4
5
6
7
8
9
송신자:
세션키 K ──[수신자 공개키로 암호화]──► 암호화된 K
데이터 ──[K로 AES-GCM 암호화]──► 암호화된 데이터
전송: {암호화된 K, 암호화된 데이터}
수신자:
암호화된 K ──[개인키로 복호화]──► K
암호화된 데이터 ──[K로 복호화]──► 데이터
이 방식의 장점:
- RSA의 키 교환 능력 활용
- AES의 빠른 대칭키 암호화 활용
- 대용량 데이터도 효율적으로 처리
Part 2에서는 이런 암호화 기법들이 TLS에서 어떻게 조합되어 안전한 연결을 만드는지 살펴봅니다.
관련 글