암호학의 수학 (Mathematics of Cryptography)
인터넷 뱅킹, 메신저, 전자서명, 소프트웨어 업데이트, 전자상거래는 모두 "누가 보아도 되는 정보"와 "반드시 숨겨야 하는 정보"를 구분해야 합니다. 이때 필요한 것이 암호학(Cryptography)이며, 그 중심에는 언제나 수학이 있습니다.
암호학은 자물쇠나 비밀번호만의 문제가 아닙니다. 어떤 계산은 빨리 할 수 있는데, 그 계산을 거꾸로 뒤집는 일은 매우 어렵다는 비대칭성을 찾아내고, 그 위에 통신 규칙을 세우는 학문입니다. 소수, 모듈러 산술, 군(Group), 체(Field), 확률, 정보 이론, 격자(Lattice) 같은 수학이 모두 여기에 연결됩니다.
- 공개키 암호: RSA, Diffie-Hellman, ElGamal, 타원곡선 암호의 수학적 뼈대를 봅니다.
- 대칭키와 해시: AES와 해시 함수 뒤에 있는 유한체, 확률, 충돌 개념을 봅니다.
- 보안 수준: 엔트로피, 난수, 보안 비트의 의미를 정리합니다.
- 양자내성 개요: 격자와 LWE 기반 암호가 왜 주목받는지 직관적으로 설명합니다.
구현 세부사항보다 정의, 수학적 구조, 왜 안전하다고 믿는지, 어디에 쓰이는지를 중심으로 읽으시면 됩니다.
왜 암호학에 수학이 필요합니까
암호학의 목표는 크게 네 가지입니다. 첫째, 제3자가 내용을 읽지 못하게 하는 기밀성(Confidentiality)입니다. 둘째, 내용이 중간에 바뀌지 않았음을 확인하는 무결성(Integrity)입니다. 셋째, 누가 보냈는지 확인하는 인증(Authentication)입니다. 넷째, 처음부터 서로 비밀을 공유하지 않은 두 사람이 안전하게 키를 만드는 키 교환(Key Exchange)입니다.
이 목표들은 직관만으로는 달성되지 않습니다. 암호학은 "공격자가 계산 자원을 얼마나 써도 풀기 어려운가"를 따져야 하므로, 결국 계산 복잡도와 확률, 대수 구조가 필요합니다. 그래서 암호학은 공학이면서 동시에 매우 수학적인 분야입니다.
- HTTPS: 공개키 암호로 세션 키를 안전하게 합의하고, 실제 데이터는 빠른 대칭키 암호로 보호합니다.
- 메신저: 상대 공개키로 비밀을 만들고, 해시와 서명으로 위조 여부를 확인합니다.
- 소프트웨어 업데이트: 제작사의 디지털 서명을 검증해 악성 코드가 끼어들지 않았는지 확인합니다.
- 암호화폐: 타원곡선 서명으로 소유권을 증명하고, 해시 함수로 블록을 연결합니다.
선수 지식: 정수론, 추상대수학, 선형대수학, 확률론, 이산수학
난이도: ★★★★☆ (대학교 초중반 수준, 다만 직관 위주로 읽을 수 있습니다)
| 보안 목표 | 핵심 수학 | 대표 도구 |
|---|---|---|
| 기밀성 | 모듈러 산술, 유한체, 확률 | RSA, ECC, AES |
| 무결성 | 해시, 충돌 확률 | SHA 계열 해시 |
| 인증 | 군, 해시, 역원 | RSA 서명, ECDSA |
| 키 교환 | 이산 로그, 타원곡선, 격자 | Diffie-Hellman, ECDH, LWE 계열 |
모듈러 산술과 역원
모듈러 산술(Modular Arithmetic)은 "나머지"를 기준으로 수를 다루는 계산입니다. 시계가 12시를 지나면 다시 1시로 돌아오듯이, 법(modulus) $m$을 기준으로 같은 나머지를 갖는 수를 같은 것으로 봅니다.
$$a \equiv b \pmod{m} \quad \Longleftrightarrow \quad m \mid (a-b)$$암호학에서는 수가 너무 커지기 때문에, 대부분의 계산을 $\bmod m$ 환경에서 수행합니다. RSA에서는 $\bmod n$, Diffie-Hellman과 ElGamal에서는 $\bmod p$, AES에서는 유한체 연산이 중심이 됩니다.
합동식은 같은 나머지끼리 묶습니다
예를 들어 법 11에서는 $7, 18, 29, -4$가 모두 같은 나머지 7을 줍니다. 그래서
$$7 \equiv 18 \equiv 29 \equiv -4 \pmod{11}$$라고 씁니다. 암호학은 정수 전체를 그대로 들고 다니기보다, 이렇게 같은 나머지끼리 하나의 상태로 압축한 세계에서 계산합니다. 이 생각 덕분에 수가 매우 커져도 결과는 항상 유한한 개수의 잔여류(residue class) 중 하나로 돌아옵니다.
역원은 왜 중요합니까
곱셈의 역연산을 하려면 모듈러 역원(Modular Inverse)이 필요합니다. $a^{-1}$이란
$$a \cdot a^{-1} \equiv 1 \pmod{m}$$을 만족하는 수입니다. 이 역원은 항상 존재하지 않습니다. $\gcd(a,m)=1$일 때에만 존재합니다. 이 조건이 중요한 이유는, 암호학의 많은 알고리즘이 결국 "곱셈을 되돌리는 일"을 해야 하기 때문입니다. RSA의 비밀 지수 $d$도 $e$의 역원으로 정의되고, ECDSA의 서명 계산에도 난수 $k$의 역원이 필요합니다.
정수론에서 배운 베주 항등식 $ax + my = \gcd(a,m)$을 이용하면, $\gcd(a,m)=1$일 때 $ax + my = 1$이 됩니다. 양변을 $\bmod m$으로 보면 $ax \equiv 1 \pmod{m}$이므로, 바로 $x$가 $a$의 모듈러 역원입니다.
작은 수로 보는 역원 찾기
법 11에서 7의 역원을 직접 구해 보겠습니다. 유클리드 호제법을 먼저 쓰면
$$11 = 1 \cdot 7 + 4,\qquad 7 = 1 \cdot 4 + 3,\qquad 4 = 1 \cdot 3 + 1$$입니다. 이제 마지막 식의 1을 앞 식들로 다시 바꾸어 올라가면
$$1 = 4 - 1 \cdot 3 = 4 - (7 - 1 \cdot 4) = 2 \cdot 4 - 1 \cdot 7 = 2 \cdot 11 - 3 \cdot 7$$을 얻습니다. 따라서
$$-3 \cdot 7 \equiv 1 \pmod{11}$$이고, 법 11에서는 $-3 \equiv 8$이므로
$$7^{-1} \equiv 8 \pmod{11}$$입니다. 즉, 모듈러 환경에서 "7로 나눈다"는 말은 실제로는 8을 곱한다는 뜻입니다. 이런 생각이 RSA의 비밀 지수, ECDSA의 nonce 역원 계산으로 이어집니다.
빠른 거듭제곱
암호학은 거듭제곱을 매우 자주 사용합니다. 하지만 $a^{1000000}$을 곧바로 계산하면 너무 느립니다. 그래서 제곱 분할(binary exponentiation)을 사용합니다. 지수를 이진수로 쪼개면 필요한 곱셈 횟수를 크게 줄일 수 있습니다.
function modPow(base, exp, mod) {
var result = 1;
base = base % mod;
while (exp > 0) {
if (exp % 2 === 1) {
result = (result * base) % mod;
}
base = (base * base) % mod;
exp = Math.floor(exp / 2);
}
return result;
}
이 알고리즘은 RSA의 암호화와 복호화, Diffie-Hellman의 공개값 계산, Miller-Rabin 소수 판정 등에서 반복해서 등장합니다.
function modInverse(a, m) {
var r0 = m, r1 = a;
var s0 = 0, s1 = 1;
while (r1 !== 0) {
var q = Math.floor(r0 / r1);
var r2 = r0 - q * r1;
r0 = r1;
r1 = r2;
var s2 = s0 - q * s1;
s0 = s1;
s1 = s2;
}
if (r0 !== 1) return null;
return (s0 % m + m) % m;
}
여기서 반환값이 null이면 역원이 존재하지 않는다는 뜻입니다. 즉, 해당 수는 모듈러 환경에서 나눗셈의 대상이 될 수 없습니다.
제곱 분할을 손으로 따라가 봅시다
$7^{13} \bmod 11$을 계산한다고 하겠습니다. 13을 이진수로 쓰면 $1101_2$이고, 이는 $13 = 8 + 4 + 1$이라는 뜻입니다. 따라서 $7^1, 7^2, 7^4, 7^8$만 만들면 충분합니다.
| 단계 | 계산 | 의미 |
|---|---|---|
| 1 | $7^1 \equiv 7 \pmod{11}$ | 출발점 |
| 2 | $7^2 \equiv 49 \equiv 5 \pmod{11}$ | 한 번 제곱 |
| 3 | $7^4 \equiv 5^2 \equiv 25 \equiv 3 \pmod{11}$ | 다시 제곱 |
| 4 | $7^8 \equiv 3^2 \equiv 9 \pmod{11}$ | 다시 제곱 |
| 5 | $7^{13} \equiv 7^8 \cdot 7^4 \cdot 7 \equiv 9 \cdot 3 \cdot 7 \equiv 2 \pmod{11}$ | 필요한 항만 곱함 |
즉, 큰 지수는 "곱셈을 하나씩 모두 수행하는 문제"가 아니라 "몇 번 제곱하고 필요한 항만 선택하는 문제"로 바뀝니다. RSA, Diffie-Hellman, 밀러-라빈 소수 판정이 모두 이 아이디어를 반복 사용합니다.
| 연산 | 의미 | 암호학에서의 역할 |
|---|---|---|
| $a \bmod m$ | 나머지 계산 | 큰 수를 유한한 상태 공간 안에서 관리 |
| $a^{-1} \bmod m$ | 곱셈 역원 | RSA 비밀 지수, ECDSA 서명 식 |
| $a^k \bmod m$ | 거듭제곱 | RSA, Diffie-Hellman, ElGamal |
소수, 소인수분해, RSA
RSA는 소인수분해(Factorization)의 어려움에 기대는 대표적인 공개키 암호입니다. 소수 $p, q$를 곱해 $n=pq$를 만드는 계산은 쉽지만, $n$만 보고 다시 $p, q$를 찾는 계산은 매우 어렵다고 믿습니다. 이 비대칭성이 공개키와 비밀키를 분리하는 근거가 됩니다.
정의와 구조
RSA에서는 두 큰 소수 $p, q$를 골라 $n=pq$를 만들고,
$$\phi(n) = (p-1)(q-1)$$을 계산합니다. 그런 다음 $\gcd(e,\phi(n))=1$인 공개 지수 $e$를 고르고,
$$ed \equiv 1 \pmod{\phi(n)}$$을 만족하는 비밀 지수 $d$를 구합니다. 공개키는 $(n,e)$이고 비밀키는 $d$입니다. 암호화는 $C \equiv M^e \pmod{n}$, 복호화는 $M \equiv C^d \pmod{n}$입니다.
왜 작동합니까
$ed = 1 + k\phi(n)$이므로, 오일러 정리(Euler's Theorem) 또는 더 정확하게는 카마이클 함수와 중국인의 나머지 정리(CRT)를 사용하면
$$M^{ed} \equiv M \pmod{n}$$이 성립합니다. 즉, 공개키로 올린 거듭제곱을 비밀키로 한 번 더 거듭제곱하면 원래 메시지로 돌아옵니다.
작은 수로 보는 RSA 전체 과정
실제 RSA는 훨씬 더 큰 소수를 쓰지만, 원리를 보기 위해 작은 수로 전체 과정을 따라가 보겠습니다.
| 단계 | 계산 | 뜻 |
|---|---|---|
| 소수 선택 | $p=61,\ q=53$ | 비밀로 보관하는 두 소수입니다. |
| 법 만들기 | $n = pq = 3233$ | 공개키에 들어가는 큰 법입니다. |
| 오일러 피 함수 | $\phi(n) = (61-1)(53-1) = 3120$ | 역원을 구하는 기준입니다. |
| 공개 지수 | $e = 17$ | $\gcd(17,3120)=1$인 값을 고릅니다. |
| 비밀 지수 | $d = 2753$ | $17 \cdot 2753 \equiv 1 \pmod{3120}$입니다. |
| 암호화 | $M=65 \mapsto C \equiv 65^{17} \equiv 2790 \pmod{3233}$ | 공개키 $(n,e)$로 계산합니다. |
| 복호화 | $C=2790 \mapsto M \equiv 2790^{2753} \equiv 65 \pmod{3233}$ | 비밀키 $d$로 원문을 되찾습니다. |
function rsaToyRoundTrip() {
var p = 61;
var q = 53;
var n = p * q;
var phi = (p - 1) * (q - 1);
var e = 17;
var d = modInverse(e, phi);
var message = 65;
var cipher = modPow(message, e, n);
var plain = modPow(cipher, d, n);
return { n: n, e: e, d: d, cipher: cipher, plain: plain };
}
위 숫자는 설명용 예시일 뿐이며, 실제 보안에는 절대로 사용할 수 없습니다. 실제 RSA는 매우 큰 소수와 안전한 패딩(OAEP, PSS 등)을 함께 써야 합니다.
RSA의 키 생성, 오일러 정리, CRT 증명, 디피-헬만의 정수론적 배경은 정수론의 RSA 절과 암호학의 수학적 기초 절에서 더 자세히 볼 수 있습니다.
CRT로 복호화를 더 빠르게 할 수 있습니다
실제 구현은 큰 법 $n$에서 한 번에 거듭제곱하기보다, 더 작은 법 $p$와 $q$에서 따로 계산한 뒤 다시 합칩니다.
$$m_p \equiv C^{d \bmod (p-1)} \pmod{p},\qquad m_q \equiv C^{d \bmod (q-1)} \pmod{q}$$ $$h \equiv q^{-1}(m_p - m_q) \pmod{p},\qquad M = m_q + hq$$이 과정은 중국인의 나머지 정리(CRT) 때문에 원래 복호화와 같은 결과를 주면서, 계산은 훨씬 빠르게 만들어 줍니다. 즉, RSA는 단순히 공식 하나를 아는 것이 아니라, 어떤 구조를 이용해 계산을 줄이는지도 중요합니다.
응용과 한계
RSA는 공개키 암호의 고전적인 표준으로서 매우 중요한 역사적 의미를 가집니다. 다만 핵심 난제가 소인수분해이므로, 쇼어 알고리즘을 갖춘 충분히 큰 양자 컴퓨터가 실용화되면 구조적으로 위협을 받습니다. 그래서 오늘날 암호학은 RSA를 이해하는 동시에, 그 이후의 체계도 함께 공부해야 합니다.
쇼어 알고리즘의 핵심은 소인수분해를 정면으로 밀어붙이는 것이 아니라, 함수 $f(x)=a^x \bmod N$의 주기를 찾는 문제로 바꾸는 데 있습니다. 그런 다음 양자 상태의 위상과 양자 푸리에 변환을 이용해 그 주기를 드러냅니다. 계산 관점의 배경은 양자컴퓨팅의 수학에서 이어서 볼 수 있습니다.
군과 이산로그
이산 로그(Discrete Logarithm)는 공개키 암호학의 또 다른 중심 문제입니다. 소인수분해가 "곱하기는 쉽고 분해는 어렵다"라면, 이산 로그는 "거듭제곱은 쉽고 지수 찾기는 어렵다"라고 요약할 수 있습니다.
순환군과 생성원
소수 $p$에 대하여 $\mathbb{F}_p^\times = \{1,2,\dots,p-1\}$는 곱셈에 대해 군을 이룹니다. 이 군이 순환군일 때, 어떤 원소 $g$의 거듭제곱들이 군 전체를 만들어 냅니다. 이런 $g$를 원시근(Primitive Root) 또는 생성원(generator)이라 합니다.
이때 공개값은
$$y \equiv g^x \pmod{p}$$의 형태로 만들어집니다. 여기서 $x$는 비밀 지수입니다. $g$와 $y$를 아는 사람은 앞 방향 계산은 볼 수 있지만, 거꾸로 $x$를 찾아내는 문제는 어려운 것으로 여겨집니다.
Diffie-Hellman과 ElGamal
Diffie-Hellman 키 교환은 두 사람이 서로의 비밀 지수를 곱한 효과 $g^{ab}$를 공유하도록 설계됩니다.
- 공개 매개변수 $p, g$를 정합니다.
- Alice는 비밀 $a$를 정하고 $A=g^a \bmod p$를 보냅니다.
- Bob은 비밀 $b$를 정하고 $B=g^b \bmod p$를 보냅니다.
- Alice는 $B^a$, Bob은 $A^b$를 계산하면 둘 다 $g^{ab} \bmod p$를 얻습니다.
ElGamal은 같은 구조를 이용해 암호화와 서명을 구성합니다. 핵심은 비밀 스칼라를 한 번 곱해서 공개값을 만들기는 쉽지만, 공개값만으로 비밀 스칼라를 복원하기는 어렵다는 점입니다.
키 교환을 눈으로 보면
중요한 점은 Alice와 Bob이 비밀 수 $a, b$를 직접 보내지 않는다는 것입니다. 공개 채널에는 $A = g^a$, $B = g^b$만 지나가고, 각자는 받은 공개값에 자신의 비밀 지수를 한 번 더 적용해 같은 $g^{ab}$를 얻습니다.
작은 수로 보는 Diffie-Hellman 예시
$p=23$, $g=5$를 공개 매개변수로 두고, Alice가 $a=6$, Bob이 $b=15$를 고른다고 하겠습니다.
| 주체 | 비밀값 | 공개값 | 공유 비밀 계산 |
|---|---|---|---|
| Alice | $a=6$ | $A = 5^6 \equiv 8 \pmod{23}$ | $K = B^6 \equiv 19^6 \equiv 2 \pmod{23}$ |
| Bob | $b=15$ | $B = 5^{15} \equiv 19 \pmod{23}$ | $K = A^{15} \equiv 8^{15} \equiv 2 \pmod{23}$ |
도청자는 $p, g, A, B$는 볼 수 있지만, 6과 15는 직접 볼 수 없습니다. 따라서 공개값만으로 공유 비밀 2를 얻으려면 결국 이산 로그 또는 그에 가까운 어려운 문제를 풀어야 합니다.
암호학은 "연산을 반복해도 구조가 망가지지 않는 공간"이 필요합니다. 군은 결합법칙, 항등원, 역원을 갖추고 있어서 계산을 안전하게 이어 붙일 수 있습니다. 그래서 정수의 나머지 곱셈군, 타원곡선의 점군처럼 구조가 좋은 대상을 찾는 일이 중요합니다.
일반군 공격의 시각으로 보면
이산 로그가 "완전히 불가능"한 것은 아닙니다. 다만 현재 알려진 공격들의 비용이 매우 커서 실용적으로 어렵다고 보는 것입니다. 특히 군의 특별한 구조를 쓰지 않는 일반군(generic group) 공격은 다음과 같은 규모를 가집니다.
| 공격 방법 | 아이디어 | 대략적인 비용 |
|---|---|---|
| 전수 탐색 | 가능한 지수를 하나씩 모두 대입합니다. | 군의 크기에 비례합니다. |
| 베이비 스텝-자이언트 스텝(Baby-step Giant-step) | 앞에서 만든 값과 뒤에서 만든 값을 중간에서 만나게 합니다. | 대략 $\sqrt{n}$ 시간과 $\sqrt{n}$ 메모리가 듭니다. |
| 폴라드 로(Pollard rho) | 무작위 보행이 만든 충돌을 이용합니다. | 대략 $\sqrt{n}$ 시간이 들고 메모리는 더 적게 씁니다. |
따라서 공개키 파라미터를 고를 때는 단순히 "숫자가 커 보이는가"보다, 그 군의 크기와 알려진 공격 복잡도를 함께 보아야 합니다. ECC가 짧은 키로도 강한 이유도 바로 이 관점과 연결됩니다.
유한체와 대칭키 암호
체(Field)는 덧셈, 뺄셈, 곱셈, 나눗셈이 모두 잘 정의되는 수 체계입니다. 암호학에서는 원소가 유한 개뿐인 유한체(Finite Field)가 특히 중요합니다. 공개키 암호에서 유한체는 군의 무대가 되고, 대칭키 암호에서는 바이트 단위 연산을 안정적으로 설계하는 재료가 됩니다.
$\mathbb{F}_p$와 $\mathrm{GF}(2^m)$
가장 익숙한 유한체는 소수 $p$를 법으로 하는 $\mathbb{F}_p$입니다. 여기서는 $0,1,\dots,p-1$만 쓰고, 연산 결과도 항상 다시 이 집합 안으로 돌아옵니다. 타원곡선 암호와 Diffie-Hellman은 이런 유한체 위에서 많이 정의됩니다.
반면 컴퓨터는 비트를 다루므로, 실제 구현에서는 $\mathrm{GF}(2^m)$도 매우 중요합니다. 여기서는 덧셈이 사실상 XOR와 같고, 곱셈은 다항식을 곱한 뒤 기약다항식으로 나머지를 취하는 방식으로 정의됩니다.
$\mathrm{GF}(2)$에서는 가능한 숫자가 0과 1뿐이며, $1 + 1 = 0$입니다. 올림이 허용되지 않기 때문입니다. 그래서 비트 단위 덧셈은 정확히 XOR와 같은 규칙을 따릅니다. AES에서 XOR는 단순한 비트 트릭이 아니라, 유한체 덧셈의 한 표현입니다.
작은 수로 보는 $\mathrm{GF}(2^8)$ 계산
AES에서는 바이트 하나를 단순한 정수가 아니라 다항식처럼 다룹니다. 예를 들어
$$0x57 = x^6 + x^4 + x^2 + x + 1$$처럼 볼 수 있습니다. 이때 덧셈은 자리올림 없는 더하기이므로 XOR와 같습니다. 따라서
$$0x57 \oplus 0x83 = 0xd4$$입니다. 곱셈은 더 복잡하지만, 핵심 블록은 한 번 왼쪽으로 밀고 필요하면 기약다항식으로 줄이는 xtime 연산입니다.
function xtime(byte) {
byte = byte << 1;
if (byte & 0x100) {
byte = byte ^ 0x11b;
}
return byte & 0xff;
}
function gfMultiply(a, b) {
var result = 0;
while (b > 0) {
if (b & 1) {
result = result ^ a;
}
a = xtime(a);
b = b >> 1;
}
return result;
}
| 계산 | 결과 | 뜻 |
|---|---|---|
| $\operatorname{xtime}(0x57)$ | $0xae$ | 바이트에 $x$를 한 번 곱한 것과 같습니다. |
| $0x57 \cdot 0x13$ | $0xfe$ | AES 설명에서 자주 쓰는 대표 유한체 곱셈 예시입니다. |
즉, AES의 바이트 연산은 단순한 비트 조작이 아니라 유한체 연산입니다. 이 관점 덕분에 역원, 선형 변환, 비선형 변환을 정확한 수학 구조 위에 올릴 수 있습니다.
AES와 유한체
AES는 바이트를 단순한 0부터 255까지의 숫자로만 보는 것이 아니라, $\mathrm{GF}(2^8)$의 원소로 봅니다. 이렇게 하면 각 바이트에 대해 역원을 정의할 수 있고, 선형 변환과 비선형 변환을 안정적으로 설계할 수 있습니다. 특히 S-box는 유한체 역원과 아핀 변환을 조합해 만들어집니다.
즉, 대칭키 암호는 "정수론 기반"이라기보다 "유한체와 선형대수 기반"에 가깝습니다. 여기서 중요한 것은 어떤 계산이 빠른가뿐 아니라, 작은 변화가 전체 상태에 얼마나 잘 퍼지는가, 역연산이 가능한가, 패턴이 얼마나 숨겨지는가입니다.
AES 한 라운드의 수학
AES 한 라운드는 보통 SubBytes, ShiftRows, MixColumns, AddRoundKey 네 단계로 설명합니다. 이 네 단계는 각각 다른 수학적 역할을 맡습니다.
$$ \text{State} \xrightarrow{\text{SubBytes}} \xrightarrow{\text{ShiftRows}} \xrightarrow{\text{MixColumns}} \xrightarrow{\text{AddRoundKey}} \text{New State} $$SubBytes는 바이트마다 비선형 변환을 주어 패턴을 깨뜨리고, ShiftRows는 위치를 섞고, MixColumns는 각 열에 행렬을 곱해 정보가 주변 바이트로 퍼지도록 만듭니다. 마지막 AddRoundKey는 비밀키와 XOR해 실제 비밀을 주입합니다.
예를 들어 MixColumns는 각 열 벡터에 다음 행렬을 $\mathrm{GF}(2^8)$ 위에서 곱하는 연산으로 볼 수 있습니다.
$$ \begin{pmatrix} 02 & 03 & 01 & 01 \\ 01 & 02 & 03 & 01 \\ 01 & 01 & 02 & 03 \\ 03 & 01 & 01 & 02 \end{pmatrix} \begin{pmatrix} b_0 \\ b_1 \\ b_2 \\ b_3 \end{pmatrix} $$여기서 $02, 03, 01$은 십진수 가중치가 아니라 유한체 $\mathrm{GF}(2^8)$의 원소입니다. 즉, 평범한 행렬 곱처럼 보이지만 실제 계산 규칙은 유한체 연산입니다.
| 수학 대상 | 대표 연산 | 대표 응용 |
|---|---|---|
| $\mathbb{F}_p$ | 나머지 덧셈과 곱셈 | Diffie-Hellman, ECC의 기초 공간 |
| $\mathrm{GF}(2^8)$ | XOR, 다항식 곱셈, 역원 | AES의 바이트 연산 |
| 행렬 | 선형 혼합 | 대칭키 암호의 확산, 코드 설계 |
타원곡선과 ECC
타원곡선 암호(ECC)는 유한체 위의 타원곡선 점들이 이루는 군을 사용합니다. 곡선 위의 점 $P$를 여러 번 더해 $Q=nP$를 만드는 계산은 빠르지만, $P$와 $Q$가 주어졌을 때 $n$을 찾는 타원곡선 이산로그 문제(ECDLP)는 어려운 것으로 알려져 있습니다.
점 덧셈과 스칼라 곱
실수 위의 타원곡선에서는 직선이 곡선을 만나는 세 번째 점을 이용해 덧셈을 정의할 수 있고, 유한체 위에서는 이 공식이 대수적으로 옮겨집니다. 그 결과 "점 하나를 여러 번 더하는 계산", 즉 스칼라 곱(Scalar Multiplication)이 핵심 연산이 됩니다.
ECC의 장점은 같은 보안 수준을 더 짧은 키 길이로 얻을 수 있다는 점입니다. 이는 저장 공간, 전송량, 모바일 기기 성능 측면에서 큰 장점이 됩니다.
작은 곡선에서 점 덧셈을 계산해 봅시다
유한체 $\mathbb{F}_p$ 위 곡선 $y^2 \equiv x^3 + ax + b \pmod{p}$에서 두 점 $P=(x_1,y_1)$, $Q=(x_2,y_2)$를 더할 때는 먼저 기울기 역할을 하는 값 $\lambda$를 구합니다.
$$\lambda \equiv (y_2-y_1)(x_2-x_1)^{-1} \pmod{p}$$ $$x_3 \equiv \lambda^2 - x_1 - x_2 \pmod{p},\qquad y_3 \equiv \lambda(x_1-x_3)-y_1 \pmod{p}$$같은 점을 두 번 더하는 경우에는
$$\lambda \equiv (3x_1^2+a)(2y_1)^{-1} \pmod{p}$$를 씁니다. 여기서도 핵심은 결국 모듈러 역원입니다.
예를 들어 곡선
$$y^2 \equiv x^3 + 2x + 2 \pmod{17}$$위에서 $G=(5,1)$를 잡으면
$$2G = (6,3),\qquad 3G = (10,6),\qquad 19G = \mathcal{O}$$가 됩니다. 즉, 이 예시에서는 $G$를 19번 더하면 항등원 $\mathcal{O}$로 돌아옵니다.
| 역할 | 계산 | 결과 |
|---|---|---|
| Alice 비밀 | $a=5$ | $A = 5G = (9,16)$ |
| Bob 비밀 | $b=7$ | $B = 7G = (0,6)$ |
| 공유 비밀 | $5B = 7A = 35G = 16G$ | $(10,11)$ |
function mod(value, p) {
return (value % p + p) % p;
}
function pointAdd(P, Q, a, p) {
if (P === null) return Q;
if (Q === null) return P;
var x1 = P[0];
var y1 = P[1];
var x2 = Q[0];
var y2 = Q[1];
var lambda;
var x3;
var y3;
if (x1 === x2 && mod(y1 + y2, p) === 0) {
return null;
}
if (x1 === x2 && y1 === y2) {
if (mod(2 * y1, p) === 0) {
return null;
}
lambda = mod((3 * x1 * x1 + a) * modInverse(mod(2 * y1, p), p), p);
} else {
lambda = mod((y2 - y1) * modInverse(mod(x2 - x1, p), p), p);
}
x3 = mod(lambda * lambda - x1 - x2, p);
y3 = mod(lambda * (x1 - x3) - y1, p);
return [x3, y3];
}
function scalarMultiply(k, P, a, p) {
var result = null;
var addend = P;
while (k > 0) {
if (k % 2 === 1) {
result = pointAdd(result, addend, a, p);
}
addend = pointAdd(addend, addend, a, p);
k = Math.floor(k / 2);
}
return result;
}
이 알고리즘은 구조적으로 modPow와 매우 닮아 있습니다. 거듭제곱에서 제곱을 반복하듯이, ECC에서는 점 두 배를 반복하면서 필요한 항만 더합니다. 그래서 이를 두 배 후 더하기(double-and-add)라고 부릅니다.
ECDH와 ECDSA
ECDH는 Diffie-Hellman을 타원곡선 위로 옮긴 것이고, ECDSA는 타원곡선 위에서 디지털 서명을 구현한 것입니다. 두 경우 모두 비밀 스칼라와 공개 점의 관계가 핵심입니다.
ECDSA는 서명마다 새로운 난수 $k$를 사용해야 합니다. 같은 $k$를 두 번 재사용하면, 두 개의 서명 식을 연립해 비밀키를 복원할 수 있습니다. 즉, 암호학에서 "좋은 수학"만큼 "좋은 난수"도 중요합니다.
곡선의 점 덧셈, 유리점 구조, ECDH와 ECDSA의 더 자세한 설명은 대수기하학의 ECC 응용 절, 타원곡선 절, 응용 심화 절에서 이어집니다.
해시, 충돌, 디지털 서명
해시 함수(Hash Function)는 긴 입력을 짧은 고정 길이 출력으로 압축하는 함수입니다. 좋은 암호학적 해시 함수는 출력만 보고 원래 입력을 찾기 어렵고(역상 저항성), 같은 해시값을 갖는 다른 입력을 찾기 어렵고(충돌 저항성), 한 입력과 같은 해시를 갖는 다른 입력을 찾기 어렵습니다(제2역상 저항성).
충돌과 생일 역설
출력 길이가 $n$비트인 해시 함수에서 무작위 충돌은 대략 $2^{n/2}$번 정도 시도하면 나타날 수 있습니다. 이것이 생일 역설(Birthday Paradox)입니다. 그래서 해시 출력 길이는 충돌 저항성과 직접 연결됩니다.
예를 들어 256비트 해시의 충돌 저항성은 대략 128비트 수준으로 이해합니다. 이 차이는 "출력 길이"와 "실제 보안 비트"를 구분해야 한다는 점을 보여 줍니다.
왜 서명 전에 해시합니까
디지털 서명은 보통 긴 문서 전체를 직접 서명하지 않고, 먼저 해시값을 만든 뒤 그 짧은 요약값에 서명을 합니다. 이렇게 하면 계산이 빠르고, 문서가 조금만 바뀌어도 해시값이 크게 바뀌므로 위조 탐지가 쉬워집니다.
눈사태 효과를 직관으로 봅시다
좋은 해시 함수는 입력이 한 비트만 바뀌어도 출력의 많은 비트가 함께 바뀌게 설계됩니다. 이를 눈사태 효과(Avalanche Effect)라고 합니다. 이 성질이 약하면 비슷한 파일이 비슷한 해시를 내어 패턴이 남게 됩니다.
물론 "출력이 많이 달라 보인다"는 사실만으로 암호학적 안전성이 증명되는 것은 아닙니다. 그래도 좋은 해시가 어떤 모습을 가져야 하는지 감각적으로 이해하는 데는 매우 중요합니다.
| 개념 | 뜻 | 중요한 이유 |
|---|---|---|
| 역상 저항성 | 해시값만 보고 입력 찾기 어려움 | 비밀번호 저장, 다이제스트 보호 |
| 충돌 저항성 | 같은 해시를 주는 두 입력 찾기 어려움 | 서명 위조 방지 |
| 생일 경계 | 충돌 탐색은 대략 $2^{n/2}$ 규모 | 해시 길이와 보안 비트 해석 |
엔트로피와 보안 수준
엔트로피(Entropy)는 쉽게 말해 "예측하기 어려운 정도"입니다. 암호학에서 난수는 키, nonce, IV, 서명용 일회성 값 등 여러 곳에 들어가므로, 엔트로피가 부족하면 수학적으로 좋은 체계도 실제로는 쉽게 깨질 수 있습니다.
보안 비트란 무엇입니까
"128비트 보안"이라는 말은, 가장 좋은 알려진 공격을 써도 대략 $2^{128}$ 규모의 작업이 필요하다는 뜻으로 이해합니다. 여기서 중요한 점은 키 길이 자체와 실제 공격 복잡도가 항상 같지 않다는 것입니다. 해시는 생일 경계 때문에 출력 길이의 절반 정도가 충돌 보안 수준이 되고, RSA나 ECC는 각각 다른 수학적 난제에 따라 보안 수준을 해석합니다.
난수의 품질
컴퓨터는 본질적으로 결정적인 기계이므로, 진짜 무작위와 비슷한 값을 만들려면 충분한 초기 엔트로피와 안전한 난수 생성기가 필요합니다. 특히 서명에서 nonce를 재사용하거나 편향된 난수를 쓰면 비밀키가 새어 나갈 수 있습니다.
최소 엔트로피를 함께 봐야 합니다
암호학에서는 평균적인 불확실성보다 "가장 맞히기 쉬운 값이 얼마나 자주 나오는가"가 더 중요할 때가 많습니다. 이를 최소 엔트로피(Min-Entropy)라고 하며
$$H_\infty(X) = -\log_2\left(\max_x \Pr[X=x]\right)$$로 정의합니다. 어떤 값이 절반 확률로 나온다면 최소 엔트로피는 1비트뿐입니다. 겉보기 경우의 수가 많아 보여도, 몇몇 값이 지나치게 자주 나오면 실제 보안은 크게 떨어집니다.
| 무작위 원천 | 가장 큰 확률 | 최소 엔트로피 | 해석 |
|---|---|---|---|
| 균등한 8비트 바이트 | $1/256$ | $8$비트 | 이상적인 1바이트 난수입니다. |
| 앞면이 90% 나오는 동전 | $0.9$ | 약 $0.15$비트 | 거의 예측 가능하므로 암호용으로 부적합합니다. |
| $2^{20}$개 후보 중 균등 선택 | $2^{-20}$ | $20$비트 | 128비트 보안과는 매우 거리가 멉니다. |
검색 공간의 크기를 감각적으로 비교해 봅시다
암호학에서 "충분히 크다"는 말은 막연한 표현이 아닙니다. 가능한 후보의 개수가 얼마나 되는지, 공격자가 그 공간을 얼마나 빨리 뒤질 수 있는지를 같이 봐야 합니다. 다음 비교는 사람이 기억하기 좋은 비밀번호와 암호키가 왜 다른지 잘 보여 줍니다.
| 대상 | 경우의 수 | 대략적인 비트 규모 | 해석 |
|---|---|---|---|
| 4자리 PIN | $10^4$ | 약 $2^{13}$ | 전수 탐색이 매우 쉽습니다. |
| 영문 소문자 8자리 | $26^8$ | 약 $2^{38}$ | 사람에게는 길어 보여도 현대 계산에는 작습니다. |
| 128비트 대칭키 | $2^{128}$ | $2^{128}$ | 실질적으로 전수 탐색이 불가능한 규모입니다. |
| 256비트 해시 충돌 탐색 | 약 $2^{128}$ | $2^{128}$ | 생일 경계 때문에 절반 지수 수준으로 봅니다. |
즉, 암호학은 단순히 "길어 보이는 문자열"을 쓰는 문제가 아니라, 공격 가능한 후보 공간 자체를 천문학적으로 키우는 문제입니다.
암호학에서 실패는 종종 "수학이 틀려서"가 아니라 "난수가 약해서" 일어납니다. 충분한 엔트로피 없이 생성한 키, 반복 사용한 nonce, 예측 가능한 초기화 값은 실제 공격의 출발점이 됩니다.
| 대상 | 왜 무작위가 필요합니까 | 실패 시 위험 |
|---|---|---|
| 비밀키 | 처음부터 예측 불가능해야 함 | 전수 탐색 범위가 급격히 줄어듦 |
| 서명 nonce | 매 서명마다 독립적이어야 함 | 비밀키 노출 가능 |
| IV와 nonce | 같은 평문 패턴 반복 노출 방지 | 패턴 누출, 위조 가능성 증가 |
격자와 양자내성 암호
RSA와 ECC는 각각 소인수분해와 이산로그에 기대고 있습니다. 그런데 충분히 큰 양자 컴퓨터가 등장한다면, 쇼어 알고리즘이 이 두 문제를 효율적으로 풀 수 있습니다. 그래서 현대 암호학은 양자내성(Post-Quantum) 구조를 찾고 있으며, 그중 가장 중요한 후보가 격자 기반 암호(Lattice-based Cryptography)입니다.
격자의 기본 직관
격자(Lattice)는 몇 개의 기저 벡터를 정수 계수로 조합해 얻는 점들의 집합입니다. 2차원에서는 바둑판이나 기울어진 그리드처럼 보입니다. 여기서 짧은 벡터를 찾거나, 어떤 점에 가장 가까운 격자점을 찾는 문제는 매우 어렵습니다.
LWE 아이디어
학습과 오차 문제(Learning With Errors, LWE)는 선형 방정식에 작은 잡음을 섞어 비밀을 숨깁니다. 전형적인 모양은
$$b_i \equiv \langle a_i, s \rangle + e_i \pmod{q}$$입니다. 여기서 $s$는 비밀 벡터, $a_i$는 공개 벡터, $e_i$는 작은 잡음입니다. 잡음이 없으면 단순한 선형대수 문제이지만, 잡음이 조금만 섞여도 비밀을 안정적으로 분리하기가 매우 어려워집니다.
이 문제는 선형대수, 확률, 기하학이 동시에 만나는 지점입니다. 실제 양자내성 공개키 암호는 이 아이디어를 더 정교한 다항식 구조 위로 옮겨 사용합니다.
잡음이 없으면 선형대수, 잡음이 있으면 암호학
예를 들어 잡음이 없다면
$$2s_1 + 3s_2 \equiv 7,\qquad 4s_1 + s_2 \equiv 5 \pmod{11}$$처럼 생긴 식들을 여러 개 모아 가우스 소거법으로 $s_1, s_2$를 풀 수 있습니다. 즉, 그냥 선형대수 문제입니다. 그런데 실제 LWE에서는 오른쪽 값에 작은 오차 $e_i$가 조금씩 붙습니다. 그러면 모든 식을 정확히 만족하는 해가 사라지고, 여러 개의 "거의 맞는 후보"가 생깁니다.
암호는 바로 이 애매함을 이용합니다. 잡음은 작아서 정상 사용자는 구조를 유지할 수 있지만, 공격자에게는 정답을 흐려 놓는 안개처럼 작동합니다. 그래서 LWE는 선형대수만으로 곧바로 풀리지 않고, 격자 문제와 연결되는 훨씬 어려운 문제로 바뀝니다.
작은 수로 보는 LWE 예시
법 $11$에서 비밀 벡터 $s=(3,4)$를 숨긴다고 가정하겠습니다. 다음 표에서 왼쪽 벡터 $a_i$와 오른쪽 값 $b_i$는 공개되고, 비밀은 $s$뿐입니다.
| 공개 벡터 | 잡음 없음 | 잡음 포함 |
|---|---|---|
| $a_1 = (2,5)$ | $2 \cdot 3 + 5 \cdot 4 \equiv 4 \pmod{11}$ | $4 + 1 \equiv 5 \pmod{11}$ |
| $a_2 = (7,1)$ | $7 \cdot 3 + 1 \cdot 4 \equiv 3 \pmod{11}$ | $3 - 1 \equiv 2 \pmod{11}$ |
| $a_3 = (6,8)$ | $6 \cdot 3 + 8 \cdot 4 \equiv 6 \pmod{11}$ | $6 + 1 \equiv 7 \pmod{11}$ |
잡음이 없는 열만 보면 선형연립방정식이므로 가우스 소거법으로 비밀을 바로 복원할 수 있습니다. 하지만 잡음이 들어간 열은 어떤 $s$도 식을 정확히 동시에 만족하지 못합니다. 공격자는 "가장 그럴듯한 비밀"을 찾아야 하고, 이 문제가 격자와 가까운 어려운 문제로 바뀝니다.
핵심은 "큰 소수를 더 크게 쓰자"가 아닙니다. 아예 다른 종류의 수학적 난제로 기반을 바꾸는 것입니다. 격자 계열은 선형대수, 확률, 기하적 난제를 함께 사용하며, 현재까지는 소인수분해나 이산로그처럼 효율적인 양자 알고리즘이 알려져 있지 않습니다.
현재까지 알려진 강력한 양자 알고리즘 가운데 쇼어는 소인수분해와 이산 로그에는 매우 효과적이지만, 격자 기반 난제에 대해서는 같은 수준의 효율적 알고리즘이 알려져 있지 않습니다. 그래서 "양자컴퓨터가 어떤 수학을 잘 다루는가"를 이해하면 왜 공개키 암호 설계가 바뀌는지도 더 선명하게 보입니다. 관련 배경은 양자컴퓨팅의 수학에서 정리합니다.
전체 정리
암호학은 하나의 공식으로 끝나는 과목이 아닙니다. 서로 다른 수학적 구조가 서로 다른 보안 목표를 맡고 있습니다. 중요한 것은 "어떤 문제를 어렵다고 믿는가"와 "그 문제 위에 어떤 프로토콜을 세우는가"를 함께 보는 일입니다.
| 수학 구조 | 핵심 난제 또는 성질 | 대표 암호 프리미티브 | 대표 응용 |
|---|---|---|---|
| 정수론 | 소인수분해, 모듈러 역원 | RSA | 공개키 암호, 서명 |
| 군론 | 이산 로그 | Diffie-Hellman, ElGamal | 키 교환, 공개키 암호 |
| 유한체 | 역원과 선형 변환 | AES | 대칭키 암호 |
| 타원곡선 | ECDLP | ECDH, ECDSA | 모바일 보안, TLS, 전자서명 |
| 확률과 정보 이론 | 충돌 확률, 엔트로피 | 해시, 난수 생성 | 무결성, 인증, 키 생성 |
| 격자와 선형대수 | LWE, 짧은 벡터 문제 | 양자내성 공개키 암호 | 차세대 공개키 체계 |
- 정수론의 RSA 절: 오일러 정리, CRT, RSA 증명을 더 자세히 볼 수 있습니다.
- 정수론의 원시근과 이산 로그 절: Diffie-Hellman의 정수론적 배경을 볼 수 있습니다.
- 추상대수학: 군, 환, 체가 암호학에서 왜 중요한지 전체 구조를 볼 수 있습니다.
- 대수기하학의 응용 심화 절: ECC, ECDH, ECDSA를 더 깊게 볼 수 있습니다.
- 확률론: 해시 충돌, 엔트로피, 무작위성 해석을 더 탄탄하게 다질 수 있습니다.
- 양자컴퓨팅의 수학: 쇼어 알고리즘과 양자 푸리에 변환의 수학적 그림을 볼 수 있습니다.
정리하면, 암호학의 수학은 "어려운 문제를 골라 그 위에 보안 규칙을 세우는 기술"입니다. 소수와 나머지 계산에서 시작해, 유한체와 타원곡선, 해시와 엔트로피, 격자와 양자내성 구조까지 이어지는 큰 지도를 머릿속에 넣어 두면 각 알고리즘이 왜 존재하는지 훨씬 선명하게 보입니다.