June

3-1) 시스템소프트웨어

01. Intro

1. 대칭 암호화 (Symmetric Encryption) 기본 구조

javascript
Alice → E(k, m) = c → Bob → D(k, c) = m
기호의미
E, D암호화/복호화 알고리즘 (cipher)
k비밀 키 (e.g. 128 bits)
m평문 (plaintext)
c암호문 (ciphertext)
암호화 알고리즘은 공개되어 있다. 절대로 독자적인 암호를 만들지 말 것.

키 사용 방식

  • One-time key: 메시지 하나에 키 하나
  • Many-time key: 여러 메시지에 동일 키 사용 → 추가적인 장치 필요

2. 역사 (History of Ciphers)

대칭 암호 (Symmetric Ciphers)

  • 알파벳을 다른 알파벳으로 치환
  • Caesar Cipher: 키 없이 고정된 이동값 사용
  • 키 공간 크기 (26자 기준): 26! ≈ 2⁸⁸

해독 방법

  • 영어 알파벳 빈도 분석 (가장 흔한 글자 → 'E')
  • 두 글자 쌍(digram), 세 글자 쌍(trigram) 빈도 분석
javascript
k = C R Y P T O C R Y P T O ...
m = W H A T A N I C E D A Y ...
c = Z Z Z J U C L U D T U N ...
(+mod 26)

해독: 가장 빈번한 암호문 글자가 'H'라면, 키의 첫 글자 = 'H' - 'E' = 'C'

  • 초기 예: Hebern machine (단일 로터)
  • 가장 유명한 예: Enigma (3~5개 로터)
    • 키 수: 2⁶⁴ = 2¹⁸ (플러그보드 포함 시 실제 2³⁶)
  • 키 수: 2⁵⁶, 블록 크기: 64 bits
  • 현재는 AES (2001), Salsa20 (2008) 등 사용

3. 이산 확률 (Discrete Probability)

암호학에서 이산 확률이 왜 필요한가?
암호 알고리즘은 키를 랜덤하게 뽑는다. "얼마나 안전한가"를 수학적으로 표현하려면 확률 언어가 필요하다.

① 표본 공간 (Universe) U

U는 모든 가능한 결과의 집합 (유한 집합)

암호학에서 가장 자주 쓰이는 표본 공간:

javascript
U = {0,1}ⁿ  ← n비트 문자열 전체

n=2 이면: U = {00, 01, 10, 11}  (원소 4개)
n=3 이면: U = {000, 001, 010, 011, 100, 101, 110, 111}  (원소 8개)

② 확률 분포 (Probability Distribution)

정의: 함수 P: U → [0,1] 이고 Σ P(x) = 1 (x∈U)

예시 1 — 균등 분포 (Uniform Distribution): 모든 원소가 동일 확률

javascript
U = {00, 01, 10, 11}
P(00) = P(01) = P(10) = P(11) = 1/4

일반식: P(x) = 1/|U|

예시 2 — 점 분포 (Point Distribution): 하나의 원소에 확률 1

javascript
U = {00, 01, 10, 11},  x₀ = 10 이라면
P(10) = 1,  P(00) = P(01) = P(11) = 0
암호학과의 연결: 키 k를 균등 분포로 뽑는다 = 모든 가능한 키 중 하나를 완전히 랜덤하게 선택한다는 뜻

③ 이벤트 (Event)

정의: 이벤트 A는 U의 부분집합 (A ⊆ U)

확률: Pr[A] = Σ P(x), x∈A

구체적 예시: U = {0,1}⁸ (8비트 문자열, 원소 256개), 균등 분포

javascript
A = { x ∈ U | 하위 2비트가 11인 x }
    = {00000011, 00000111, 00001011, ..., 11111111}
    → 총 64개 원소 (256 / 4)

Pr[A] = 64/256 = 1/4

직관: 8비트 중 마지막 2비트가 "11"일 확률 = (1/2)×(1/2) = 1/4


④ 합집합 경계 (Union Bound)

정리: Pr[A₁ ∪ A₂] ≤ Pr[A₁] + Pr[A₂]

왜 등호가 아닌가? A₁과 A₂가 겹치는 원소는 두 번 더해지므로 실제 확률은 이 합보다 작거나 같다.

구체적 예시: U = {0,1}ⁿ, 균등분포

javascript
A= { x | lsb₂(x) = 11 }  → Pr[A₁] = 1/4
A= { x | msb₂(x) = 11 }  → Pr[A₂] = 1/4

Pr[하위 2비트=11 또는 상위 2비트=11]
  = Pr[A₁ ∪ A₂]
1/4 + 1/4 = 1/2
암호학과의 연결: "어떤 공격이 성공할 확률"을 여러 경우로 나눠 각각 bound를 구하고 합산하는 데 쓰인다.

⑤ 확률 변수 (Random Variable)

정의: 확률 변수 X는 함수 X: U → V

  • 표본 공간 U의 원소를 값 집합 V의 원소로 매핑
  • X가 V 위에 새로운 분포를 유도함

구체적 예시: U = {0,1}ⁿ, V = {0,1}

javascript
X(y) = lsb(y)  ← y의 마지막 비트

U의 원소들:
  ...0X = 0  (절반)
  ...1X = 1  (절반)

Pr[X = 0] = 1/2
Pr[X = 1] = 1/2

또 다른 예시: U = {0,1}², X = r₁ + r₂ (두 비트의 합)

javascript
원소  X값
000
011
101
112

Pr[X=0] = 1/4,  Pr[X=1] = 2/4 = 1/2,  Pr[X=2] = 1/4

⑥ 균등 랜덤 변수 (Uniform Random Variable)

표기: r ←ᴿ U (r을 U에서 균등하게 뽑는다)

javascript
모든 a∈U에 대해 Pr[r = a] = 1/|U|

암호학에서 가장 중요한 개념 중 하나. 키를 "랜덤하게" 뽑는다는 것이 바로 이것.


⑦ 독립 (Independence)

이벤트 A, B가 독립: Pr[A ∩ B] = Pr[A] · Pr[B]

확률 변수 X, Y가 독립: ∀a,b∈V: Pr[X=a ∧ Y=b] = Pr[X=a] · Pr[Y=b]

구체적 예시: U = {00, 01, 10, 11}, r ←ᴿ U

javascript
X = lsb(r)  (마지막 비트)
Y = msb(r)  (첫 번째 비트)

Pr[X=0Y=0] = Pr[r=00] = 1/4
Pr[X=0] · Pr[Y=0] = 1/2 · 1/2 = 1/4

→ X와 Y는 독립!

독립이 아닌 예시: X = lsb(r), Z = X (당연히 Z=X와 연동됨)

javascript
Pr[X=0Z=1] = 0  (불가능)
Pr[X=0] · Pr[Z=1] = 1/2 · 1/2 = 1/40  → 독립 아님

⑧ XOR의 핵심 성질

XOR란?: 두 비트열의 비트 단위 덧셈 (mod 2)

javascript
  0 1 1 0 1 1 1
1 0 1 1 0 1 0
= 1 1 0 1 1 0 1
aba⊕b
000
011
101
110

[핵심 정리] Y가 {0,1}ⁿ 위의 임의 확률변수, X가 독립적인 균등 확률변수일 때:

Z := Y ⊕ X 는 균등 확률변수

증명 (n=1 경우):

javascript
Pr[Z=0] = Pr[YX = 0]
         = Pr[Y=0X=0] + Pr[Y=1X=1]   ← YX=0이 되려면 Y=X
         = Pr[Y=0]·Pr[X=0] + Pr[Y=1]·Pr[X=1]   ← 독립성 사용
         = Pr[Y=0]·(1/2) + Pr[Y=1]·(1/2)
         = (1/2)·(Pr[Y=0] + Pr[Y=1])
         = (1/21  =  1/2

Z=0과 Z=1이 각각 1/2 확률 → 균등분포
암호학과의 연결: OTP의 완전 비밀성이 바로 이 성질에서 나온다.
m(평문)이 어떤 분포든, k(키)가 균등하면 c = m⊕k 도 균등 → 암호문에서 평문 정보를 얻을 수 없음

⑨ 생일 역설 (Birthday Paradox)

상황: r₁, r₂, ..., rₙ ∈ U 를 독립적·균등하게 뽑을 때, 같은 값이 두 번 나올 확률

정리: n = 1.2 × |U|^(1/2) 이면 Pr[∃i≠j: rᵢ = rⱼ] ≥ 1/2

직관적 이해: 1년 365일 중 생일이 같은 사람 두 명이 있으려면 몇 명이 필요할까?

javascript
|U| = 365
36519.1
1.2 × 19.1 ≈ 23명

→ 23명만 모여도 생일이 같은 쌍이 있을 확률 ≥ 50%

암호학에서의 중요성:

javascript
|U| = {0,1}¹²⁸  →  |U| = 2¹²⁸
√(2¹²⁸) = 2⁶⁴

2⁶⁴개만 샘플링해도 같은 값이 나올 확률 ≥ 50%
이것이 실제로 중요한 이유: 예를 들어 128비트 난수를 키로 쓸 때, 2⁶⁴번 이상 키를 재생성하면 충돌(같은 키 재사용) 가능성이 높아진다. 암호 시스템 설계 시 반드시 고려해야 한다.

02. Stream Ciphers & OTP

1. 대칭 암호 정의 (Symmetric Cipher)

정의: (K, M, C) 위에서 정의된 암호는 "효율적" 알고리즘 쌍 (E, D)

  • E는 종종 확률적(randomized), D는 항상 결정론적(deterministic)
  • ∀m∈M, k∈K: D(k, E(k, m)) = m (정확성 조건)

2. One Time Pad (OTP)

Vernam (1917) — 최초의 "안전한" 암호

  • 키 = 메시지와 같은 길이의 랜덤 비트 문자열
  • 암호화: c = m ⊕ k
  • 복호화: m = c ⊕ k

예시

javascript
msg: 0 1 1 0 1 1 1
key: 1 0 1 1 0 1 0
CT:  1 1 0 1 1 0 1
OTP 키 복원: k = m ⊕ c (평문과 암호문을 알면 키를 바로 구할 수 있음)

OTP의 특징

  • 매우 빠른 암호화/복호화
  • 단점: 키가 평문만큼 길어야 함

3. 완전 비밀성 (Perfect Secrecy)

Shannon (1949) 정보이론적 보안

정의: 암호 (E,D)가 (K,M,C)에서 완전 비밀성을 가진다.

∀m₀, m₁ ∈ M (|m₀| = |m₁|) 이고 ∀c∈C:

Pr[E(k, m₀) = c] = Pr[E(k, m₁) = c] (k ←ᴿ K)

→ 암호문으로부터 평문에 대한 어떤 정보도 얻을 수 없음

보조정리: OTP는 완전 비밀성을 가진다.

나쁜 소식: 완전 비밀성 → 키 길이 ≥ 메시지 길이


4. 스트림 암호 (Stream Ciphers)

아이디어: OTP에서 "랜덤" 키를 "유사난수(pseudorandom)" 키로 대체

PRG (Pseudorandom Generator): G: K → {0,1}ⁿ

  • 시드(seed) k에서 긴 유사난수 시퀀스 생성
  • 스트림 암호: E(k, m) = m ⊕ G(k), D(k, c) = c ⊕ G(k)
스트림 암호는 완전 비밀성을 가질 수 없다! (키가 메시지보다 짧으므로)
→ 다른 보안 정의 필요

5. PRG 보안 요건

PRG는 예측 불가능해야 함 (Unpredictable)

정의: G: K → {0,1}ⁿ이 예측 가능하다면:

어떤 효율적 알고리즘 A가 존재하여, G(k)의 첫 i 비트로 (i+1)번째 비트를 non-negligible 확률로 예측

PRG가 예측 불가능 ⟺ ∀i: 어떤 효율적인 공격자도 (i+1)번째 비트를 non-negligible ε로 예측 불가능

약한 PRG 예시 (사용 금지)

  • glibc random(): r[i] ← (r[i-3] + r[i-31]) % 2³² 출력 r[i] >> 1

6. Negligible vs Non-negligible

구분기준의미
Non-negligibleε ≥ 1/2³⁰1GB 데이터에서 발생 가능
Negligibleε ≤ 1/2⁸⁰키의 수명 동안 발생 불가

이론적 정의 (ε는 보안 파라미터 λ의 함수):

  • Non-neg: ∃d: ε(λ) ≥ 1/λᵈ (무한히 자주)
  • Negligible: ∀d, λ≥λ_d: ε(λ) ≤ 1/λᵈ

예시

  • ε(λ) = 1/2^λ → Negligible
  • ε(λ) = 1/λ¹⁰⁰⁰ → Non-negligible

7. OTP 및 스트림 암호 공격

공격 1: Two Time Pad (키 재사용 금지!)

같은 키로 두 메시지를 암호화하면:

javascript
C= m₁ ⊕ PRG(k)
C= m₂ ⊕ PRG(k)
C₁ ⊕ C= m₁ ⊕ m₂

→ 영어/ASCII의 중복성으로 m₁, m₂ 복원 가능

실제 사례

  • Project Venona (소련 첩보 해독)
  • MS-PPTP (Windows NT): 클라이언트→서버, 서버→클라이언트에 다른 키 필요
  • 802.11b WEP 취약점: IV = 24비트 → 2²⁴ ≈ 16M 프레임 후 IV 재사용

공격 2: 무결성 없음 (OTP는 malleable)

javascript
enc(⊕k): m  →  m⊕k
⊕p             ↓
dec(⊕k): (m⊕k)⊕p = m⊕p

암호문에 대한 수정이 감지되지 않고, 평문에 예측 가능한 영향을 미침

: "From: Bob" → "From: Eve" 로 변조 가능

스트림 암호 키는 절대 두 번 사용하지 말 것!
- 네트워크: 세션마다 새 키 협상 (e.g. TLS)
- 디스크 암호화: 스트림 암호 사용 지양

8. 실제 스트림 암호들

RC4 (1987, Software)

  • 시드: 128비트 → 1바이트/라운드 출력
  • HTTPS, WEP에 사용
  • 취약점:
    • 두 번째 바이트 편향: Pr[2nd byte = 0] = 2/256
    • (0,0) 연속 확률 이상
    • 연관 키(related key) 공격

CSS (Hardware, 취약)

  • DVD 암호화: 2개의 LFSR(Linear Feedback Shift Register)
  • GSM A5/1,2: 3개 LFSR
  • Bluetooth E0: 4개 LFSR
  • CSS 공격: 2¹⁷ 시간복잡도로 해독 가능

eStream: Salsa20 (현대)

  • Salsa20: {0,1}¹²⁸ or ²⁵⁶ × {0,1}⁶⁴ → {0,1}ⁿ (최대 n = 2⁷³ bits)
  • Nonce: 주어진 키에 대해 반복되지 않는 값
  • E(k, m; r) = m ⊕ PRG(k; r) ← (k, r) 쌍은 한 번만 사용

성능 비교 (AMD Opteron 2.2GHz)

PRG속도 (MB/sec)
RC4126
Salsa20/12643
Sosemanuk727

9. PRG 보안 정의

통계적 테스트 (Statistical Test)

A: {0,1}ⁿ → {0, 1} (출력이 랜덤처럼 보이는지 판단)

Advantage (우위)

Adv_PRG[A, G] = | Pr[A(G(k))=1] - Pr[A(r)=1] |

  • A(x) = 0이면 항상 → Adv = 0
  • G의 편향이 있으면 Adv > 0

안전한 PRG 정의

G: K → {0,1}ⁿ이 안전한 PRG ⟺ 모든 효율적 통계 테스트 A에 대해 Adv_PRG[A,G]가 negligible

안전한 PRG ⇒ 예측 불가능 (Yao'82: 그 역도 성립)


10. 의미론적 보안 (Semantic Security)

직관: 암호문은 평문에 대한 어떤 정보도 노출하지 않아야 함

정의 (one-time key):

  • Challenger가 m_b를 E(k, m_b)로 암호화
  • 공격자 A가 b'을 추측
  • Adv_SS[A, E] = |Pr[W₀] - Pr[W₁]|

E가 의미론적으로 안전 ⟺ 모든 효율적 공격자 A에 대해 Adv_SS[A, E]가 negligible

OTP는 의미론적으로 안전하다 (완전 비밀성에서 직접 따름)

핵심 정리:

G가 안전한 PRG이면 G에서 유도된 스트림 암호 E는 의미론적으로 안전하다.
∀sem.sec. 공격자 A에 대해 ∃PRG 공격자 B s.t.:
Adv_SS[A, E] ≤ 2 · Adv_PRG[B, G]

03. Block Ciphers

1. 블록 암호란? (What is a Block Cipher?)

블록 암호는 암호학의 핵심 도구(crypto workhorse)다.

javascript
n비트 평문 블록 → [E / D, 키 k] → n비트 암호문 블록

대표 예시

알고리즘블록 크기(n)키 크기(k)
3DES64 bits168 bits
AES128 bits128 / 192 / 256 bits

2. 반복 구조 (Block Ciphers Built by Iteration)

블록 암호는 라운드 함수(Round Function) R(k, m)을 반복 적용해 만든다.

javascript
키 k → [키 확장] → k₁, k₂, ..., kₙ

평문 m → R(k₁,·) → R(k₂,·) → ...R(kₙ,·) → 암호문 c
알고리즘라운드 수
3DES48
AES-12810

3. PRF와 PRP (추상적 정의)

PRF (Pseudo Random Function)

정의: F: K × X → Y

  • (K, X, Y) 위에서 정의
  • F(k, x)를 효율적으로 계산할 수 있는 알고리즘 존재

PRP (Pseudo Random Permutation) = 블록 암호

정의: E: K × X → X

  1. E(k, x)를 효율적으로 계산 가능
  2. E(k, ·)는 일대일(one-to-one) 함수
  3. 역함수 D(k, y)도 효율적으로 계산 가능
Note: 관계: PRP는 X=Y이고 역함수가 존재하는 PRF다. 즉 모든 PRP는 PRF이기도 하다.

운영 예시

  • AES: K = X = {0,1}¹²⁸
  • 3DES: X = {0,1}⁶⁴, K = {0,1}¹⁶⁸

안전한 PRF란?

  • Funs[X,Y]: X→Y인 모든 함수의 집합, 크기 = |Y|^|X| (천문학적으로 큼)
  • S_F = { F(k,·) | k∈K } ⊆ Funs[X,Y], 크기 = |K|

직관: S_F의 랜덤 함수와 Funs[X,Y]의 랜덤 함수를 구별할 수 없으면 안전

게임으로 표현하면:

💡
Challenger가 둘 중 하나를 선택: (a) k ← K 고르고 F(k, x) 응답 (b) f ← Funs[X,Y] 고르고 f(x) 응답

Adversary가 여러 x를 질의해도 (a),(b)를 구별 못 해야 함

주의할 예시 — 안전하지 않은 PRF:

💡
G(k, x) = { 0¹²⁸ if x = 0 { F(k,x) otherwise

→ x=0을 질의하면 항상 0이 나오므로 랜덤 함수와 즉시 구별 가능. 안전하지 않음.

안전한 PRP (Secure PRP = Secure Block Cipher)

  • Perms[X]: X 위의 모든 일대일 함수(순열)의 집합
  • S_E = { E(k,·) | k∈K } ⊆ Perms[X]

직관: 적(adversary)이 다음 두 상황을 구별할 수 없으면 안전

💡
상황 1: k ← K 를 랜덤 선택 → E(k, x) 로 응답 상황 2: π ← Perms[X] 를 랜덤 선택 → π(x) 로 응답

즉, S_E에서 뽑은 랜덤 함수와 Perms[X]에서 뽑은 진짜 랜덤 순열을 구별할 수 없으면 안전한 PRP.

Note: 안전한 PRF와의 차이는 비교 대상이 Funs[X,Y] 대신 Perms[X]라는 것. PRP는 역함수가 존재하는 순열이므로 비교 대상도 순열 집합으로 좁혀짐.


4. DES (Data Encryption Standard)

Feistel 네트워크

DES의 핵심 아이디어. 임의 함수 f₁,...,f_d로 가역(invertible) 함수를 만드는 구조.

javascript
입력: (L₀, R₀)  ← 2n비트

각 라운드 i:
  Rᵢ = f_i(Rᵢ₋₁) ⊕ Lᵢ₋₁
  Lᵢ = Rᵢ₋₁

출력: (L_d, R_d)

역함수 (복호화):

javascript
Rᵢ₋₁ = Lᵢ
Lᵢ₋₁ = f_i(Lᵢ) ⊕ Rᵢ

Luby-Rackoff 정리 (1985): f가 안전한 PRF이면, 3-라운드 Feistel은 안전한 PRP(블록 암호)다.

DES는 이를 16라운드로 사용.

DES의 라운드 함수 F(kᵢ, x)

  • S-box: {0,1}⁶ → {0,1}⁴ 의 룩업 테이블 (8개)
  • P-box: 비트 순열

나쁜 S-box의 예 (선형 함수):

S(x) = Aᵢ·x (mod 2) 형태면 → DES 전체가 선형

  • DES(k, m₁) ⊕ DES(k, m₂) ⊕ DES(k, m₃) = DES(k, m₁⊕m₂⊕m₃) 가 성립
  • 이러면 매우 쉽게 해독 가능!

좋은 S/P-box 설계 원칙:

  • 출력 비트가 입력 비트의 선형 함수에 가깝지 않을 것
  • S-box는 4-to-1 매핑

5. 전수 탐색 공격 (Exhaustive Search)

목표: 입출력 쌍 (mᵢ, cᵢ) 몇 개가 주어졌을 때 키 k 찾기

보조정리: DES가 이상적 암호라면, 평문-암호문 쌍이 주어질 때 조건을 만족하는 키는 높은 확률로 유일하다.

  • DES: 입출력 쌍 2개면 키 유일 (확률 ≈ 1 - 1/2⁷¹)
  • AES-128: 입출력 쌍 2개면 키 유일 (확률 ≈ 1 - 1/2¹²⁸)

DES Challenge 결과

연도방법소요 시간
1997인터넷 분산 탐색3개월
1998EFF Deep Crack ($250K)3일
1999결합 탐색22시간
2006COPACOBANA (120 FPGAs, $10K)7일
Warning: 결론: 56비트 키 암호는 절대 사용하지 말 것! (128비트 키면 → 2⁷² 일 소요)

DES 강화: Triple-DES (3DES)

javascript
3E((k₁,k₂,k₃), m) = E(k₁, D(k₂, E(k₃, m)))
  • 키 크기: 3 × 56 = 168비트
  • DES보다 3배 느림
  • 최선 공격: ≈ 2¹¹⁸ (Double-DES의 Meet-in-the-Middle 공격보다 안전)

Double DES를 쓰지 않는 이유: Meet-in-the-Middle 공격

  • 2E((k₁,k₂), m) = E(k₁, E(k₂, m))
  • 키 길이는 112비트지만 실제 보안은 56비트 수준 (각 방향에서 절반씩 탐색)

6. AES (Advanced Encryption Standard)

  • 키 크기: 128 / 192 / 256 비트
  • 블록 크기: 128 비트

AES 구조: Substitution-Permutation Network

DES(Feistel)와 달리 Subs-Perm 네트워크 사용.

AES-128: 10라운드, 각 라운드에서 3가지 연산

  1. ByteSub: 1바이트 S-box (256-byte 룩업 테이블)
  2. ShiftRow: 행 단위 순환 시프트
  3. MixColumn: 열 단위 선형 변환
javascript
k₀ → [ByteSub + ShiftRow + MixColumn + ⊕k₁] → ... → [ByteSub + ShiftRow + ⊕k₁₀] → 출력
확장: 16 bytes → 176 bytes

7. PRG로 PRF/PRP 만들기

PRG → 1비트 PRF

javascript
G: KK²  (안전한 PRG)

F(k, x∈{0,1}) = G(k)[x]
              = G(k)[0]  (x=0일 때)
              = G(k)[1]  (x=1일 때)

도메인 확장: GGM PRF

javascript
G: KK²

F(k, x₀x₁...xₙ₋₁ ∈ {0,1}ⁿ) =
  k₀ = G(k)[x₀]
  k₁ = G(k₀)[x₁]
  ...
  kₙ = G(kₙ₋₁)[xₙ₋₁]
  • G가 안전한 PRG → F는 {0,1}ⁿ 위의 안전한 PRF
  • 이론적으로 중요하지만 실제로는 느려서 잘 안 씀

결론: 안전한 PRG → 안전한 PRF (GGM) → 안전한 PRP (Luby-Rackoff, 3라운드 Feistel)

04. Using Block Ciphers

1. ECB (Electronic Code Book) - 잘못된 방식

javascript
평문: m₁ | m₂
      ↓     ↓
     E(k) E(k)
      ↓     ↓
암호문: c₁ | c₂

문제점: m₁ = m₂이면 c₁ = c₂ → 패턴이 그대로 노출!

ECB가 의미론적으로 안전하지 않음을 증명:

javascript
공격자 A:
m₀ = "Hello World"  (두 블록이 다름)
m₁ = "Hello Hello"  (두 블록이 같음)

암호화 후 c₁ = c₂이면 → m₁으로 판단
→ Adv_SS[A, ECB] = 1  (완전히 안전하지 않음)
유명한 예: Linux 펭귄 이미지를 ECB로 암호화하면 펭귄 윤곽이 그대로 보임

3. 결정론적 카운터 모드 (Det. Counter Mode)

PRF F를 이용한 구성:

javascript
E_DETCTR(k, m):

m[0]  m[1]  m[2]  ...  m[L]
 ⊕     ⊕     ⊕          ⊕
F(k,0) F(k,1) F(k,2) ... F(k,L)
 ↓     ↓     ↓          ↓
c[0]  c[1]  c[2]  ...  c[L]

→ PRF(예: AES)로 만든 스트림 암호

보안 정리: F가 안전한 PRF이면 E_DETCTR는 one-time key 하에서 의미론적으로 안전하다.

  • Adv_SS[A, E_DETCTR] = 2 · Adv_PRF[B, F]

4. Many-time Key: CPA 보안

문제: 같은 평문 → 같은 암호문이면 안 됨

같은 키로 같은 평문을 두 번 암호화할 때 항상 같은 암호문이 나오면:

  • 공격자가 두 암호화된 파일이 동일한지 알 수 있음
  • 작은 메시지 공간에서 치명적

핵심 원칙: 같은 키로 같은 평문을 두 번 암호화하면 반드시 다른 암호문이 나와야 한다.

CPA (Chosen-Plaintext Attack) 보안 정의

  • 공격자가 원하는 평문의 암호문을 여러 번 얻을 수 있음
  • 그래도 의미론적 보안이 유지되어야 함
javascript
for i=1,...,q:
  공격자가 (mᵢ,₀, mᵢ,₁) 선택
  챌린저가 cᵢ = E(k, mᵢ,ᵦ) 반환

Adv_CPA[A,E] = |Pr[EXP(0)=1] - Pr[EXP(1)=1]| 이 negligible이어야 함

해결책 1: 무작위 암호화 (Randomized Encryption)

  • E(k, m)이 확률적 알고리즘 → 같은 평문을 두 번 암호화해도 다른 암호문
  • 단점: 암호문이 평문보다 길어짐 (CT 크기 = PT 크기 + 랜덤 비트 수)

해결책 2: Nonce 기반 암호화

javascript
Alice                              Bob
m, nonce n → E(k, m, n) = c → c, n → D(k, c, n) = m
  • nonce: 메시지마다 바뀌는 값. (키, nonce) 쌍은 절대 재사용 금지
  • 방법 1: nonce = 카운터 (상태 유지 시)
  • 방법 2: nonce = 랜덤 값 (n ←ᴿ N)

5. CBC 모드 (Cipher Block Chaining)

랜덤 IV를 사용한 CBC

javascript
IV  m[0]   m[1]   m[2]   m[3]
    ⊕       ⊕      ⊕      ⊕
   E(k,·) E(k,·) E(k,·) E(k,·)
    ↓       ↓      ↓      ↓
IV  c[0]   c[1]   c[2]   c[3]
  • IV (Initialization Vector): 매번 랜덤하게 선택
  • 암호문에 IV가 포함되어 전송됨

복호화:

javascript
m[0] = D(k, c[0]) ⊕ IV
m[i] = D(k, c[i]) ⊕ c[i-1]

CBC 보안 정리

정리: E가 (K,X)에서 안전한 PRP이면, E_CBC는 (K, X^L, X^(L+1))에서 CPA 의미론적 보안을 가진다.

javascript
Adv_CPA[A, E_CBC] ≤ 2·Adv_PRP[B, E] + 2q²L²/|X|
  • q: 동일 키로 암호화한 메시지 수
  • L: 메시지 최대 길이 (블록 수)
  • 안전 조건: q²L² << |X|

예시 (Adv ≤ 1/2³²를 원할 때):

  • AES (|X|=2¹²⁸): q·L < 2⁴⁸ → 2⁴⁸ AES 블록 후 키 교체 필요
  • 3DES (|X|=2⁶⁴): q·L < 2¹⁶

CBC 주의사항: IV 예측 가능하면 안 됨!

공격자가 다음 IV를 예측할 수 있으면 CPA 공격 가능:

javascript
공격자:
  m₀ = IV₁ ⊕ IV  (IV₁: 다음 예측 IV, IV: 현재 IV)
  → 결과적으로 E(k, 0IV₁)이 되어 패턴 노출

실제 버그: SSL/TLS 1.0에서 레코드 i의 IV = 레코드 (i-1)의 마지막 암호문 블록 → 예측 가능 → 공격 가능!

Nonce 기반 CBC

javascript
= (k, k₁) 사용
nonce → E(k₁, nonce) → IVCBC 진행

CBC 패딩

메시지가 블록 크기의 배수가 아닐 때:

  • TLS: n바이트 패딩 = n n n ... n (n개)
  • 패딩이 필요 없는 경우에도 더미 블록 추가

6. CTR 모드 (Counter Mode)

랜덤 IV를 사용한 CTR

javascript
IV  m[0]    m[1]    ...  m[L]
     ⊕        ⊕               ⊕
F(k,IV) F(k,IV+1) ... F(k,IV+L)
     ↓        ↓               ↓
IV  c[0]    c[1]    ...  c[L]
  • F는 PRF (복호화 시 역함수 불필요, 암호화만 사용)
  • 병렬 처리 가능 (CBC와 달리)

Nonce 기반 CTR

javascript
IV = [64비트 nonce | 64비트 카운터(0부터 시작)]

→ (k, IV) 쌍이 절대 겹치지 않도록 보장

CTR 보안 정리

javascript
Adv_CPA[A, E_CTR] ≤ 2·Adv_PRF[B, F] + 2q²L/|X|
  • CBC보다 더 나은 안전 한계 (q²L vs q²L²)
  • AES (|X|=2¹²⁸): q·L^(1/2) < 2⁴⁸ → 총 2⁶⁴ AES 블록 후 키 교체

7. CBC vs CTR 비교

항목CBCCTR
사용하는 기본 요소PRP (역함수 필요)PRF (역함수 불필요)
병렬 처리❌ 불가✅ 가능
보안 한계q²L² << \X\
더미 패딩 블록필요함불필요
1바이트 메시지 (nonce 기반)16배 팽창팽창 없음
💡 실용적으로는 CTR 모드가 더 유연하고 효율적이다.

8. 전체 요약

공격 모델권장 방식비고
One-time keyDet. CTR mode결정론적, 빠름
Many-time key (CPA)Rand. CBC 또는 Rand. CTR modeIV/nonce 필수
⚠️ 중요: 위 모드들은 모두 기밀성(confidentiality)만 보장. 무결성(integrity)은 별도 메커니즘 필요!

참고 논문:

  • Bellare et al., "Analysis of the DES modes of operation", FOCS 1997
  • Rogaway, "Nonce-Based Symmetric Encryption", FSE 2004

05. Collision Resistance

1. 해시 함수란?

해시 함수: H: M → T (|M| >> |T|)

  • 임의 길이 입력 → 고정 길이 출력(digest)
  • 큰 집합 M을 작은 집합 T로 압축 → 비둘기집 원리에 의해 충돌은 반드시 존재

두 가지 주요 종류

종류보호 대상키 필요 여부
Message Digest (해시)무결성(integrity)없음
MAC (Message Authentication Code)무결성 + 인증(authenticity)비밀키 필요

2. 충돌 저항성 (Collision Resistance)

충돌(Collision): m₀, m₁ ∈ M이 충돌 ⟺ H(m₀) = H(m₁) 이고 m₀ ≠ m₁

충돌 저항 정의: H가 충돌 저항적이다

⟺ 모든 효율적 알고리즘 A에 대해

Adv_CR[A, H] = Pr[A가 H의 충돌을 출력] 이 negligible

예: SHA-256 (출력 256비트)

3. 해시 함수의 세 가지 조건

좋은 암호학적 해시 함수가 만족해야 할 조건:

① 계산 용이성 (Easy to compute)

  • M이 주어지면 H(M)을 쉽게 계산 가능

② 역상 저항성 (One-wayness / Preimage Resistance)

  • 어떤 h가 주어져도, H(M) = h인 M을 찾는 것이 어려워야 한다

③ 충돌 저항성 (Collision Resistance)

  • M₁이 주어졌을 때, H(M₁) = H(M₂)인 M₂를 찾는 것이 어려워야 한다

구체적 예시

javascript
// 나쁜 예 — 너무 단순한 해시
H("Elvis") = (E+L+V+I+S) mod 26
           = (5+12+22+9+19) mod 26
           = 67 mod 26 = 15

// 충돌 예시
H("Viva")  = (V+I+V+A) mod 26 = 2
H("Vegas") = (V+E+G+A+S) mod 26 = 2
→ 다른 입력, 같은 출력 → 충돌!
이런 단순 해시는 의도적 충돌을 만들기 너무 쉬워서 암호학적으로 사용 불가.

4. 생일 역설과 충돌 공격

생일 역설 복습

r₁, ..., rₙ ∈ {1, ..., B}가 균등 독립 정수일 때:

n = 1.2 × B^(1/2) 이면 Pr[∃i≠j: rᵢ = rⱼ] ≥ 1/2

해시 함수에 대한 일반적 충돌 공격

H: M → {0,1}ⁿ 에 대해 O(2^(n/2)) 시간에 충돌을 찾는 알고리즘:

javascript
알고리즘:
1. 랜덤 메시지 2^(n/2)개 선택: m₁, ..., m_{2^(n/2)}
2. 각각에 대해 tᵢ = H(mᵢ) 계산
3. tᵢ = tⱼ인 쌍을 찾는다 (충돌!)
   → 못 찾으면 1번으로 돌아가 반복

기대 반복 횟수: ≈ 2회
전체 시간복잡도: O(2^(n/2))
공간복잡도:     O(2^(n/2))

직관: 출력 공간이 2ⁿ개이고, 2^(n/2)개를 샘플링하면 생일 역설에 의해 충돌이 1/2 이상 확률로 발생

결론: n비트 출력 해시는 n/2비트 수준의 충돌 저항성만 가진다.
→ 128비트 충돌 저항을 원하면 256비트 출력 해시가 필요!

06. Integrity

메시지 무결성이란? (Message Integrity)

MAC

메시지가 중간에 변조되지 않았고, 정해진 비밀키를 아는 사람이 만든 메시지인지 확인하는 값

무결성 vs 기밀성

지금까지 배운 암호화(CBC, CTR)는 기밀성 — "내용을 숨기는 것"이 목적이었음

이번 챕터는 무결성(Integrity) — "내용이 변조되지 않았음을 증명하는 것"이 목적이다.

중요한 점: 무결성은 비밀로 숨길 필요가 없다. 예를 들어, 공개된 프로그램 파일이 진짜 원본인지 확인하는 게 목적일 때는 파일 내용을 숨길 필요가 없기 때문이다.

안전한 MAC의 정의

공격자가 할 수 있는 것: 원하는 메시지들의 tag를 서버에 요청할 수 있음 (Chosen Message Attack)

공격자의 목표: 한 번도 요청 안 한 새로운 메시지의 유효한 tag를 위조 (Existential Forgery)

안전한 MAC = 이 위조가 불가능한 MAC

tag가 5비트면 왜 안 되냐? → 공격자가 32가지 경우를 다 찍어볼 수 있어서 1/32 확률로 맞힐 수 있음. 이건 "negligible"하지 않으므로 안전하지 않다.

PRF → MAC

ECBC MAC

NMAC

CMAC (standard)

PMAC (Parallel MAC)

One time MAC

Many time MAC

중간고사 기출풀이

2023 midterm

ITE 3031 | 2023년 1학기

This exam does not allow books, reference, or internet search.
|| : 문자열 연결(concatenation) | : bitwise OR
답안은 한글 또는 영어로 작성하면 됨.

1. (5pt) Caesar Cipher

Encrypt a plaintext "WORLD" using a caesar cipher where a key k = 3.

ZRUOG


2. (5pt) OTP

Encrypt a plaintext 10111011 using a one-time pad where a key is 11110101.

01001110


3. (10pt) Secure PRG 판별

Let G : {0,1}^s → {0,1}^n be a secure PRG. For the following G′, state whether it is a secure PRG or not.

맞으면 +2pt, 틀리면 -2pt, 무응답 0pt
  • (a) G′(k) = G(k) ⊕ 1^n
  • (b) G′(k) = G(k) || 1^n
  • (c) G′(k) = G(k) ⊕ G(k)
  • (d) G′(k) = G(k) || G(k)
  • (e) G′(k) = G(k) || G(k+1)
💡
(a) secure

(b) insecure

(c) insecure

(d) insecure

(e) secure


4. (5pt) PRG Advantage 계산

Let G : K → {0,1}^n be a secure PRG.

Define G′(k₁, k₂, k₃) = G(k₁) ∨ (G(k₂) ⊕ G(k₃))

Statistical test A on {0,1}^n: A(x) outputs LSB(x).

What is Adv_PRG[A, G′]?

Assumption: LSB(G(k)) = 0 for exactly half the seeds k ∈ K
= bitwise OR

💡
1/4

5. (10pt) Secure PRF 판별 (증명 포함)

Let F : {0,1}^n × {0,1}^n → {0,1}^n be a secure PRF (n = 128).

For the following F′, state whether it is a secure PRF or not. If secure, prove by contrapositive. If not, design an attacker and compute the advantage.

  • (a) F′(k, (x₁, x₂)) = F(k, x₁) ⊕ F(k, x₂)
  • (b) F′(k, x) = F(k, x) ⊕ F(k, x ⊕ 1^n)
💡
(a) insecure

(b) insecure


6. (10pt) Semantic Security 판별 (증명 포함)

Let (E, D) be a semantically secure cipher (message/ciphertext space: {0,1}^n).

For the following E′, state whether it is semantically secure. If secure, prove by contrapositive. If not, design an attacker and compute the advantage.

  • (a) E′(k, m||m′) = E(k, m) || E(k, m′)
  • (b) E′(k, m) = E(k, m) || E(k, m ⊕ 1^n)
💡
(a) insecure

(b) secure


7. (15pt) 대칭 암호 시스템 분석

K = M = {0,1,2,...,9}, C = {0,1,2,...,9}

E(k, m) = (2·k + m) mod 10

  • (a) 대응하는 decryption function D(k, c)를 구하시오.
  • (b) 이 암호 시스템이 information-theoretically secure (perfectly secure)인가? 이유는?
  • (c) E(k, m) = (3·k + m) mod 10 이면 perfectly secure인가? 이유는?
💡
(a) D(k,c)=(c2k)mod10 \boxed{D(k,c)=(c-2k)\bmod 10}

(b) not perfect secrecy

(c) perfectly secure


8. (5pt) 2-Round Feistel PRP 판별

Let F : K × {0,1}^32 → {0,1}^32 be a secure PRF.

2-round Feistel: F₂ : K² × {0,1}^64 → {0,1}^64

One-round rule: Lᵢ ← Rᵢ₋₁, Rᵢ ← F(kᵢ, Rᵢ₋₁) ⊕ Lᵢ₋₁

다음 중 PRP F₂의 출력은 어느 것인가? (나머지 3개는 random permutation 출력)

Hint: F₂(·, 0^64) ⊕ F₂(·, 1^32 0^32)에서 감지 가능한 패턴을 먼저 찾을 것
  • (a) input 0^649d1a4f78 cb28d863 | input 1^32 0^3275e5e3ea 773ec3e6
  • (b) input 0^647b50baab 07640c3d | input 1^32 0^32ac343a22 cea46d60
  • (c) input 0^64e86d2de2 e1387ae9 | input 1^32 0^321792d21d b645c008
  • (d) input 0^647c2822eb fdc48bfb | input 1^32 0^32325032a9 c5e2364b
💡
(c), 앞 32비트를 xor했을 때 ffffffff가 나오면 정답

9. (5pt) CBC vs Counter Mode

Which of the following statements regarding CBC and counter mode is correct?

  • (a) Both counter mode and CBC mode require a block cipher (PRP).
  • (b) Counter mode encryption requires a block cipher (PRP), but CBC mode encryption only needs a PRF.
  • (c) CBC mode encryption requires a block cipher (PRP), but counter mode encryption only needs a PRF.
  • (d) Both counter mode and CBC mode can operate just using a PRF.
💡
(c)

10. (10pt) 선형 PRF 분석

Let R = {0,1}^4 and consider the PRF F : R^5 × R → R:

F(k,x)={t=k[0]for i=1 to 4: if x[i1]=1 then t=tk[i]output tF(k, x) = \begin{cases} t = k[0] \\ \text{for } i = 1 \text{ to } 4: \text{ if } x[i-1]=1 \text{ then } t = t \oplus k[i] \\ \text{output } t \end{cases}

예시: F(k, 0101) = k[0] ⊕ k[2] ⊕ k[4]

주어진 정보 (random key k 모름):

  • F(k, 0110) = 0011
  • F(k, 0101) = 1010
  • F(k, 1110) = 0110

F(k, 1101) = ?

Note: 새로운 point에서 함수 값을 예측할 수 있으므로, 이 PRF는 insecure.
💡
0011 xor 0110 → 0101

0101 xor 1010 → 1111

ans : 1111


11. (5pt) CBC / CTR 모드 — 네트워크 오류

Let m be a message consisting of l = 100 AES blocks.

  • (a) Alice encrypts m using CBC mode
  • (b) Alice encrypts m using randomized counter mode

네트워크 오류로 ciphertext block l/2 번이 손상됨. 복호화 후 몇 개의 plaintext block이 손상되는가?

💡
(a) 2

(b) 1


12. (5pt) CBC / CTR 모드 — 메모리 오류

Let m be a message consisting of l = 100 AES blocks.

  • (a) Alice encrypts m using CBC mode
  • (b) Alice encrypts m using randomized counter mode

메모리 오류로 plaintext block l/2 번이 암호화 중 손상됨. 복호화 후 몇 개의 plaintext block이 손상되는가?

💡
(a) 1

(b) 1


13. (10pt) DVD 콘텐츠 보호 (AACS)

n개의 DVD 플레이어를 이진 트리의 leaf로 봄. 각 노드에 AES 키 kᵢ 저장. DVD 영화 m 암호화:

E(k_root, k) || E(k, m)

플레이어 r의 키가 해커에게 노출됨 → 약 log₂n 개의 키로 r을 제외한 모든 플레이어가 복호화 가능하도록 header 구성.

  • (a) n개의 DVD 플레이어 중 정확히 1개의 키를 revoke할 때, content key k를 암호화해야 하는 키의 수는?
  • (b) leaf node 16, 18, 25가 노출된 경우, 해당 플레이어들을 제외하고 모든 플레이어가 복호화 가능하도록 하는 가장 작은 키 집합은? (Hint: 6개의 키만 필요)
💡
(a) log2nlog_2n

(b) {15, 17, 4, 11, 26, 6}


14. (10pt) H(H(x)) 충돌 저항성 증명

H(x)가 collision-resistant hash function이라 하자.

H(H(x))도 collision-resistant hash function임을 증명하시오.

💡
Assume G(x)=H(H(x))G(x)=H(H(x)) is not collision-resistant.

Then there exists efficient AA outputting x0x1x_0\neq x_1 such that

H(H(x0))=H(H(x1))H(H(x_0))=H(H(x_1)).

Let y0=H(x0),y1=H(x1)y_0=H(x_0), y_1=H(x_1). Then H(y0)=H(y1)H(y_0)=H(y_1).

  • if y0y1,y_0\neq y_1, then (y0,y1)(y_0,y_1) is a collision for H.H.
  • If y0=y1,y_0=y_1, then H(x0)=H(x1)H(x_0)=H(x_1) with x0x1,x_0\neq x_1, so (x0,x1)(x_0,x_1) is a collision for HH.

Hence any collision for yields a collision for HH, contradicting collision resistance of HH. Therefore H(H(x)) H(H(x)) is collision-resistant.


15. (10pt) XOR 균등 분포 증명

Y는 {0,1}²에서 정의되는 random variable, X는 {0,1}²에서 정의되는 independent uniform variable.

Z = Y ⊕ X 가 {0,1}² 에서 정의되는 uniform variable 임을 증명하시오.

💡
임의의 z{0,1}2 z\in\{0,1\}^2에 대해

Pr[Z=z]=Pr[YX=z]=y{0,1}2Pr[Y=y and X=zy] \Pr[Z=z] = \Pr[Y\oplus X=z] = \sum_{y\in\{0,1\}^2}\Pr[Y=y \text{ and } X=z\oplus y]

이다. 이때 X와 Y는 independent이므로

=y{0,1}2Pr[Y=y]Pr[X=zy] = \sum_{y\in\{0,1\}^2}\Pr[Y=y]\Pr[X=z\oplus y]

이고, X는 uniform이므로 이는 항상 1/4이다. 따라서

Pr[Z=z]=y{0,1}2Pr[Y=y]14=14 \Pr[Z=z] = \sum_{y\in\{0,1\}^2}\Pr[Y=y]\cdot \frac14 = \frac14

Y가 어떤 값이든 X와 xor하면 모든 값을 균등하게 만들어낸다.

2024 midterm

ITE 3031 | 2024년 1학기

This exam does not allow books, reference, or internet search.
|| : 문자열 연결(concatenation) | : bitwise OR
답안은 한글 또는 영어로 작성하면 됨.

1. (5pt) Substitution Cipher

Encrypt a plaintext "HELLO" using a substitution cipher where a key is:

  • E → Z
  • H → K
  • L → P
  • O → B

KZPPB


2. (5pt) OTP

Encrypt a plaintext 10111011 using a one-time pad where a key is 11110101.

01001110


3. (10pt) Secure PRG 판별

Let G : {0,1}^s → {0,1}^n be a secure PRG. For the following G′, state whether it is a secure PRG or not.

맞으면 +2pt, 틀리면 -2pt, 무응답 0pt
  • (a) G′(k) = G(k) ⊕ G(0)
  • (b) G′(k) = G(k) || 1^n
  • (c) G′(k) = G(k) ⊕ G(k)
  • (d) G′(k) = G(k) ⊕ G(k+1)
  • (e) G′(k) = G(k) || G(k+1)
💡
(a) secure

(b) insecure

(c) insecure

(d) secure

(e) secure


4. (10pt) PRG Advantage 계산

Let G : K → {0,1}^n be a secure PRG.

  • (a) G′(k₁, k₂, k₃) = G(k₁) ∨ (G(k₂) ⊕ G(k₃))
  • (b) G′(k₁, k₂, k₃) = (G(k₁) ∨ G(k₂)) ⊕ G(k₃)

Statistical test A on {0,1}^n: A(x) outputs LSB(x).

What is Adv_PRG[A, G′] for each case?

Assumption: LSB(G(k)) = 0 for exactly half the seeds k ∈ K
= bitwise OR
💡
(a) 1/4

(b) 0


5. (10pt) Secure PRF 판별 (증명 포함)

Let F : {0,1}^n × {0,1}^n → {0,1}^n be a secure PRF (n = 128).

For the following F′, state whether it is a secure PRF or not. If secure, prove by contrapositive. If not, design an attacker and compute the advantage.

  • (a) F′(k, (x₁, x₂)) = F(k, x₁) ⊕ F(k, x₂)
  • (b) F′(k, x) = F(k, x) ⊕ F(k, x ⊕ 1^n)
💡
(a) insecure

(b) insecure


6. (10pt) Semantic Security 판별 (증명 포함)

Let (E, D) be a semantically secure cipher (message/ciphertext space: {0,1}^n).

For the following E′, state whether it is semantically secure. If secure, prove by contrapositive. If not, design an attacker and compute the advantage.

  • (a) E′(k, m||m′) = E(k, m) || E(k, m′)
  • (b) E′(k, m) = E(k, m) || E(k, m ⊕ 1^n)
💡
(a) not semantically secure

(b) semantically secure


7. (15pt) 대칭 암호 시스템 분석

K = M = {0,1,2,...,9}, C = {0,1,2,...,9}

E(k, m) = (2·k + m) mod 10

  • (a) 대응하는 decryption function D(k, c)를 구하시오.
  • (b) 이 암호 시스템이 information-theoretically secure (perfectly secure)인가? 이유는?
  • (c) E(k, m) = (3·k + m) mod 10 이면 perfectly secure인가? 이유는?
💡
(a) D(k,c)=(c2k)mod10 \boxed{D(k,c)=(c-2k)\bmod 10}

(b) not perfect secrecy

(c) perfectly secure


8. (5pt) 2-Round Feistel PRP 판별

Let F : K × {0,1}^32 → {0,1}^32 be a secure PRF.

2-round Feistel: F₂ : K² × {0,1}^64 → {0,1}^64

One-round rule: Lᵢ ← Rᵢ₋₁, Rᵢ ← F(kᵢ, Rᵢ₋₁) ⊕ Lᵢ₋₁

다음 중 PRP F₂의 출력은 어느 것인가? (나머지 3개는 random permutation 출력)

Hint: F₂(·, 0^64) ⊕ F₂(·, 1^32 0^32)에서 감지 가능한 패턴을 먼저 찾을 것
  • (a) input 0^649d1a4f78 cb28d863 | input 1^32 0^3275e5e3ea 773ec3e6
  • (b) input 0^647b50baab 07640c3d | input 1^32 0^32ac343a22 cea46d60
  • (c) input 0^64e86d2de2 e1387ae9 | input 1^32 0^321792d21d b645c008
  • (d) input 0^647c2822eb fdc48bfb | input 1^32 0^32325032a9 c5e2364b

9. (10pt) CCA 보안 여부

Let (E, D) be a CPA secure encryption system (key space K, message space {0,1}^n, ciphertext space {0,1}^s).

For each following system, state whether it is CCA secure or not, and explain the reason:

  • (a) E′((k₁,k₂), m) = (E(k₁,m), E(k₂,m))
    • D′((k₁,k₂),(c₁,c₂)) = D(k₁,c₁) if D(k₁,c₁) = D(k₂,c₂), else ⊥
  • (b) E′(k, m) = (E(k,m), E(k, m⊕1^n))
    • D′(k,(c₁,c₂)) = D(k,c₁) if D(k,c₁) = D(k,c₂)⊕1^n, else ⊥

10. (10pt) 생일 역설 (Birthday Paradox)

  • Collision resistant hash가 n bit output이면, 충돌을 1/2 확률로 찾는 데 걸리는 시간은?
  • n = 1.2 × B^(1/2) 일 때 Pr[∃i ≠ j : rᵢ = rⱼ] ≥ 1/2 임을 증명하시오.
    • r₁, …, rₙ ∈ {1, …, B}: i.i.d. integers
    • e^(-0.72) = 0.47
  • 시간 : 2^{n/2}
증명
💡
Pr[no collision]=BBB1BB2BB(n1)B\Pr[\text{no collision}] = \frac{B}{B}\cdot \frac{B-1}{B}\cdot \frac{B-2}{B}\cdots \frac{B-(n-1)}{B}
Pr[no collision]=i=0n1(1iB)\Pr[\text{no collision}] = \prod_{i=0}^{n-1}\left(1-\frac{i}{B}\right)
1xex를사용하면 1-x \le e^{-x} 를 사용하면
Pr[no collision]=i=0n1(1iB)i=0n1ei/B=ei=0n1i/B\Pr[\text{no collision}] = \prod_{i=0}^{n-1}\left(1-\frac{i}{B}\right)\\ \le \prod_{i=0}^{n-1} e^{-i/B} =e^{-\sum_{i=0}^{n-1} i/B}
i=0n1i=n(n1)2\sum_{i=0}^{n-1} i = \frac{n(n-1)}{2}
Pr[no collision]en(n1)2B\Pr[\text{no collision}] \le e^{-\frac{n(n-1)}{2B}}
n(n1)2B=12B(1.2B)(1.2B1)\frac{n(n-1)}{2B} = \frac{1}{2B}(1.2\sqrt{B})(1.2\sqrt{B}-1)
n(n1)2B(1.2)2B2B=1.442=0.72\frac{n(n-1)}{2B} \approx \frac{(1.2)^2 B}{2B} = \frac{1.44}{2} = 0.72
Pr[no collision]e0.72=0.47 \Pr[\text{no collision}] \le e^{-0.72} = 0.47
Pr[ij:ri=rj]=1Pr[no collision]10.47=0.53 \Pr[\exists i\neq j : r_i=r_j] \\= 1-\Pr[\text{no collision}] \ge 1-0.47 =0.53


11. (10pt) XOR 균등 분포 증명

Y는 {0,1}에서 정의되는 random variable, X는 {0,1}에서 정의되는 independent uniform variable.

Z = Y ⊕ X 가 {0,1}에서 정의되는 uniform variable임을 증명하시오.

💡
임의의 z{0,1}2 z\in\{0,1\}^2에 대해

Pr[Z=z]=Pr[YX=z]=y{0,1}2Pr[Y=y and X=zy] \Pr[Z=z] = \Pr[Y\oplus X=z] = \sum_{y\in\{0,1\}^2}\Pr[Y=y \text{ and } X=z\oplus y]

이다. 이때 X와 Y는 independent이므로

=y{0,1}2Pr[Y=y]Pr[X=zy] = \sum_{y\in\{0,1\}^2}\Pr[Y=y]\Pr[X=z\oplus y]

이고, X는 uniform이므로 이는 항상 1/4이다. 따라서

Pr[Z=z]=y{0,1}2Pr[Y=y]14=14 \Pr[Z=z] = \sum_{y\in\{0,1\}^2}\Pr[Y=y]\cdot \frac14 = \frac14

Y가 어떤 값이든 X와 xor하면 모든 값을 균등하게 만들어낸다.


12. (30pt) Merkle Hash Tree

H(x)가 collision-resistant hash function이라 하자.

n개의 원소 e₁, …, eₙ에 대해 말단 leaf로 하는 높이 log₂n인 이진 tree 구성. parent = H(l||r). 쫙 찾기: Root₀ 검증

예시: 25번 원소 포함 증명 → 25, 11, 6, 1 값 보이면 Root₀ = H(e₁||H(H(e₁₁||H(e₂₅||e₂₆))||e₆)) 검증
  • (a) 원소에 속하지 않는 값에 대해 membership proof를 할 수 없음을 collision-resistant 성질을 사용해 증명하시오.
  • (b) Merkle hash tree를 사용해 (log개의 원소로 증명하는) 효율적인 non-membership proof 알고리즘을 제안하시오.
💡
(a)

반대로, 집합에 속하지 않는 어떤 값 xx에 대해 유효한 membership proof가 존재한다고 가정하자.

하지만 xx는 실제 집합의 leaf가 아니므로 진짜 tree에서 대응되는 어떤 leaf 값과는 다르다.

이제 leaf에서 root로 올라가며 실제 tree에서 계산된 값과 proof로 계산된 값을 비교해보면, 맨 아래에서는 다르고 맨 위 root에서는 같다. 따라서 중간 어떤 최초의 레벨에서 서로 다른 두 입력 uv u\neq v 에 대해

H(u)=H(v)H(u) = H(v)

가 성립해야 한다. 즉 H에 대한 collision이 존재하게 되므로 collision-resistant hash function이라는 가정에 모순이다.

(b)

원소들을 정렬된 순서로 leaf에 저장한 merkle hash tree를 사용한다.

어떤 값 xx가 집합에 포함되지 않음을 증명하려면, xx바로 왼쪽 원소 aa, 오른쪽 원소 bb를 찾는다. 즉,

a<x<ba < x < b

이고 a, b가 집합에서 서로 인접한 원소임을 보이면 된다.

증명자는 다음을 제공한다.

  1. a에 대한 membership proof
  2. b에 대한 membership proof
  3. a,b가 정렬 순서에서 서로 인접하다는 정보

검증자는

  • a,b의 membership proof를 확인하여 둘 다 실제 집합에 속함을 확인하고,
  • a<x<ba < x < b 를 확인하고,
  • a,b 사이에 다른 원소가 없음을 확인한다.

그러면 x가 집합에 속한다면 a,b 사이에 있어야 하므로 모순이다.

따라서 xSx\notin S 임이 증명된다.

각 membership proof의 길이는 트리 높이에 비례하므로 proof 크기는

O(logn)\boxed{O(\log n)}


13. (20pt) CPA Semantic Security 증명

Secure PRF F(k,x)가 주어져 있다. 메시지/키/ciphertext 범위는 모두 N개 (N = 2^256).

E(k, m) = (r ← N, F(k,r) + m mod N)

  • Decryption 알고리즘을 기술하시오.
  • 이 cipher가 CPA에 대해 semantic security를 만족하는지 증명하시오.
    • adv[A, F]를 사용하여 adv[B, E]를 계산하시오.
💡
  1. Decryption algorithm

    c=(r,t)c = (r, t)라고 하자.

    암호화가

    t=F(k,r)+m  (mod N)t = F(k, r) + m\space\space (mod\space N)

    이므로, 복호화는 단순히

    D(k,(r,t))=tF(k,r)  (mod N)D(k,(r,t)) = t - F(k,r)\space\space (mod\space N)

  2. CPA semantic security 여부

    H0 : 실제 암호 H1 : F를 truly random function f로 교체

    즉 암호화를

    Ef(m)=(r, f(r)+mmodN)E_f(m)=(r,\ f(r)+m \bmod N)

    로 바꾼다.

    그러면 어떤 PRF 공격자 A를 만들 경우

    Pr[B wins in H0]Pr[B wins in H1]AdvPRF[A,F] \left| \Pr[B \text{ wins in H0}] - \Pr[B \text{ wins in H1}] \right| \le \mathrm{Adv}_{PRF}[A,F]

    이다.

2025 midterm

ITE 3031 | 2025년 1학기

This exam does not allow books, reference, or internet search.
|| : 문자열 연결(concatenation) | : bitwise OR | : bitwise AND
답안은 한글 또는 영어로 작성하면 됨.

1. (5pt) Substitution Cipher

Encrypt a plaintext "HELLO" using a substitution cipher where a key is:

  • E → A
  • H → B
  • L → C
  • O → D

BACCD


2. (5pt) OTP

Encrypt a plaintext 10111010 using a one-time pad where a key is 10011111.

00100101


3. (20pt) Secure PRG 판별

Let G : {0,1}^s → {0,1}^n be a secure PRG. For the following G′, state whether it is a secure PRG or not.

맞으면 +2pt, 틀리면 -2pt, 무응답 0pt
  • (a) G′(k) = G(k) ⊕ 1^n
  • (b) G′(k) = G(k) ∧ 1^n
  • (c) G′(k) = G(k) ∧ 0^n
  • (d) G′(k) = G(k) || 1^n
  • (e) G′(k) = G(k) ⊕ G(k)
  • (f) G′(k) = G(k) ⊕ G(k) ⊕ G(k)
  • (g) G′(k) = G(G(k))
  • (h) G′(k) = G(k) || G(0)
  • (i) G′(k) = G(k ⊕ 1^n)
  • (j) G′(k) = G(k) || k
💡
  • (a) G′(k) = G(k) ⊕ 1^n → S
    • 1을 XOR한다고 해서 달라지는거 없음
  • (b) G′(k) = G(k) ∧ 1^n → S
    • AND 1은 변화 없음
  • (c) G′(k) = G(k) ∧ 0^n → I
    • 항상 G(k) = 0^n이 나옴
  • (d) G′(k) = G(k) || 1^n → I
    • 뒤 절반이 항상 1임
  • (e) G′(k) = G(k) ⊕ G(k) → I
    • 출력이 늘 0^n임
  • (f) G′(k) = G(k) ⊕ G(k) ⊕ G(k) → S
    • 그냥 G(k)임
  • (g) G′(k) = G(G(k)) → S
    • 랜덤을 두번해도 랜덤
  • (h) G′(k) = G(k) || G(0) → I
    • 뒤 절반이 항상 상수임
  • (i) G′(k) = G(k ⊕ 1^n) → S
    • k에서 0과 1이 바뀜, 역시 랜덤
  • (j) G′(k) = G(k) || k → I
    • 뒤 절반이 키임

4. (10pt) PRG Advantage 계산

Let G : K → {0,1}^n be a secure PRG.

  • (a) G′(k₁, k₂, k₃) = G(k₁) ∧ (G(k₂) ⊕ G(k₃))
  • (b) G′(k₁, k₂, k₃) = (G(k₁) ∧ G(k₂)) ⊕ G(k₃)

Statistical test A on {0,1}^n: A(x) outputs LSB(x).

What is Adv_PRG[A, G′] for each case?

Assumption: LSB(G(k)) = 0 for exactly half the seeds k ∈ K
💡
(a) 1/4

(b) 0


5. (10pt) Secure PRF 판별

Let F : {0,1}^n × {0,1}^n → {0,1}^n be a secure PRF (n = 128). For the following F′, state whether it is a secure PRF or not.

맞으면 +2pt, 틀리면 -2pt, 무응답 0pt
  • (a) F′(k, (x₁, x₂)) = F(k, x₁) ⊕ F(k, x₂)
  • (b) F′(k, (x₁, x₂)) = F(k, x₁) || F(k, x₂)
  • (c) F′(k, x) = F(k, x) ⊕ F(k, x ⊕ 1^n)
  • (d) F′(k, x) = F(k, x) || F(k, x+1)
  • (e) F′(k, x) = F(k, x) ⊕ F(k, 0^n)
💡
(a) insecure

(b) insecure

(c) insecure

(d) insecure

(e) insecure


6. (5pt) CBC / CTR 모드 — 네트워크 오류

Let m be a message consisting of l = 100 AES blocks.

  • (a) Alice encrypts m using CBC mode
  • (b) Alice encrypts m using randomized counter mode

네트워크 오류로 ciphertext block l/2 번이 손상됨. 복호화 후 몇 개의 plaintext block이 손상되는가?

💡
(a) 2

(b) 1

네트워크 오류와 메모리 오류의 차이

네트워크 오류 : 암호화된 ciphertext가 잘못 들어가 복호화시 CBC할 경우 뒷 블록 복호화에도 문제 발생

메모리 오류 : 평문이 잘못 저장된 것이므로 복호화 시 뒷 블록 문제 X


7. (5pt) CBC / CTR 모드 — 메모리 오류

Let m be a message consisting of l = 100 AES blocks.

  • (a) Alice encrypts m using CBC mode
  • (b) Alice encrypts m using randomized counter mode

메모리 오류로 plaintext block l/2 번이 암호화 중 손상됨. 복호화 후 몇 개의 plaintext block이 손상되는가?

💡
(a) 1

(b) 1


8. (5pt) 2-Round Feistel PRP 판별

Let F : K × {0,1}^32 → {0,1}^32 be a secure PRF.

2-round Feistel: F₂ : K² × {0,1}^64 → {0,1}^64

One-round rule: Lᵢ ← Rᵢ₋₁, Rᵢ ← F(kᵢ, Rᵢ₋₁) ⊕ Lᵢ₋₁

다음 중 PRP F₂의 출력은 어느 것인가? (나머지 3개는 random permutation 출력)

Hint: F₂(·, 0^64) ⊕ F₂(·, 1^32 0^32)에서 감지 가능한 패턴을 먼저 찾을 것
  • (a) input 0^649d1a4f78 cb28d863 | input 1^32 0^3275e5e3ea 773ec3e6
  • (b) input 0^647b50baab 07640c3d | input 1^32 0^32ac343a22 cea46d60
  • (c) input 0^64e86d2de2 e1387ae9 | input 1^32 0^321792d21d b645c008
  • (d) input 0^647c2822eb fdc48bfb | input 1^32 0^32325032a9 c5e2364b

(c)


9. (10pt) CCA 보안 여부

Let (E, D) be a CPA secure encryption system (key space K, message space {0,1}^n, ciphertext space {0,1}^s).

For each following system, state whether it is CCA secure or not, and explain the reason:

  • (a) E′((k₁,k₂), m) = (E(k₁,m), E(k₂,m))
    • D′((k₁,k₂),(c₁,c₂)) = D(k₁,c₁) if D(k₁,c₁) = D(k₂,c₂), else ⊥
  • (b) E′(k, m) = (E(k,m), E(k, m⊕1^n))
    • D′(k,(c₁,c₂)) = D(k,c₁) if D(k,c₁) = D(k,c₂)⊕1^n, else ⊥

(a) → I

(b) → I


10. (10pt) 생일 역설 (Birthday Paradox)

  • Collision resistant hash가 n bit output이면, 충돌을 1/2 확률로 찾는 데 걸리는 시간은?
  • n = 1.2 × B^(1/2) 일 때 Pr[∃i ≠ j : rᵢ = rⱼ] ≥ 1/2 임을 증명하시오.
    • r₁, …, rₙ ∈ {1, …, B}: i.i.d. integers
    • e^(-0.72) = 0.47
  • 시간 : 2^{n/2}
증명
💡
Pr[no collision]=BBB1BB2BB(n1)B\Pr[\text{no collision}] = \frac{B}{B}\cdot \frac{B-1}{B}\cdot \frac{B-2}{B}\cdots \frac{B-(n-1)}{B}
Pr[no collision]=i=0n1(1iB)\Pr[\text{no collision}] = \prod_{i=0}^{n-1}\left(1-\frac{i}{B}\right)
1xex를사용하면 1-x \le e^{-x} 를 사용하면
Pr[no collision]=i=0n1(1iB)i=0n1ei/B=ei=0n1i/B\Pr[\text{no collision}] = \prod_{i=0}^{n-1}\left(1-\frac{i}{B}\right)\\ \le \prod_{i=0}^{n-1} e^{-i/B} =e^{-\sum_{i=0}^{n-1} i/B}
i=0n1i=n(n1)2\sum_{i=0}^{n-1} i = \frac{n(n-1)}{2}
Pr[no collision]en(n1)2B\Pr[\text{no collision}] \le e^{-\frac{n(n-1)}{2B}}
n(n1)2B=12B(1.2B)(1.2B1)\frac{n(n-1)}{2B} = \frac{1}{2B}(1.2\sqrt{B})(1.2\sqrt{B}-1)
n(n1)2B(1.2)2B2B=1.442=0.72\frac{n(n-1)}{2B} \approx \frac{(1.2)^2 B}{2B} = \frac{1.44}{2} = 0.72
Pr[no collision]e0.72=0.47 \Pr[\text{no collision}] \le e^{-0.72} = 0.47
Pr[ij:ri=rj]=1Pr[no collision]10.47=0.53 \Pr[\exists i\neq j : r_i=r_j] \\= 1-\Pr[\text{no collision}] \ge 1-0.47 =0.53

11. (10pt) XOR 균등 분포 증명

Y는 {0,1}² 위의 random variable, X는 {0,1}² 위의 independent uniform random variable.

Z = Y ⊕ X 가 {0,1}² 위의 uniform random variable임을 증명하시오.

💡
임의의 z{0,1}2 z\in\{0,1\}^2에 대해

Pr[Z=z]=y{0,1}2Pr[Y=y]Pr[X=zyY=y] \Pr[Z=z] = \sum_{y\in\{0,1\}^2}\Pr[Y=y]\Pr[X=z\oplus y \mid Y=y]

이다. 이때 X와 Y는 independent이므로

Pr[X=zyY=y]=Pr[X=zy] \Pr[X=z\oplus y \mid Y=y]=\Pr[X=z\oplus y]

이고, X는 uniform이므로 이는 항상 1/4이다. 따라서

Pr[Z=z]=y{0,1}2Pr[Y=y]14=14 \Pr[Z=z] = \sum_{y\in\{0,1\}^2}\Pr[Y=y]\cdot \frac14 = \frac14

Y가 어떤 값이든 X와 xor하면 모든 값을 균등하게 만들어낸다.


12. (15pt) CCA 보안 분석 (Hash 포함)

Let (E, D) be a CPA secure encryption system (CCA 미보장). H는 collision resistant hash function.

For each following system, state whether it is CT secure / CPA secure / CCA secure / not secure:

  • (a) E′(k, m) = (E(k,m), H(m))
    • D′(k,(c,h)) = D(k,c) if H(D(k,c)) = h, else ⊥

(a) not secure

💡
H(m)가 평문 정보를 직접 누설하므로 CT secure할수 없다.
  • (b) E′(k, m) = (E(k,m), H(k||m))
    • D′(k,(c,h)) = D(k,c) if H(k||D(k,c)) = h, else ⊥

(b) CT secure

💡
(E(k,m0),H(km0)),(E(k,m1),H(km1)) (E(k,m_0),H(k\|m_0)),\quad (E(k,m_1),H(k\|m_1))

를 받을 수 있으므로 챌린지 암호문의 두번째 성분 h*를 이들과 비교해서, 어떤 메시지가 암호화되었는지 알아낼 수 있다. 따라서 CPA secure할 수 없다.

  • (c) E′(k, m) = (E(k,m), H(E(k,m)))
    • D′(k,(c,h)) = D(k,c) if H(c) = h, else ⊥

(c) CPA secure

💡
여기서 두 번째 성분은 평문의 해시가 아니라, 이미 공개된 첫 번째 성분 c=E(k,m)의 해시이다. 즉 (c,H(c)) 형태인데 H(c)는 누구나 c로부터 구할 수 있으므로 새로운 평문 정보가 새지 않는다. 따라서 원래 E가 CPA였다면 이 변형도 CPA secure 하다. 하지만 c를 가지고 h를 만드는 건 공격자도 할 수 있으므로 무결성을 보장할 수 없다.

07. Authentication

1부. CPA-Secure 암호화의 한계 (Active Attacks)

CPA만으로는 부족한 이유

CPA 보안은 도청(eavesdropping) 만 막는다. 공격자가 직접 패킷을 조작하는 능동적 공격(active attack) 에는 무력하다.

실제 공격 예시 1: TCP/IP 패킷 조작

  • 앨리스가 dest=80 (웹 서버)으로 암호화된 패킷을 전송
  • 공격자가 패킷을 가로채서 dest=25 (Bob의 포트)로 목적지를 바꿔 전송
  • CBC 암호화는 IV만 바꿔도 첫 번째 블록의 내용을 조작할 수 있음

왜 IV만 바꾸면 되냐?

CBC 복호화: m[0] = D(k, c[0]) ⊕ IV

따라서 IV' = IV ⊕ ("...80...") ⊕ ("...25...") 로 설정하면 복호화 결과가 dest=25로 바뀜

실제 공격 예시 2: CTR 모드에서 키스트로크 탈취

  • SSH처럼 키 입력 하나하나를 CTR 모드로 암호화해서 전송하는 경우
  • 공격자가 암호문을 변조해서 서버로 보내고, 서버의 ACK 응답을 관찰
  • checksum(hdr, D) = t ⊕ checksum(hdr, D⊕s) 관계를 이용해 평문 D를 유추 가능

교훈

CPA 보안은 능동적 공격(active attack) 하에서 기밀성을 보장하지 못한다.
  • 무결성만 필요하면 → MAC 사용
  • 기밀성 + 무결성 둘 다 필요하면 → Authenticated Encryption (AE) 사용

2부. Authenticated Encryption 정의

AE 시스템의 구조

일반 암호화와 다른 점은 복호화 결과에 ⊥(거부) 가 추가된다는 것:

  • 암호화: E: K × M × N → C (평소와 동일)
  • 복호화: D: K × C × N → M ∪ {⊥}⊥는 암호문이 거부되었다는 의미

공격자가 만들어낸 가짜 암호문이 들어오면 → 출력 → 자동으로 거부

AE의 보안 조건 (두 가지 모두 만족해야 함)

  1. CPA 보안: 의미론적 보안 (도청 방어)
  2. 암호문 무결성 (Ciphertext Integrity, CI): 공격자가 새로운 유효한 암호문을 만들어낼 수 없음

CI 정의 (공식):

  • 공격자가 암호화 오라클을 이용해 c₁, ..., cₙ을 얻음
  • 새로운 암호문 c (기존 목록에 없는)를 제출했을 때 D(k,c) ≠ ⊥이 되면 공격 성공
  • Adv_CI[A, E]가 negligible해야 안전

나쁜 예: CBC with random IV

CBC는 AE를 제공하지 않는다. 이유: D(k, ·)가 절대로 ⊥를 출력하지 않는다. → 공격자가 아무 암호문이나 제출해도 다 받아들임 → CI 게임을 쉽게 이길 수 있음

AE의 의미 (두 가지 함의)

함의 1: 진정성(Authenticity)

  • 공격자가 앨리스 행세를 하며 가짜 메시지를 보낼 수 없음
  • D(k,c) ≠ ⊥이면 밥은 "이 메시지는 k를 아는 사람이 보냈다"고 확신 가능
  • 단, 리플레이 공격은 막지 못함 (이전에 보낸 유효한 암호문을 다시 보내는 것)

함의 2: CCA 보안

  • AE를 제공하면 → CCA(선택 암호문 공격)에도 안전
  • 정리: Adv_CCA[A,E] ≤ 2q · Adv_CI[B₁,E] + Adv_CPA[B₂,E]

3부. CCA (Chosen Ciphertext Attack)

CCA란?

공격자가 다음 두 가지 모두 가능한 상황:

  1. CPA: 원하는 메시지의 암호문을 얻을 수 있음
  2. CCA: 원하는 암호문의 복호화 결과를 얻을 수 있음 (단, challenge 암호문 제외)

목표: 여전히 어떤 메시지가 암호화됐는지 구별하지 못해야 함

CBC with random IV는 CCA에 취약

공격 방법:

  1. m₀, m₁을 제출 → 암호문 c = (IV, c[0])을 받음
  2. 변조된 암호문 c' = (IV ⊕ 1, c[0]) 을 복호화 요청
  3. D(k, c') = m_b ⊕ 1 을 받으면 b를 알 수 있음

challenge 암호문이 아닌 살짝 바꾼 암호문으로 복호화 오라클을 악용

AE → CCA 안전성 (증명 스케치)

CI 덕분에, 공격자가 새로 만든 암호문을 복호화 요청해도 → ⊥ 반환 → 유용한 정보를 얻을 수 없음

따라서 CCA 오라클이 있어도 실질적으로 도움이 안 됨 → CCA 안전


4부. AE 구성 방법 (MAC + 암호화 조합)

역사적 배경

2000년 이전에는 AE라는 개념이 없었음. MS-CAPI 같은 API는 CPA 암호화와 MAC을 별도로 제공했고, 개발자가 직접 조합해야 했는데 잘못 조합하면 AE가 보장되지 않음.

세 가지 조합 방법

키: 암호화 키 k_E, MAC 키 k_I (서로 다른 독립적인 키 사용)

방식순서프로토콜안전성
MAC-then-Encryptm → tag → E(k_E, m\\tag)
Encrypt-then-MACm → c=E(k_E, m) → tag=S(k_I, c)IPsec항상 안전
Encrypt-and-MACm → c=E(k_E, m), tag=S(k_I, m)SSH안전하지 않을 수 있음

AE 정리

  • (E,D)가 CPA 안전, (S,V)가 안전한 MAC이면:
    1. Encrypt-then-MAC: 항상 AE 제공 ✅
    2. MAC-then-Encrypt: CCA 공격에 취약할 수 있음. 단, (E,D)가 rand-CTR 또는 rand-CBC이면 AE 제공

5부. 표준 AE 모드

모두 nonce 기반, AEAD(Associated Data와 함께 인증된 암호화) 지원

표준구성특징
GCMCTR 암호화 → CW-MACIntel PCLMULQDQ로 하드웨어 가속, 가장 빠름 (108 MB/s)
CCMCBC-MAC → CTR 암호화802.11i (WiFi), 코드 크기 작음 (61 MB/s)
EAXCTR 암호화 → CMAC코드 크기 작음 (61 MB/s)
OCBPRP에서 직접 구성가장 효율적 (129 MB/s), 블록당 E() 한 번만 수행

AEAD (Authenticated Encryption with Associated Data):

  • 일부 데이터는 암호화하고, 나머지 데이터는 암호화 없이 인증만 함
  • 예: 네트워크 패킷에서 헤더는 인증만, 본문은 암호화+인증

OCB: PRP로부터 직접 구성

  • 블록 암호를 한 번만 사용해서 암호화와 인증을 동시에 수행
  • c[i] = E(k, m[i] ⊕ P(N,k,i)) ⊕ P(N,k,i)
  • 마지막에 checksum 블록을 추가해서 무결성 태그 생성
  • 패특허 문제로 실제 배포에 제약이 있었으나 현재는 해소됨

6부. 사례 연구: TLS (1.2)

TLS Record Protocol 구조

  • 브라우저 ↔ 서버 간 안전한 통신의 기반
  • 단방향 키: k_{b→s} (브라우저→서버), k_{s→b} (서버→브라우저)
  • 상태 기반(Stateful) 암호화: 64비트 카운터 ctr_{b→s}, ctr_{s→b} 유지
    • 세션 시작 시 0으로 초기화, 레코드마다 1씩 증가
    • 목적: 리플레이 공격 방어 (이전 패킷을 다시 보내면 카운터가 맞지 않아 거부)

핵심 요약

개념의미
CPA 보안도청만 방어, 변조에는 무력
Ciphertext Integrity (CI)공격자가 새로운 유효 암호문을 만들 수 없음
AE (인증된 암호화)CPA 보안 + CI = 도청 + 변조 모두 방어
CCA 보안AE에서 자동으로 따라옴
Encrypt-then-MAC항상 안전한 AE 구성법 (IPsec에서 사용)
GCM현재 가장 널리 쓰이는 AE 표준
💡 AE의 한계: 리플레이 공격은 막지 못함 (TLS는 카운터로 별도 방어). 사이드 채널 공격(타이밍 등)도 고려하지 않음.

08. Number Theory

1. 표기법

  • NN: 양의 정수
  • pp: 소수
  • ZN={0,1,2,,N1}\mathbb{Z}_N = \{0, 1, 2, \ldots, N-1\}

ZN\mathbb{Z}_N에서는 덧셈과 곱셈을 mod NN으로 수행한다.


2. 모듈러 연산

2-1. 기본 연산

N=12N = 12일 때 다음과 같은 연산이 이루어진다.

연산결과
9+89 + 85(mod12)5 \pmod{12}
5×75 \times 711(mod12)11 \pmod{12}
575 - 710(mod12)10 \pmod{12}

ZN\mathbb{Z}_N의 연산은 분배법칙 등 일반적인 연산 규칙을 따른다.

x(y+z)=xy+xz(modN)x \cdot (y + z) = x \cdot y + x \cdot z \pmod{N}

2-2. 최대공약수 (GCD)

정수 x,yx, y에 대해 gcd(x,y)\gcd(x, y)는 두 수의 최대공약수이다.

예: gcd(12,18)=6\gcd(12, 18) = 6

베주 항등식 (Bézout's Identity)
임의 정수 x,yx, y에 대해 다음을 만족하는 정수 a,ba, b가 존재한다.
ax+by=gcd(x,y)a \cdot x + b \cdot y = \gcd(x, y)
a,ba, b확장 유클리드 알고리즘으로 효율적으로 구할 수 있다.

gcd(x,y)=1\gcd(x, y) = 1이면 xxyy서로소(coprime)라 한다.

2-3. 모듈러 역원

xZNx \in \mathbb{Z}_N역원xy1(modN)x \cdot y \equiv 1 \pmod{N}를 만족하는 yZNy \in \mathbb{Z}_N이며, x1x^{-1}로 표기한다.

보조정리
xZNx \in \mathbb{Z}_N가 역원을 가진다     gcd(x,N)=1\iff \gcd(x, N) = 1

증명:

  • (\Rightarrow) gcd(x,N)=1\gcd(x, N) = 1이면 베주 항등식으로 ax+bN=1a \cdot x + b \cdot N = 1을 만족하는 a,ba, b가 존재. mod NN을 취하면 ax1(modN)a \cdot x \equiv 1 \pmod{N}이므로 a=x1a = x^{-1}.
  • (\Leftarrow) gcd(x,N)>1\gcd(x, N) > 1이면 모든 aa에 대해 gcd(ax,N)>1\gcd(a \cdot x, N) > 1이므로 ax≢1(modN)a \cdot x \not\equiv 1 \pmod{N}.

2-4. 가역 원소의 집합 ZN\mathbb{Z}_N^*

ZN={xZN:gcd(x,N)=1}\mathbb{Z}_N^* = \{x \in \mathbb{Z}_N : \gcd(x, N) = 1\}
NNZN\mathbb{Z}_N^*
소수 ppZp{0}={1,2,,p1}\mathbb{Z}_p \setminus \{0\} = \{1, 2, \ldots, p-1\}
1212{1,5,7,11}\{1, 5, 7, 11\}

역원은 확장 유클리드 알고리즘으로 O(log2N)O(\log^2 N) 시간에 계산 가능하다.

2-5. 모듈러 일차방정식

ax+b0(modN)a \cdot x + b \equiv 0 \pmod{N}의 해:

x=ba1(modN)x = -b \cdot a^{-1} \pmod{N}

a1a^{-1}은 확장 유클리드로 구한다. 전체 수행시간 O(log2N)O(\log^2 N).


3. 페르마의 소정리

3-1. 정리

pp가 소수이면
xZp,xp11(modp)\forall x \in \mathbb{Z}_p^*, \quad x^{p-1} \equiv 1 \pmod{p}

예: p=5p = 5일 때 34=81=165+11(mod5)3^4 = 81 = 16 \cdot 5 + 1 \equiv 1 \pmod{5}

3-2. 역원 계산 용도

xZpx \in \mathbb{Z}_p^*일 때 xxp2=xp11x \cdot x^{p-2} = x^{p-1} \equiv 1이므로:

x1=xp2(modp)x^{-1} = x^{p-2} \pmod{p}

하지만 확장 유클리드가 더 효율적이다.

3-3. 응용: 랜덤 소수 생성

1024 비트 소수를 생성하는 간단한 알고리즘:

  1. Step 1: p[21024,210251]p \in [2^{1024}, 2^{1025} - 1]을 무작위로 선택
  2. Step 2: 2p11(modp)2^{p-1} \equiv 1 \pmod{p}인지 테스트
  3. 성공하면 pp 출력, 아니면 Step 1로

소수가 아닌지 잘못 알릴 확률 <260< 2^{-60}. 실제로는 밀러-라빈 테스트 등 더 정교한 알고리즘을 사용한다.


4. Zp\mathbb{Z}_p^*의 구조

4-1. 정리 (Euler)

Zp\mathbb{Z}_p^*순환군이다. 즉, Zp={1,g,g2,g3,,gp2}\mathbb{Z}_p^* = \{1, g, g^2, g^3, \ldots, g^{p-2}\}를 만족하는 gZpg \in \mathbb{Z}_p^*가 존재한다. 이 ggZp\mathbb{Z}_p^*생성원(generator)이라 한다.

예: p=7p = 7, g=3g = 3

{1,3,32,33,34,35}={1,3,2,6,4,5}=Z7\{1, 3, 3^2, 3^3, 3^4, 3^5\} = \{1, 3, 2, 6, 4, 5\} = \mathbb{Z}_7^*

모든 원소가 생성원은 아니다. 예: g=2g = 2일 때 {1,2,4}\{1, 2, 4\}만 생성되며 Z7\mathbb{Z}_7^* 전체가 아니다.

4-2. 원소의 위수

gZpg \in \mathbb{Z}_p^*가 생성하는 군을 g\langle g \rangle이라 하고, gg위수(order)는:

ordp(g)=g=min{a>0:ga1(modp)}\text{ord}_p(g) = |\langle g \rangle| = \min\{a > 0 : g^a \equiv 1 \pmod{p}\}

예 (p=7p = 7): ord7(3)=6\text{ord}_7(3) = 6, ord7(2)=3\text{ord}_7(2) = 3, ord7(1)=1\text{ord}_7(1) = 1

4-3. 라그랑주 정리

gZp\forall g \in \mathbb{Z}_p^*에 대해 ordp(g)p1\text{ord}_p(g) \mid p - 1

5. 오일러 피 함수와 오일러 정리

5-1. 오일러 피 함수

φ(N)=ZN\varphi(N) = |\mathbb{Z}_N^*|
NNφ(N)\varphi(N)계산
소수 ppp1p - 1
121244{1,5,7,11}|\{1, 5, 7, 11\}|
pqp \cdot q (p,qp, q 서로 다른 소수)(p1)(q1)(p-1)(q-1)Npq+1N - p - q + 1

5-2. 오일러 정리 (Euler, 1736)

페르마 소정리의 일반화
xZN,xφ(N)1(modN)\forall x \in \mathbb{Z}_N^*, \quad x^{\varphi(N)} \equiv 1 \pmod{N}

예: 5φ(12)=54=625=5212+11(mod12)5^{\varphi(12)} = 5^4 = 625 = 52 \cdot 12 + 1 \equiv 1 \pmod{12}

RSA 암호 시스템의 수학적 기반이 바로 이 정리이다.


6. 산술 알고리즘

6-1. 큰 수 표현

nn 비트 정수(예: n=2048n = 2048)를 64비트 머신에서 표현할 때, 32비트 블록 n/32n / 32개로 나눠 저장한다. (일부 프로세서는 128비트 레지스터 및 곱셈을 지원)

6-2. 기본 연산의 시간 복잡도

nn비트 정수 두 개에 대해:

연산시간 복잡도비고
덧셈, 뺄셈O(n)O(n)
곱셈 (나이브)O(n2)O(n^2)
곱셈 (Karatsuba, 1960)O(n1.585)O(n^{1.585})(2bx2+x1)(2by2+y1)(2^b x_2 + x_1)(2^b y_2 + y_1)를 3번의 곱셈으로 수행
곱셈 (이론적 최적)O(nlogn)O(n \log n)FFT 기반
나눔셈 (나머지)O(n2)O(n^2)

6-3. 제곱을 통한 거듭제곱 (Repeated Squaring)

유한 순환군 GG에서 gGg \in GxZx \in \mathbb{Z}가 주어졌을 때 gxg^x을 계산한다.

핵심 아이디어: xx를 이진수로 전개해 gg2k2^k 거듭제곱들을 조합.

예: x=53=(110101)2=32+16+4+1x = 53 = (110101)_2 = 32 + 16 + 4 + 1

g53=g32g16g4g1g^{53} = g^{32} \cdot g^{16} \cdot g^4 \cdot g^1

알고리즘:

javascript
Input: g ∈ G, x > 0
Output: g^x

x = (x_n x_{n-1} ... x_1 x_0)_2
y ← g, z ← 1
for i = 0 to n do:
    if x[i] == 1: z ← z · y
    y ← y²
return z

예제 실행 (g53g^{53}):

반복yyzz
초기gg11
i=0i = 0 (x0=1x_0 = 1)g2g^2gg
i=1i = 1 (x1=0x_1 = 0)g4g^4gg
i=2i = 2 (x2=1x_2 = 1)g8g^8g5g^5
i=3i = 3 (x3=0x_3 = 0)g16g^{16}g5g^5
i=4i = 4 (x4=1x_4 = 1)g32g^{32}g21g^{21}
i=5i = 5 (x5=1x_5 = 1)g64g^{64}g53g^{53}

6-4. 모듈러 연산의 종합 복잡도

nn비트 NN에 대해:

연산시간 복잡도
ZN\mathbb{Z}_N에서 덧셈, 뺄셈O(n)O(n)
ZN\mathbb{Z}_N에서 곱셈O(n2)O(n^2)
ZN\mathbb{Z}_N에서 거듭제곱 gxg^xO((logx)n2)O(n3)O((\log x) \cdot n^2) \leq O(n^3)

7. 쉬운 문제와 어려운 문제

7-1. 쉬운 문제 (다항시간)

  • xZNx \in \mathbb{Z}_N가 주어졌을 때 x1x^{-1} 구하기
  • 소수 pp와 다항식 f(x)Zp[x]f(x) \in \mathbb{Z}_p[x]가 주어졌을 때 f(x)0(modp)f(x) \equiv 0 \pmod{p}의 해 찾기 (시간: O(deg(f))O(\deg(f))에 선형)

7-2. 이산 로그 문제 (DLOG)

소수 p>2p > 2와 위수 qqgZpg \in \mathbb{Z}_p^*를 고정한다. 함수

xgx(modp)x \mapsto g^x \pmod{p}

는 계산이 쉬운 반면, 그 역함수인 이산 로그

Dlogg(gx)=x,x{0,1,,q1}\text{Dlog}_g(g^x) = x, \quad x \in \{0, 1, \ldots, q-1\}

는 계산이 어렵다.

예: Z11\mathbb{Z}_{11}에서 g=2g = 2

yy12345678910
Dlog2(y)\text{Dlog}_2(y)0182497365

일반화된 정의

유한 순환군 G={1,g,g2,,gq1}G = \{1, g, g^2, \ldots, g^{q-1}\} (q=Gq = |G|)에서, 모든 효율적 알고리즘 AA에 대해

PrgG, xZq[A(G,q,g,gx)=x]<negligible\Pr_{g \leftarrow G,\ x \leftarrow \mathbb{Z}_q}[A(G, q, g, g^x) = x] < \text{negligible}

이면 GG에서 DLOG가 어렵다고 한다.

DLOG가 어려울 것으로 여겨지는 군

  • 큰 소수 pp에 대한 Zp\mathbb{Z}_p^*
  • 타원곡선군 mod pp

7-3. Zp\mathbb{Z}_p^*에서의 DLOG 계산 복잡도

현재 가장 빠른 알고리즘은 GNFS (General Number Field Sieve)이며, nn비트 소수 pp에 대해 exp(O~(n3))\exp(\tilde{O}(\sqrt[3]{n}))의 시간이 걸린다.

동등한 안전성을 위한 키 크기 비교

대칭키 크기Zp\mathbb{Z}_p^* modulus 크기타원곡선군 크기
80 비트1024 비트160 비트
128 비트3072 비트256 비트
256 비트 (AES)15360 비트512 비트

타원곡선군이 훨씬 작은 키로 동등한 안전성을 제공한다. 이 때문에 mod pp에서 타원곡선으로의 전환이 진행 중이다.

7-4. 응용: 충돌 저항성 해시

DLOG가 어려운 군 GG (G=q|G| = q, 소수)에서 생성원 g,hg, h를 선택한다. x,y{1,,q}x, y \in \{1, \ldots, q\}에 대해:

H(x,y)=gxhyGH(x, y) = g^x \cdot h^y \in G
보조정리
HH에서 충돌을 찾는 것은 Dlogg(h)\text{Dlog}_g(h)를 계산하는 것과 같은 난이도이다.

증명: 충돌 H(x0,y0)=H(x1,y1)H(x_0, y_0) = H(x_1, y_1)이 주어지면

gx0hy0=gx1hy1gx0x1=hy1y0h=g(x0x1)/(y1y0)g^{x_0} h^{y_0} = g^{x_1} h^{y_1} \Rightarrow g^{x_0 - x_1} = h^{y_1 - y_0} \Rightarrow h = g^{(x_0 - x_1)/(y_1 - y_0)}

따라서 Dlogg(h)=(x0x1)/(y1y0)(modq)\text{Dlog}_g(h) = (x_0 - x_1)/(y_1 - y_0) \pmod{q}를 구할 수 있다. (y1y0y_1 \neq y_0 가정)


8. 합성수와 관련 어려운 문제

8-1. RSA 모을러스의 집합

Z(2)(n)={N=pq:p,q는 n비트 소수}\mathbb{Z}_{(2)}(n) = \{N = p \cdot q : p, q \text{는 } n\text{비트 소수}\}

8-2. 문제 1: 인수분해

Z(2)(n)\mathbb{Z}_{(2)}(n)에서 무작위 NN을 인수분해하는 문제. 현재 가장 빠른 알고리즘은 NFS (Number Field Sieve)이며, 시간 exp(O~(n3))\exp(\tilde{O}(\sqrt[3]{n})).

가우스(1805)가 이 문제의 중요성을 이미 지적했다.

현재 세계 기록

  • RSA-768 (232 자릿): 수백 대의 머신으로 2년간 계산
  • 1024 비트 인수분해: RSA-768보다 약 1000배 어렵다. 이번 10년 안에 가능해질 가능성 없음

8-3. 문제 2: 합성수 모듈러에서 다항식의 근 찾기

다항식 f(x)f(x) (deg(f)>1\deg(f) > 1)과 무작위 NZ(2)(n)N \in \mathbb{Z}_{(2)}(n)이 주어졌을 때 f(x)0(modN)f(x) \equiv 0 \pmod{N}의 해를 찾는 문제도 어렵다. 소수 모듈러와는 달리 다항식 근 찾기가 함성수 모듈러에서는 일반적으로 어렵다.


9. 어려운 문제와 암호 시스템의 연결

어려운 문제이 문제에 기반한 암호 시스템
소수 모듈러 이산 로그Diffie-Hellman 키 교환, ElGamal, DSA
타원곡선 이산 로그 (ECDLP)ECDH, ECDSA, EdDSA
인수분해RSA 암호, RSA 서명, Rabin 암호
이산 로그 기반 충돌 저항성Pedersen 커미트먼트, 해시 기반 서명

09. Pubkey Trapdoor

1. 공개키 암호화란?

공개키 암호화는 암호화에 사용하는 키와 복호화에 사용하는 키가 다른 암호 방식이다.

  • pk: public key, 공개키
  • sk: secret key, 비밀키
  • E(pk, m) -> c: 공개키로 메시지 m을 암호화
  • D(sk, c) -> m: 비밀키로 암호문 c를 복호화

즉, 누구나 공개키 pk로 암호문을 만들 수 있지만, 복호화는 비밀키 sk를 가진 사람만 할 수 있다.

공개키 암호 시스템은 보통 세 알고리즘으로 정의한다.

(G, E, D)
  • G(): randomized algorithm, 키쌍 (pk, sk) 생성
  • E(pk, m): randomized algorithm, 메시지 m을 암호화하여 암호문 c 출력
  • D(sk, c): deterministic algorithm, 암호문 c를 복호화하여 메시지 m 또는 실패 기호  출력

정상적인 공개키 암호라면 다음 조건이 성립해야 한다.

D(sk, E(pk, m)) = m

이 조건을 consistency라고 한다.


2. 공개키 암호화의 사용 예시

2.1 세션 키 설정

공개키 암호화는 대칭키 암호에 사용할 세션 키를 안전하게 전달하는 데 사용할 수 있다.

예를 들어 Alice가 (pk, sk)를 만들고 Bob에게 pk를 공개한다. Bob은 랜덤한 세션 키 x를 고른 뒤 E(pk, x)를 Alice에게 보낸다. Alice는 자신의 비밀키 sk로 복호화하여 x를 얻는다.

이후 Alice와 Bob은 공유한 x를 대칭키로 사용해 빠르게 통신할 수 있다.

2.2 이메일 암호화

이메일처럼 실시간 상호작용이 없는 상황에서도 공개키 암호화가 유용하다.

예를 들어 Bob이 Alice에게 암호화된 이메일을 보내려면, Bob은 Alice의 공개키 pk_Alice를 이용해 메시지를 암호화하면 된다.

단, 이때 중요한 문제가 있다.

Bob이 정말 Alice의 공개키를 알고 있는가?

즉, 공개키 암호화에서는 public key management가 중요하다. 잘못된 공개키를 사용하면 공격자에게 암호문을 보내는 꼴이 될 수 있다.


3. 공개키 암호화의 보안성: Semantic Security

공개키 암호화의 기본 보안 개념은 semantic security이며, IND-CPA라고도 부른다.

실험 구조는 다음과 같다.

  1. Challenger가 (pk, sk)를 생성한다.
  2. 공격자에게 pk를 준다.
  3. 공격자는 같은 길이의 두 메시지 m0m1을 고른다.
  4. Challenger는 비트 b ∈ {0,1}를 고른다.
  5. Challenger는 c ← E(pk, mb)를 공격자에게 준다.
  6. 공격자는 b'를 추측한다.

공격자의 목표는 암호문 c가 m0의 암호문인지 m1의 암호문인지 맞히는 것이다.

보안성 advantage는 다음과 같이 정의된다.

AdvSS[A, E] = | Pr[EXP(0) = 1] - Pr[EXP(1) = 1] |

이 값이 모든 효율적인 공격자에 대해 negligible하면 공개키 암호 시스템은 semantically secure하다고 한다.


4. 공개키 암호화는 반드시 randomized 해야 한다

공개키 암호화에서는 암호화 알고리즘이 반드시 randomized algorithm이어야 한다.

이유는 공개키 pk가 모두에게 공개되어 있기 때문이다.

만약 암호화가 deterministic이라면 공격자는 직접 다음을 계산할 수 있다.

E(pk, m0)
E(pk, m1)

그리고 challenge ciphertext와 비교하면 바로 어떤 메시지가 암호화되었는지 알 수 있다.

따라서 공개키 암호화에서는 같은 메시지를 암호화하더라도 매번 다른 암호문이 나와야 한다.


5. Chosen Ciphertext Attack, CCA

IND-CPA는 공격자가 암호문을 단순히 엿보는 상황을 다룬다. 하지만 실제 환경에서는 공격자가 암호문을 조작하고, 조작된 암호문에 대한 복호화 결과를 관찰할 수도 있다.

이런 공격을 chosen ciphertext attack, CCA라고 한다.

CCA 보안성에서는 공격자가 복호화 oracle을 사용할 수 있다. 단, challenge ciphertext c 자체는 복호화 요청할 수 없다.

실험 구조는 대략 다음과 같다.

  1. Challenger가 (pk, sk)를 생성한다.
  2. 공격자는 pk를 받는다.
  3. 공격자는 challenge 이전에 원하는 암호문들을 복호화 요청할 수 있다. 이를 CCA phase 1이라고 한다.
  4. 공격자는 같은 길이의 m0m1을 제출한다.
  5. Challenger는 c ← E(pk, mb)를 준다.
  6. 공격자는 challenge 이후에도 복호화 요청을 할 수 있다. 이를 CCA phase 2라고 한다.
  7. 단, phase 2에서 c 자체는 요청할 수 없다.
  8. 공격자는 b'를 출력한다.

CCA secure하다는 것은 이런 강한 공격자도 m0와 m1을 구별하지 못한다는 뜻이다.


6. 대칭키 암호와 공개키 암호의 차이

대칭키 암호에서는 chosen ciphertext attack을 막기 위해 authenticated encryption을 사용한다.

Authenticated encryption은 대략 다음 두 성질을 함께 제공한다.

  • chosen plaintext security
  • ciphertext integrity

즉, 공격자가 새로운 유효한 암호문을 만들어내기 어렵다.

하지만 공개키 암호에서는 상황이 다르다. 공개키 pk가 공개되어 있기 때문에, 공격자는 누구나 새 암호문을 직접 만들 수 있다.

따라서 공개키 환경에서는 “공격자가 새 암호문을 못 만들게 하자”는 방식이 아니라, chosen ciphertext security를 직접 요구해야 한다.


7. Trapdoor Function, TDF

Trapdoor function은 공개키 암호화를 만들기 위한 핵심 도구이다.

TDF는 세 알고리즘으로 이루어진다.

(G, F, F⁻¹)
  • G(): 키쌍 (pk, sk) 생성
  • F(pk, x) -> y: 공개키로 계산 가능한 함수
  • F⁻¹(sk, y) -> x : 비밀키로만 역산 가능한 함수

TDF는 다음 조건을 만족해야 한다.

F⁻¹(sk, F(pk, x)) = x

즉, 공개키로 x를 y로 바꾸는 것은 쉽지만, y에서 다시 x를 찾는 것은 비밀키 없이는 어려워야 한다.


8. Secure TDF

안전한 TDF는 one-way 성질을 가져야 한다.

즉, 다음 값을 보고도

y = F(pk, x)

비밀키 sk 없이 원래의 x를 찾기 어려워야 한다.

공격자의 목표는 pk와 y를 보고 x'를 출력하는 것이다. 만약 x' = x이면 공격 성공이다.

안전한 TDF에서는 모든 효율적인 공격자에 대해 이 성공 확률이 negligible해야 한다.


9. TDF로 공개키 암호 만들기

TDF만으로는 메시지를 직접 암호화하면 안 된다. TDF는 “역산이 어렵다”만 보장하지, “암호문이 평문 정보를 숨긴다”는 semantic security를 보장하지 않기 때문이다. 대신 TDF를 이용해 랜덤한 값을 숨기고, 그 랜덤한 값에서 대칭키를 만든 뒤 메시지를 대칭키 암호로 암호화한다.

필요한 구성요소는 다음과 같다.

  • (G, F, F⁻¹): secure TDF
  • (Es, Ds): authenticated encryption을 제공하는 대칭키 암호
  • H: X → K: 해시 함수

암호화 과정은 다음과 같다.

E(pk, m):
    x ← X (random)
    y ← F(pk, x)
    k ← H(x)
    c ← Es(k, m)
    output (y, c)

복호화 과정은 다음과 같다.

D(sk, (y, c)):
    x ← F⁻¹(sk, y)
    k ← H(x)
    m ← Ds(k, c)
    output m

암호문은 크게 두 부분으로 나뉜다.

(y, c)
  • y: TDF로 숨긴 랜덤 값
  • c: 그 랜덤 값에서 만든 키로 암호화한 메시지

그림으로 보면 다음 구조이다.

F(pk, x)        Es(H(x), m)
 header             body

10. TDF에 메시지를 직접 넣으면 안 되는 이유

다음과 같은 방식은 사용하면 안 된다.

E(pk, m):
    output F(pk, m)

이 방식은 deterministic하다. 즉, 같은 메시지는 항상 같은 암호문이 된다.

따라서 semantic security를 만족할 수 없다.

공개키가 공개되어 있으므로 공격자는 직접 F(pk, m0)F(pk, m1)을 계산한 뒤 challenge ciphertext와 비교할 수 있다.


11. RSA Trapdoor Permutation

RSA는 대표적인 trapdoor permutation이다.

먼저 두 큰 소수 pq를 고른다.

N = p · q

그리고 다음을 만족하는 ed를 고른다.

e · d = 1 mod φ(N)

여기서

φ(N) = (p - 1)(q - 1)

이다.

공개키와 비밀키는 다음과 같다.

pk = (N, e)
sk = (N, d)

RSA 함수는 다음과 같다.

F(pk, x) = x^e mod N
F⁻¹(sk, y) = y^d mod N

d를 알고 있으면 역산이 가능하지만, d 없이 y = x^e mod N에서 x를 찾는 것은 어렵다고 가정한다.


12. RSA Assumption

RSA assumption은 다음 문제가 어렵다는 가정이다.

Given (N, e, y), find x such that x^e = y mod N

즉, e제곱은 공개키로 쉽게 계산할 수 있지만, e제곱근을 구하는 것은 어렵다는 것이다.


13. RSA 기반 공개키 암호화의 올바른 방식

RSA를 안전하게 공개키 암호화에 사용하려면 메시지를 직접 RSA에 넣으면 안 된다.

대신 다음처럼 사용한다.

E(pk, m):
    choose random x in ZN
    y ← RSA(x) = x^e
    k ← H(x)
    output (y, Es(k, m))

복호화는 다음과 같다.

D(sk, (y, c)):
    x ← RSA⁻¹(y)
    k ← H(x)
    output Ds(k, c)

즉, RSA는 메시지를 직접 암호화하는 것이 아니라, 랜덤한 x를 숨기는 데 사용된다. 실제 메시지는 H(x)로 만든 대칭키를 이용해 암호화한다.


14. Textbook RSA는 왜 위험한가?

Textbook RSA는 다음과 같이 메시지를 바로 암호화하는 방식이다.

c = m^e mod N

복호화는 다음과 같다.

m = c^d mod N

하지만 이 방식은 안전하지 않다.

14.1 Deterministic

같은 메시지 m은 항상 같은 암호문 c가 된다.

따라서 semantic security를 만족할 수 없다.

14.2 구조를 이용한 공격 가능

예를 들어 64비트 세션 키 k를 textbook RSA로 암호화했다고 하자.

공격자는 c = k^e mod N을 본다.

만약

k = k1 · k2

이고 k1k2가 충분히 작다면, 공격자는 모든 경우를 다 보지 않고 meet-in-the-middle 방식으로 k를 더 빠르게 찾을 수 있다.

강의 예시에서는 전체 2^64 brute force보다 훨씬 작은 약 2^40 시간으로 공격할 수 있는 상황을 보여준다.

따라서 RSA trapdoor permutation 자체는 암호화 스킴이 아니다. RSA를 안전하게 쓰려면 padding 또는 hybrid encryption 구조가 필요하다.


15. RSA의 low public exponent

RSA 암호화를 빠르게 하기 위해 작은 공개 지수 e를 사용할 수 있다.

대표적인 값은 다음과 같다.

e = 65537 = 2^16 + 1

이 값은 암호화가 빠르면서도 실무적으로 널리 쓰인다.

RSA는 일반적으로 암호화가 빠르고 복호화가 느린 구조를 가진다.


16. RSA 키 길이

공개키 암호의 보안 수준은 대칭키 암호의 보안 수준과 맞춰야 한다.

대칭키 보안 수준RSA modulus size
80 bits1024 bits
128 bits3072 bits
256 bits15360 bits

즉, AES-128 수준의 보안을 원한다면 RSA modulus는 대략 3072비트 정도가 필요하다.

10. Pubkey dh

1. 이 단원의 목표

이 단원은 Diffie-Hellman 프로토콜을 이용해 공개키 암호 시스템인 ElGamal encryption을 만드는 방법을 설명한다.

핵심 흐름은 다음과 같다.

Diffie-Hellman key exchange

공유 비밀값 g^{ab}

해시로 대칭키 생성

메시지를 대칭키 암호로 암호화

ElGamal public-key encryption

2. 공개키 암호화 복습

공개키 암호화는 세 알고리즘으로 구성된다.

(Gen, E, D)
  • Gen: 공개키 pk와 비밀키 sk 생성
  • E(pk, m): 공개키로 메시지 암호화
  • D(sk, c): 비밀키로 암호문 복호화

암호화는 공개키로 누구나 할 수 있지만, 복호화는 비밀키를 가진 사람만 할 수 있다.


3. Diffie-Hellman 프로토콜 복습

Diffie-Hellman은 두 사람이 공개된 통신 채널에서 같은 비밀값을 공유할 수 있게 해주는 프로토콜이다.

먼저 다음을 고정한다.

  • G: 유한 순환군, finite cyclic group
  • n: 군 G의 order
  • gG의 generator

generator g는 다음과 같이 군의 모든 원소를 만들 수 있는 원소이다.

G = {1, g, g^2, g^3, ..., g^{n-1}}

Alice와 Bob은 다음 과정을 수행한다.

Alice:
    random a 선택
    A = g^a 계산
    A를 Bob에게 전송

Bob:
    random b 선택
    B = g^b 계산
    B를 Alice에게 전송

그 후 두 사람은 각각 같은 값을 계산한다.

Alice: B^a = (g^b)^a = g^{ab}
Bob:   A^b = (g^a)^b = g^{ab}

따라서 Alice와 Bob은 같은 공유 비밀값 g^{ab}를 얻는다.


4. 왜 공격자는 g^{ab}를 모르는가?

공격자는 공개 채널에서 다음 값들을 볼 수 있다.

g, g^a, g^b

하지만 공격자가 알고 싶은 값은 다음이다.

g^{ab}

Diffie-Hellman 기반 보안은 gg^ag^b를 알아도 g^{ab}를 계산하기 어렵다는 가정에 기반한다.

이를 Diffie-Hellman assumption이라고 생각하면 된다.


5. Diffie-Hellman에서 ElGamal로 바꾸는 아이디어

Diffie-Hellman은 원래 두 사람이 상호작용하면서 공유키를 만드는 프로토콜이다.

ElGamal은 이 구조를 공개키 암호화로 바꾼다.

아이디어는 간단하다.

Bob의 Diffie-Hellman 값 A = g^a를 공개키로 취급한다. Bob은 a를 비밀키로 가지고 있고, 공개키는 A = g^a이다.

sk = a
pk = A = g^a

이제 Alice가 Bob에게 메시지를 보내고 싶다면, Alice는 자신의 임시 랜덤값 b를 골라 Diffie-Hellman 공유값을 만든다.

B = g^b
shared secret = A^b = (g^a)^b = g^{ab}

Alice는 이 공유값에서 대칭키를 만들고 메시지를 암호화한다.

Bob은 B = g^b를 받으면 자신의 비밀키 a로 다음을 계산할 수 있다.

B^a = (g^b)^a = g^{ab}

즉, Alice와 Bob은 같은 공유 비밀값을 얻는다.


6. ElGamal의 직관적 암호화 과정

Bob의 공개키가 A = g^a라고 하자.

Alice가 메시지 m을 보내려면 다음을 수행한다.

1. random b 선택
2. B = g^b 계산
3. shared secret = A^b = g^{ab} 계산
4. shared secret에서 대칭키 k 생성
5. k로 메시지 m 암호화
6. ct = (B, encrypted message) 전송

Bob은 다음을 수행한다.

1. 암호문에서 B = g^b 확인
2. 자신의 비밀키 a로 B^a = g^{ab} 계산
3. 같은 대칭키 k 생성
4. 메시지 복호화

7. ElGamal 시스템: Modern View

강의자료에서는 ElGamal을 modern view로 정리한다.

필요한 구성요소는 다음과 같다.

  • G: order가 n인 finite cyclic group
  • (Es, Ds): symmetric authenticated encryption
  • H: G^2 → K: 해시 함수

여기서 H는 Diffie-Hellman 관련 값들에서 대칭키를 뽑아내는 역할을 한다.


8. Key Generation

ElGamal의 키 생성은 다음과 같다.

Gen:
    choose random generator g in G
    choose random a in Z_n
    h = g^a
    output sk = a, pk = (g, h)
  • 비밀키: a
  • 공개키: (g, h = g^a)

여기서 h는 Bob의 공개 Diffie-Hellman 값이다.


9. Encryption

공개키가 다음과 같다고 하자.

pk = (g, h)

메시지 m을 암호화하는 과정은 다음과 같다.

E(pk = (g, h), m):
    b ← Z_n
    u ← g^b
    v ← h^b
    k ← H(u, v)
    c ← Es(k, m)
    output (u, c)

여기서 의미는 다음과 같다.

  • b: 암호화할 때마다 새로 뽑는 랜덤값
  • u = g^b: 수신자가 공유키를 계산할 수 있게 보내는 값
  • v = h^b = (g^a)^b = g^{ab}: 송신자가 계산한 공유 비밀값
  • k = H(u, v): 실제 대칭키
  • c = Es(k, m): 메시지를 대칭키로 암호화한 결과

최종 암호문은 다음이다.

(u, c)

10. Decryption

비밀키가 a이고 암호문이 (u, c)라고 하자.

복호화 과정은 다음과 같다.

D(sk = a, (u, c)):
    v ← u^a
    k ← H(u, v)
    m ← Ds(k, c)
    output m

왜 같은 키가 나오는지 확인해보자.

암호화에서

u = g^b
v = h^b = (g^a)^b = g^{ab}

복호화에서

v = u^a = (g^b)^a = g^{ab}

따라서 송신자와 수신자는 같은 v를 얻는다. 결국 같은 k = H(u, v)를 만들 수 있다.


11. ElGamal에서 randomness가 중요한 이유

ElGamal은 암호화할 때마다 새로운 b를 뽑는다.

따라서 같은 메시지 m을 같은 공개키로 암호화해도 매번 다른 u = g^b가 나오고, 다른 공유값 v = h^b가 나온다.

결과적으로 같은 메시지도 매번 다른 암호문이 된다.

이 점이 공개키 암호화의 semantic security에 중요하다.


12. ElGamal과 TDF 기반 암호화 비교

TDF 기반 공개키 암호와 ElGamal은 비슷한 구조를 가진다.

관점TDF 기반 공개키 암호ElGamal
랜덤값xb
공개로 보내는 값y = F(pk, x)u = g^b
대칭키 재료xg^{ab}
대칭키H(x)H(u, v)
메시지 암호화Es(H(x), m)Es(H(u, v), m)

둘 다 핵심은 같다.

공개키 방식으로 랜덤 비밀값을 공유하고,
그 비밀값으로 대칭키를 만들어 메시지를 암호화한다.

13. ElGamal의 암호문 구조

ElGamal의 암호문은 다음과 같다.

(u, c)
  • u = g^b: Bob이 공유 비밀값을 계산할 수 있도록 보내는 값
  • c = Es(k, m): 메시지 암호문

여기서 u 자체는 공개되어도 된다. 하지만 u와 공개키 h = g^a만 보고 g^{ab}를 계산하기는 어렵다고 가정한다.


14. ElGamal의 핵심 수식

ElGamal에서 가장 중요한 수식은 다음이다.

h = g^a
u = g^b

암호화자는 다음을 계산한다.

v = h^b = (g^a)^b = g^{ab}

복호화자는 다음을 계산한다.

v = u^a = (g^b)^a = g^{ab}

따라서 양쪽은 같은 값을 얻는다.

11. Signature

1. 디지털 서명이란?

디지털 서명은 공개키 환경에서 메시지의 무결성과 출처를 확인하기 위한 기술이다.

대칭키 환경에서는 MAC을 사용했다. 하지만 공개키 환경에서는 MAC과 다른 점이 있다.

MAC에서는 송신자와 수신자가 같은 비밀키를 공유한다. 반면 디지털 서명에서는 서명자는 비밀키로 서명하고, 누구나 공개키로 그 서명을 검증할 수 있다.

즉, 구조는 다음과 같다.

서명 생성: secret key 사용
서명 검증: public key 사용

2. 디지털 서명의 목적

디지털 서명은 주로 다음 성질을 제공한다.

  1. Integrity
    • 메시지가 변경되지 않았음을 확인한다.
  2. Authentication
    • 메시지가 특정 서명자에게서 왔음을 확인한다.
  3. Public verifiability
    • 비밀키를 모르는 사람도 공개키로 서명을 검증할 수 있다.
  4. Non-repudiation
    • 서명자가 나중에 “내가 서명하지 않았다”고 부인하기 어렵다.

강의자료에서는 디지털 서명이 public-key setting에서 integrity를 제공하며, MAC과 비슷하지만 중요한 차이가 있다고 설명한다.


3. MAC과 디지털 서명의 차이

구분MACDigital Signature
키 구조하나의 공유 비밀키공개키 / 비밀키 쌍
생성비밀키로 tag 생성비밀키로 signature 생성
검증같은 비밀키로 검증공개키로 검증
검증 가능자비밀키를 가진 사람만누구나 가능
공개 검증불가능가능
부인 방지약함강함

MAC에서는 검증자도 같은 비밀키를 알고 있기 때문에, 누가 tag를 만들었는지 제3자에게 증명하기 어렵다. 검증자도 직접 tag를 만들 수 있기 때문이다.

반면 디지털 서명에서는 비밀키를 가진 사람만 서명을 만들 수 있고, 공개키를 가진 누구나 검증할 수 있다. 따라서 제3자에게도 서명의 유효성을 보여줄 수 있다.


4. 디지털 서명 시스템의 구성

디지털 서명 시스템은 보통 세 알고리즘으로 구성된다.

(Gen, Sign, Verify)
  • Gen(): 키쌍 (pk, sk) 생성
  • Sign(sk, m): 비밀키 sk로 메시지 m에 대한 서명 σ 생성
  • Verify(pk, m, σ): 공개키 pk로 서명 검증

검증 결과는 보통 다음 중 하나이다.

yes / no

또는

1 / 0

정상적인 서명이라면 다음이 성립해야 한다.

Verify(pk, m, Sign(sk, m)) = yes

이를 correctness라고 한다.


5. 서명 생성과 검증 흐름

메시지 m에 대해 서명하는 과정은 다음과 같다.

Signer:
    (pk, sk) ← Gen()
    σ ← Sign(sk, m)
    send (m, σ)

검증자는 다음을 수행한다.

Verifier:
    result ← Verify(pk, m, σ)
    if result = yes:
        accept
    else:
        reject

여기서 중요한 점은 검증자가 sk를 몰라도 된다는 것이다. 공개키 pk만 있으면 검증할 수 있다.


6. 디지털 서명의 보안 목표: 위조 불가능성

디지털 서명의 핵심 보안 목표는 existential unforgeability이다.

쉽게 말하면 공격자가 새로운 메시지에 대한 유효한 서명을 만들어내면 안 된다.

공격자는 서명 oracle을 사용할 수 있다고 가정한다. 즉, 공격자는 여러 메시지에 대해 서명을 받아볼 수 있다.

하지만 최종적으로는 자신이 서명 요청한 적 없는 새로운 메시지 m*에 대해 유효한 서명 σ*를 만들어야 한다.

공격 성공 조건은 다음과 같다.

Verify(pk, m*, σ*) = yes

그리고 m*는 이전에 서명 요청한 메시지가 아니어야 한다.


7. Chosen Message Attack, CMA

디지털 서명에서는 공격자가 원하는 메시지에 대한 서명을 받아볼 수 있다고 가정한다. 이를 chosen message attack, CMA라고 한다.

공격 흐름은 다음과 같다.

1. Challenger가 (pk, sk)를 생성한다.
2. 공격자에게 pk를 준다.
3. 공격자는 원하는 메시지 m1, m2, ...에 대해 서명을 요청한다.
4. Challenger는 σi = Sign(sk, mi)를 반환한다.
5. 공격자는 최종적으로 (m*, σ*)를 출력한다.
6. m*가 이전에 요청한 메시지가 아니고 Verify(pk, m*, σ*) = yes이면 공격 성공.

안전한 디지털 서명은 모든 효율적인 공격자가 이런 위조에 성공할 확률이 negligible해야 한다.


8. Forgery란?

Forgery는 위조라는 뜻이다.

디지털 서명에서 forged signature는 공격자가 비밀키 없이 만들어낸 유효한 서명이다.

즉, 다음 조건을 만족하면 forged signature라고 볼 수 있다.

Verify(pk, m, σ) = yes

그런데 공격자가 그 메시지 m에 대한 서명을 정상적으로 받은 적이 없어야 한다.


9. 왜 단순히 RSA를 거꾸로 쓰면 위험할 수 있는가?

직관적으로 RSA를 이용해 다음처럼 서명을 만들고 싶을 수 있다.

Sign(sk, m) = m^d mod N
Verify(pk, m, σ): check σ^e = m mod N

이 방식은 textbook RSA signature라고 볼 수 있다. 하지만 그대로 사용하면 안전하지 않다.

이유는 RSA의 곱셈 구조 때문이다.

예를 들어

σ1^e = m1
σ2^e = m2

라면,

(σ1 · σ2)^e = σ1^e · σ2^e = m1 · m2

가 된다.

즉, 두 서명을 곱하면 새로운 메시지 m1 · m2에 대한 서명처럼 보이는 값을 만들 수 있다. 이런 구조 때문에 textbook RSA signature는 안전하지 않다.

실제로는 해시와 패딩을 함께 사용해야 한다.


10. Hash-then-Sign

긴 메시지 전체를 직접 서명하는 대신 보통 메시지를 먼저 해시한다.

h = H(m)
σ = Sign(sk, h)

검증자는 다음을 확인한다.

h = H(m)
Verify(pk, h, σ)

이를 hash-then-sign이라고 한다.

장점은 다음과 같다.

  1. 긴 메시지를 짧은 digest로 줄일 수 있다.
  2. 서명 알고리즘의 입력 크기를 고정할 수 있다.
  3. 안전한 해시 함수와 함께 사용하면 구조적 공격을 줄일 수 있다.

단, 단순히 해시만 한다고 항상 안전한 것은 아니고, 실제 표준에서는 안전한 padding scheme과 함께 사용한다.


11. 디지털 서명과 공개키 암호화의 방향 차이

공개키 암호화와 디지털 서명은 둘 다 공개키/비밀키를 사용하지만 방향이 다르다.

구분공개키 암호화디지털 서명
목적기밀성무결성, 인증, 부인 방지
사용하는 키공개키로 암호화, 비밀키로 복호화비밀키로 서명, 공개키로 검증
누가 수행?누구나 암호화 가능비밀키 소유자만 서명 가능
누가 확인?비밀키 소유자만 복호화 가능누구나 검증 가능

핵심은 다음과 같다.

Encryption:
    public key로 잠그고 secret key로 연다.

Signature:
    secret key로 서명하고 public key로 확인한다.

12. 디지털 서명에서 공개키 관리가 중요한 이유

디지털 서명 검증자는 공개키 pk를 사용해 서명을 검증한다.

그런데 만약 공격자가 자신의 공개키를 진짜 서명자의 공개키인 것처럼 속이면, 검증자는 공격자의 서명을 진짜로 믿을 수 있다.

따라서 디지털 서명에서도 공개키 관리가 매우 중요하다.

실무에서는 인증서, PKI, certificate authority 같은 구조를 사용해 공개키가 누구의 것인지 확인한다.


13. 디지털 서명의 예시

13.1 소프트웨어 배포

개발자가 프로그램 파일에 서명한다. 사용자는 공개키로 서명을 검증한다. 검증에 성공하면 파일이 개발자가 배포한 원본이고 중간에 변조되지 않았다고 판단할 수 있다.

13.2 전자문서 서명

계약서나 문서에 디지털 서명을 붙이면, 나중에 그 문서가 특정 사람이 서명한 것임을 확인할 수 있다.

13.3 블록체인 트랜잭션

사용자는 자신의 비밀키로 트랜잭션에 서명한다. 네트워크 참여자는 공개키로 서명을 검증하고, 해당 사용자가 실제로 트랜잭션을 승인했는지 확인한다.

기말고사 기출풀이

2019 final

2019년 기말고사

1. 인증암호 판별

기반 암호 (E, D)가 인증암호(AE)라고 할 때, 다음 변형 암호들이 AE인지 판별하고 이유를 설명하시오.

  • (a) E'(k,m) = (E(k,m), H(m))
  • (b) E'(k,m) = (c,c) where c = E(k,m)
  • (c) E'(k,m) = (E(k,m), E(k,m))
  • (d) E'(k,m) = E(k, m ⊕ 1^n)

2. 집합 계산

Z_11 = { } 를 구하시오.


3. 가역원 집합 계산

Z*_16 = { } 를 구하시오.


4. 모듈러 역원

다음 역원이 존재하면 구하시오.

  • 5^-1 mod 18
  • 7^-1 mod 15

5. 모듈러 거듭제곱

99^4 mod 13 을 계산하시오.


6. Square-and-Multiply

Square-and-Multiply 알고리즘으로

2^(1000001)_2 mod 13

을 계산할 때 필요한 최소 곱셈 횟수를 구하시오.


7. 확장 유클리드 알고리즘

확장 유클리드 알고리즘으로

37^-1 mod 123

을 구하시오.


8. Textbook RSA

Textbook RSA에서 N = 33, e = 3일 때 다음을 구하시오.

  • (a) 비밀키 d
  • (b) 평문 2 암호화
  • (c) 암호문 2 복호화

9. Diffie-Hellman 키 교환

p = 19, g = 3, Alice 비밀키 5, Bob 비밀키 7일 때 다음을 구하시오.

  • (a) Alice와 Bob의 공개키
  • (b) 두 사람이 합의하는 공유키

10. ElGamal 암호

p = 23, g = 3, Alice 비밀키 x = 2일 때 다음을 구하시오.

  • (a) (k = 4, c = 12) 복호화
  • (b) 암호화자가 사용한 난수 r을 노출하면 평문을 알 수 있는지 설명

11. Common Modulus Attack

Textbook RSA에서 Alice와 Bob이 같은 N = 77을 사용한다.

  • Alice 공개키: (77, 7)
  • Bob 공개키: (77, 11)
  • 같은 메시지 m에 대해 C_A = 2, C_B = 3

개인키와 φ(N) 없이 m을 복원할 수 있는지 설명하고, 가능하다면 계산하시오.


12. Schnorr 서명

p = 13, g = 2, x = 5, m = 3, H(x||y) = x + y일 때 다음을 수행하시오.

  • 공개키 pk 계산
  • 서명 생성
  • 메시지 m = 3에 대해 검증 수행
  • 위조가 가능하면 어떤 난해 문제가 깨지는지 설명
  • 주어진 설정으로 그 난해 문제를 깨는 방법 설명

13. Blum 정수와 제곱근

N = 21, v = 2일 때, 오라클이 v^2 = 4의 제곱근을 반환한다고 하자.

  • 제곱근을 모두 나열하시오.
  • w를 이용해 gcd(w - v, N)으로 N을 인수분해할 수 있음을 보이시오.

14. GQ 서명

GQ 서명 스킴을 작성하시오.

Blum 정수 N에서 GQ 서명을 위조할 수 있다면, 13번의 방법을 이용해 N을 인수분해하는 방법을 설명하시오.

2021 final

1. 인증암호 판별

기반 암호 (E, D)가 인증암호(AE)라고 할 때, 다음 변형 암호들이 AE인지 판별하고 이유를 설명하시오.

  • (a) E'(k,m) = (E(k,m), H(m))
  • (b) E'(k,m) = (c,c)
  • (c) E'((k1,k2),m) = (E(k1,m), E(k2,m))
  • (d) E'(k,m) = E(k, m ⊕ 1^n)
  • (e) E'(k,m) = (E(k,m), H(E(k,m)))

2. 집합 계산

Z_13 = { } 를 구하시오.


3. 가역원 집합 계산

Z*_18 = { } 를 구하시오.


4. 모듈러 역원

다음 역원을 구하시오.

  • 5^-1 mod 17
  • 7^-1 mod 19

5. 모듈러 거듭제곱

89^5 mod 13 을 계산하시오.


6. Square-and-Multiply

Square-and-Multiply 알고리즘으로

2^(1100001)_2 mod 17

을 계산할 때 필요한 최소 곱셈 횟수를 구하시오.


7. 확장 유클리드 알고리즘

확장 유클리드 알고리즘으로

43^-1 mod 57

을 구하시오.


8. Textbook RSA

p = 7, q = 13, e = 5일 때 다음을 구하시오.

  • (a) N과 비밀키 d
  • (b) 평문 2 암호화
  • (c) 암호문 2 복호화

9. Diffie-Hellman 키 교환

p = 23, g = 3, Alice 비밀키 5, Bob 비밀키 7일 때 다음을 구하시오.

  • (a) Alice와 Bob의 공개키
  • (b) 공유키

10. ElGamal 암호

p = 29, g = 3, Alice 비밀키 x = 3일 때 다음을 구하시오.

  • (a) (k = 4, c = 12) 복호화
  • (b) 난수 r 노출 시 평문을 알 수 있는지 설명

11. Schnorr 서명

p = 17, g = 2, x = 5, m = 3, H(x||y) = x + y일 때 다음을 수행하시오.

  • 공개키 계산
  • 서명 생성
  • 검증 수행
  • 위조 시 어떤 난해 문제가 깨지는지 설명
  • 그 문제를 깨는 방법 설명

2022 final

1. 인증암호 판별

이 해에는 기반 (E, D)CPA 안전하다고만 가정한다.

다음 변형 암호들이 인증암호(AE)인지 판별하고 이유를 설명하시오.

  • (a) E'(k,m) = (E(k,m), H(m))
  • (b) E'(k,m) = (c,c)
  • (c) E'((k1,k2),m) = (E(k1,m), E(k2,m))
  • (d) E'(k,m) = (E(k,m), E(k, m ⊕ 1^n))

2. 가역원 집합 계산

Z*_12 = { } 를 구하시오.


3. 모듈러 역원

다음 역원을 구하시오.

  • 5^-1 mod 12
  • 7^-1 mod 12

4. 확장 유클리드 알고리즘

확장 유클리드 알고리즘으로

50x + 23y = 1

을 만족하는 x, y를 구하고, 50^-1 mod 23을 구하시오.


5. Square-and-Multiply

Square-and-Multiply 알고리즘으로

2^(1100001)_2 mod 11

을 계산할 때 필요한 최소 곱셈 횟수를 구하시오.


6. 오일러 피 함수와 거듭제곱

다음을 구하시오.

  • (a) |Z*_8| = φ(8)|Z*_125|
  • (b) φ(p^3 q^3)의 식
  • (c) 7^2022의 끝 세 자리

7. Textbook RSA

N = 33, e = 3일 때 다음을 구하시오.

  • (a) 비밀키 d
  • (b) 평문 2 암호화
  • (c) 암호문 2 복호화

8. Diffie-Hellman 키 교환

p = 17, g = 3, Alice 비밀키 5, Bob 비밀키 4일 때 다음을 구하시오.

  • (a) Alice와 Bob의 공개키
  • (b) 공유키

9. ElGamal 암호

p = 17, g = 3, Alice 비밀키 x = 4일 때 다음을 구하시오.

  • (a) (k = 9, c = 12) 복호화
  • (b) 난수 r 노출 시 평문을 알 수 있는지 설명

10. RSA 공개지수 조건

n = 5 × 13 = 65일 때, 암호화 지수로 e = 25e = 9 중 어느 것이 동작하고 어느 것이 불가능한지 설명하시오.


11. Common Modulus Attack

N = 77, Alice 공개키 (77, 7), Bob 공개키 (77, 11)이다. 같은 메시지에 대해 C_A = 2, C_B = 3일 때, 개인키와 φ(N) 없이 m을 복원할 수 있는지 설명하고 계산하시오.


12. Schnorr 서명

p = 13, g = 2, x = 5, m = 3, H(x||y) = x + y일 때 다음을 수행하시오.

  • 공개키 계산
  • 서명 생성
  • 검증 수행
  • 위조 시 깨지는 난해 문제 설명
  • 그 문제를 깨는 방법 설명

13. 오일러 정리 증명

오일러 정리

∀x ∈ Z*_n : x^φ(n) ≡ 1 mod n

을 증명하시오.

2023 final

1. 인증암호 판별

CPA 안전한 암호 (E, D)로 만든 다음 시스템들이 인증암호(AE)인지 판별하고 이유를 설명하시오.

  • (a) E'(k,m) = (E(k,m), H(m))
  • (b) E'(k,m) = (c,c) where c = E(k,m)
  • (c) E'((k1,k2),m) = (E(k1,m), E(k2,m))
  • (d) E'(k,m) = (E(k,m), E(k, m ⊕ 1^n))

2. 가역원 집합 계산

Z*_10 = { } 를 구하시오.


3. 모듈러 역원

다음 역원을 구하시오.

  • 2^-1 mod 15
  • 3^-1 mod 15

4. 확장 유클리드 알고리즘

확장 유클리드 알고리즘으로

1234x + 567y = 1

을 만족하는 x, y를 구하고, 567^-1 mod 1234를 구하시오.


5. Square-and-Multiply

Square-and-Multiply 알고리즘으로

2^(1101001)_2 mod 7

을 계산할 때 필요한 최소 곱셈 횟수를 구하시오.


6. 오일러 피 함수와 거듭제곱

다음을 구하시오.

  • (a) |Z*_8| = φ(8)|Z*_125|
  • (b) φ(p^3 q^3)의 식
  • (c) 3^2003의 끝 세 자리

7. Textbook RSA

Textbook RSA에서 N = 35, e = 5일 때 다음을 구하시오.

  • (a) 비밀키 d
  • (b) 평문 2 암호화
  • (c) 암호문 2 복호화

8. Diffie-Hellman 키 교환

p = 17, g = 2, Alice 비밀키 5, Bob 비밀키 4일 때 다음을 구하시오.

  • (a) Alice와 Bob의 공개키
  • (b) 공유키

9. ElGamal 암호

p = 17, g = 2, Alice 비밀키 x = 4일 때 다음을 구하시오.

  • (a) (k = 9, c = 12) 복호화
  • (b) 암호화자가 난수 r을 노출하면 평문을 알 수 있는지 설명

10. Schnorr 서명

Schnorr 서명 스킴이 주어져 있다.

p = 13, g = 3, x = 5, m = 3이고,

H(x||y) = y^x mod (p - 1)

일 때 다음을 수행하시오.

  • 공개키 pk 계산
  • 서명 생성
  • 메시지 m = 3에 대해 검증 수행
  • 공격자가 Schnorr 서명을 위조할 수 있다면 어떤 난해 문제가 깨지는지 설명
  • 위 설정을 이용해 그 난해 문제를 깨는 방법 설명

11. 페르마 소정리 증명

페르마 소정리

∀x ∈ Z*_p : x^(p-1) ≡ 1 mod p

를 증명하시오.


12. DLog 가정과 Schnorr 안전성 증명

다음을 서술하시오.

  • DLog, 즉 이산로그 가정이 무엇인지 설명
  • 10번 Schnorr 서명 스킴의 안전성을 Random Oracle Model에서 DLog 문제로 환원하여 증명

2024 final

1. 가역원 집합 계산

Z*_12 = { } 를 구하시오.


2. 모듈러 역원

다음 역원을 구하시오.

  • 2^-1 mod 12
  • 5^-1 mod 12

3. 확장 유클리드 알고리즘

확장 유클리드 알고리즘으로

1234x + 567y = 1

을 만족하는 x, y를 구하고, 567^-1 mod 1234를 구하시오.


4. Square-and-Multiply

Square-and-Multiply 알고리즘으로

2^(1000001)_2 mod 7

을 계산할 때 필요한 최소 곱셈 횟수를 구하시오.


5. 모듈러 연산 성질 증명

다음 식이 성립함을 증명하시오. 단, 오일러 정리는 증명할 필요 없다.

  • (a) (x + y) mod p = ((x mod p) + (y mod p)) mod p
  • (b) (x * y) mod p = ((x mod p) * (y mod p)) mod p
  • (c) a^x mod N = a^(x mod φ(N)) mod N

6. 오일러 피 함수와 거듭제곱

다음을 구하시오.

  • (a) |Z*_4| = φ(4)|Z*_25|
  • (b) φ(p^2 q^2)의 식
  • (c) (3^2024)^2024의 끝 두 자리

7. Textbook RSA

N = 33, e = 3일 때 다음을 구하시오.

  • (a) 비밀키 d
  • (b) 평문 2 암호화
  • (c) 암호문 2 복호화

8. Diffie-Hellman 키 교환

p = 17, g = 3, Alice 비밀키 4, Bob 비밀키 5일 때 다음을 구하시오.

  • (a) Alice와 Bob의 공개키
  • (b) 공유키

9. ElGamal 암호

p = 17, g = 3, Alice 비밀키 x = 4일 때 다음을 구하시오.

  • (a) (k = 9, c = 12) 복호화
  • (b) 난수 r이 노출되면 평문을 알 수 있는지 설명

10. Schnorr 서명

p = 17, g = 3, x = 4, m = 3이고,

H(x||y) = y^x mod (p - 1)

일 때 다음을 수행하시오.

  • 공개키 계산
  • 서명 생성
  • 메시지 m = 3에 대해 검증 수행
  • 위조 시 어떤 난해 문제가 깨지는지 설명
  • 해당 난해 문제를 깨는 방법 설명

11. 페르마 소정리 증명

페르마 소정리

∀x ∈ Z*_p : x^(p-1) ≡ 1 mod p

를 증명하시오.


12. Common Modulus Attack

Textbook RSA에서 N = 33이다. Alice와 Bob이 같은 N을 사용하고 각각 e = 3, e = 7로 같은 메시지 m을 암호화했다.

  • C_A = m^3 = 26
  • C_B = m^7 = 23

C_A, C_B로부터 m을 계산하는 방법을 쓰시오. 실제로 m을 구하지 않고 식만 써도 된다.


13. Pedersen Commitment Hash

Z*_p에서 g는 generator이고, y는 랜덤하게 선택된 원소이다. 해시 함수가 다음과 같이 정의된다.

H(m1 || m2) = g^m1 y^m2 mod p

DLog assumption이 안전하다면 H가 collision resistant임을 증명하시오.


14. Safe RSA와 인수분해

두 소수 p, p'에 대해 p = 2p' + 1이면 p를 safe prime이라고 한다. safe prime p, q에 대해 N = pq라 하자.

임의의 a ∈ Z*_N에 대해 a^(1/2)를 구할 수 있는 알고리즘 A가 있다고 할 때, Alice가 이 알고리즘을 이용해 N을 인수분해하는 방법을 설명하시오.

힌트:

x^2 - u^2 = (x + u)(x - u) = 0 mod N

2025 final

1. 가역원 집합 계산

Z*_15 = { } 를 구하시오.


2. 모듈러 역원

다음 역원을 구하시오.

  • 2^-1 mod 13
  • 5^-1 mod 13

3. 확장 유클리드 알고리즘

확장 유클리드 알고리즘으로

2025x + 616y = 1

을 만족하는 x, y를 구하고, 616^-1 mod 2025를 구하시오.


4. Square-and-Multiply

Square-and-Multiply 알고리즘으로

3^(2^16 + 1) mod 17

을 계산할 때 필요한 최소 곱셈 횟수를 구하시오.


5. Square-and-Multiply 최소 곱셈 횟수

Square-and-Multiply 알고리즘으로

a^(2^8 - 1) mod p

를 계산할 때 필요한 최소 곱셈 횟수를 구하시오.


6. 모듈러 연산 성질 증명

다음 식이 성립함을 증명하시오.

  • (a) (x + y) mod p = ((x mod p) + (y mod p)) mod p
  • (b) (x * y) mod p = ((x mod p) * (y mod p)) mod p

7. 페르마 소정리 증명

페르마 소정리

∀x ∈ Z*_p : x^(p-1) ≡ 1 mod p

를 증명하시오.


8. 오일러 피 함수와 거듭제곱

다음을 구하시오.

  • (a) |Z*_4| = φ(4)|Z*_25|
  • (b) φ(p^2 q^2)의 식
  • (c) 3^(2025^2 - 20)의 끝 두 자리

9. Textbook RSA

N = 33, e = 3일 때 다음을 구하시오.

  • (a) 비밀키 d
  • (b) 평문 4 암호화
  • (c) 암호문 31 복호화

10. Diffie-Hellman 키 교환

p = 13, g = 3, Alice 비밀키 4, Bob 비밀키 5일 때 다음을 구하시오.

  • (a) Alice와 Bob의 공개키
  • (b) 공유키

11. ElGamal 암호

p = 13, g = 3, Alice 비밀키 x = 4일 때 다음을 구하시오.

  • (a) (k = 9, c = 12) 복호화
  • (b) 암호화자가 난수 r을 노출하면 평문을 알 수 있는지 설명

12. Schnorr 서명

p = 13, g = 3, x = 4, m = 3이고,

H(x||y) = y^x mod (p - 1)

일 때 다음을 수행하시오.

  • 공개키 계산
  • 서명 생성
  • 메시지 m = 3에 대해 검증 수행

13. Threshold Signature with Polynomials

Alice는 (t = 2, n = 3) 구조의 threshold 서명 시스템을 설계했다.

조건은 다음과 같다.

  • 소수 p = 13
  • 비밀키 x = 7
  • 공유 다항식 f(z) = x + a1 z mod 13
  • a1 = 4
  • 각 서명자 i ∈ {1,2,3}는 점 (i, f(i))를 받음

다음을 구하시오.

  • (1) f(1), f(2), f(3) 계산
  • (2) 서명자 1번과 2번의 share로 f(0) = x 복원
  • (3) 서명자 1명만 참여할 경우 비밀 x를 복원할 수 없는 이유 설명

14. Common Modulus Attack

Textbook RSA에서 N = 33이다. Alice와 Bob이 같은 N을 사용하고 각각 e = 3, e = 7로 같은 메시지 m을 암호화했다.

  • C_A = m^3 = 26
  • C_B = m^7 = 23

C_A, C_B로부터 m을 계산하는 방법을 쓰시오. 실제로 m을 구하지 않고 식만 써도 된다.


15. GQ 서명과 비밀키 복원

RSA 기반 Guilou–Quisquater, 즉 GQ 서명 스킴이 주어져 있다.

  • 시스템 파라미터: RSA 모듈러스 N = pq, 공개 지수 e
  • 비밀키: x ∈ Z*_N
  • 공개키: y = x^e mod N
  • 서명:
    • 무작위 r ∈ Z*_N 선택
    • α = r^e mod N
    • h = H(α || m)
    • s = r · x^h mod N
    • 서명 결과 (α, s)
  • 검증:
    • h = H(α || m)
    • s^e ?= α · y^h mod N

공격자가 다음 두 서명을 알고 있다고 하자.

  • 메시지 m1에 대한 서명 (α, s)
  • 같은 α를 사용하는 메시지 m2에 대한 서명 (α, s')

또한

  • h = H(α || m1)
  • h' = H(α || m2)
  • h ≠ h'
  • gcd(h - h', e) = 1

기말 정리본

Seoul, South Korea

jwsong5160@gmail.com

© 2026 Junwoo Song