<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Security on kenji.blog</title><link>http://kenji.blog/ko/categories/security/</link><description>Recent content in Security on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>ko</language><copyright>kenjinote</copyright><lastBuildDate>Fri, 11 Sep 2026 21:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/ko/categories/security/index.xml" rel="self" type="application/rss+xml"/><item><title>격자 암호(Lattice-based cryptography)의 수학적 직관</title><link>http://kenji.blog/ko/p/lattice-based-cryptography-math-intuition/</link><pubDate>Fri, 11 Sep 2026 21:00:00 +0900</pubDate><guid>http://kenji.blog/ko/p/lattice-based-cryptography-math-intuition/</guid><description>&lt;img src="http://kenji.blog/p/lattice-based-cryptography-math-intuition/img/eyecatch.jpg" alt="Featured image of post 격자 암호(Lattice-based cryptography)의 수학적 직관" />&lt;h1 id="1-도입-포스트-양자-암호pqc의-여명과-격자-암호의-대두">1. 도입: 포스트 양자 암호(PQC)의 여명과 격자 암호의 대두
&lt;/h1>&lt;p>현대 사회의 디지털 인프라를 지탱하고 있는 것은 RSA 암호나 타원곡선암호(ECC)를 비롯한 공개키 암호 기술입니다. 이러한 암호 방식은 &amp;lsquo;소인수분해 문제&amp;rsquo;나 &amp;lsquo;이산대수 문제&amp;rsquo;와 같은, 기존의 고전 컴퓨터로는 효율적으로 풀 수 없다고(지수 함수적인 시간이 소요된다고) 믿어지는 수학적 난해성에 안전성의 근거를 두고 있습니다.&lt;/p>
&lt;p>그러나 1994년 피터 쇼어(Peter Shor)가 발표한 &amp;lsquo;쇼어 알고리즘(Shor&amp;rsquo;s algorithm)&amp;lsquo;은 암호계에 큰 충격을 주었습니다. 이 알고리즘은 대규모 양자 컴퓨터가 실현될 경우 소인수분해 문제나 이산대수 문제를 다항식 시간 내에 풀어버린다는 것을 수학적으로 증명한 것입니다. 이는 즉, 현재 널리 이용되고 있는 공개키 암호가 장래에는 완전히 해독 가능해진다는 것을 의미합니다.&lt;/p>
&lt;p>이러한 &amp;lsquo;양자 컴퓨터의 위협(Quantum Threat)&amp;lsquo;에 대응하기 위해, 양자 컴퓨터를 사용해도 해독이 어려운 새로운 암호 방식의 연구가 시급해졌습니다. 이것이 &amp;lsquo;포스트 양자 암호(Post-Quantum Cryptography: PQC)&amp;rsquo; 또는 &amp;lsquo;양자 내성 암호&amp;rsquo;라고 불리는 분야입니다.&lt;/p>
&lt;p>PQC에는 몇 가지 유력한 후보가 존재합니다. 해시 기반 암호, 코드 기반 암호, 다변수 다항식 암호, 아이소제니 기반 암호 등을 들 수 있지만, 그 중에서도 현재 가장 주목받고 있으며 NIST(미국 국립표준기술연구소)의 PQC 표준화 프로세스의 중심이 되고 있는 것이 바로 &amp;lsquo;격자 암호(Lattice-based cryptography)&amp;lsquo;입니다. 격자 암호는 다른 방식과 비교하여 암호화 및 복호화 처리 속도가 매우 빠르며, 또한 &amp;lsquo;최악의 경우 복잡도(Worst-case complexity)&amp;lsquo;를 &amp;lsquo;평균적인 경우 복잡도(Average-case complexity)&amp;lsquo;로 환원하는, 암호 이론에 있어서 극히 강력한 안전성 증명을 갖는다는 두드러진 특징을 가지고 있습니다.&lt;/p>
&lt;p>본 기사에서는 이 격자 암호의 기초가 되는 &amp;lsquo;격자(Lattice)&amp;lsquo;의 수학적 정의부터 출발하여, 격자 상의 어려운 문제인 SVP(최단 벡터 문제)나 CVP(최근접 벡터 문제), 그리고 현대 격자 암호의 심장부라고도 할 수 있는 &amp;lsquo;LWE 문제(Learning With Errors)&amp;lsquo;에 대해 수식과 기하학적인 직관, 그리고 구체적인 수치 예를 섞어 철저하고 깊이 있게 해설하겠습니다.&lt;/p>
&lt;h1 id="2-격자lattice의-수학적-정의와-기하학적-직관">2. 격자(Lattice)의 수학적 정의와 기하학적 직관
&lt;/h1>&lt;h2 id="21-벡터-공간과-격자">2.1 벡터 공간과 격자
&lt;/h2>&lt;p>수학에서 &amp;lsquo;격자(Lattice)&amp;lsquo;란 $n$차원 실수 벡터 공간 $\mathbb{R}^n$ 내에 규칙적으로 늘어선 이산적인 점들의 집합을 말합니다. 선형대수학에서 배우는 벡터 공간(Vector Space)과 비슷하지만 결정적인 차이가 있습니다. 벡터 공간이 기저 벡터의 &amp;lsquo;실수 계수&amp;rsquo;를 통한 선형 결합으로 표현되는 연속적인 공간인 반면, 격자는 기저 벡터의 &amp;lsquo;정수 계수&amp;rsquo;를 통한 선형 결합으로 표현되는 이산적인 공간입니다.&lt;/p>
&lt;p>수학적으로 엄밀한 정의를 내려보겠습니다. $m$차원 실수 벡터 공간 $\mathbb{R}^m$에서의 $n$개($n \le m$)의 선형 독립적인 벡터 $\mathbf{b}_1, \mathbf{b}_2, \dots, \mathbf{b}_n$을 생각해 봅시다. 이들 벡터를 열벡터로 가지는 행렬을 $B = [\mathbf{b}_1, \mathbf{b}_2, \dots, \mathbf{b}_n] \in \mathbb{R}^{m \times n}$이라고 합니다. 이 $B$를 격자의 &amp;lsquo;기저(Basis)&amp;lsquo;라고 부릅니다.&lt;/p>
&lt;p>이 기저 $B$에 의해 생성되는 격자 $\mathcal{L}(B)$는 다음과 같이 정의됩니다.&lt;/p>
$$
\mathcal{L}(B) = \left\{ \sum_{i=1}^{n} x_i \mathbf{b}_i \mathrel{\bigg|} x_i \in \mathbb{Z} \right\} = \{ B \mathbf{x} \mid \mathbf{x} \in \mathbb{Z}^n \}
$$
&lt;p>여기서 중요한 것은 계수 $x_i$가 실수 $\mathbb{R}$이 아니라 정수 $\mathbb{Z}$로 한정되어 있다는 점입니다. 이로 인해 공간 내에 무수히 존재하는 연속적인 점이 아니라, 일정한 간격으로 배치된 교차점과 같은 &amp;lsquo;이산적인 점들의 집합&amp;rsquo;이 형성됩니다.&lt;/p>
&lt;h2 id="22-기하학적-이미지">2.2 기하학적 이미지
&lt;/h2>&lt;p>2차원 평면 $\mathbb{R}^2$의 예로 생각해 봅시다. 기저 벡터로서 $\mathbf{b}_1 = \begin{pmatrix} 1 \\ 0 \end{pmatrix}$와 $\mathbf{b}_2 = \begin{pmatrix} 0 \\ 1 \end{pmatrix}$을 선택한 경우, 이들에 의해 생성되는 격자는 좌표평면 상의 모든 정수 좌표 $(x, y) \in \mathbb{Z}^2$의 집합이 됩니다. 이는 가장 단순한 &amp;lsquo;정방격자&amp;rsquo;입니다.&lt;/p>
&lt;p>그러나 격자가 항상 직교하는 것은 아닙니다. 예를 들어, $\mathbf{b}_1 = \begin{pmatrix} 2 \\ 1 \end{pmatrix}$과 $\mathbf{b}_2 = \begin{pmatrix} 1 \\ 3 \end{pmatrix}$이라는 기저를 생각해보면, 생성되는 점은 비스듬하게 왜곡된 그물망의 교차점처럼 됩니다.&lt;/p>
&lt;h2 id="23-기저의-비유일성과-유니모듈러-변환">2.3 기저의 비유일성과 유니모듈러 변환
&lt;/h2>&lt;p>격자 암호의 안전성 근간과 관련된 중요한 성질이 있습니다. 그것은 &amp;lsquo;동일한 격자를 생성하는 기저는 무수히 존재한다&amp;rsquo;는 것입니다.&lt;/p>
&lt;p>예를 들어, 앞서 설명한 $\mathbf{b}_1 = (1, 0)^T, \mathbf{b}_2 = (0, 1)^T$라는 기저가 생성하는 $\mathbb{Z}^2$ 격자는 $\mathbf{b}'_1 = (1, 1)^T, \mathbf{b}'_2 = (2, 3)^T$라는 기저를 사용해도 완전히 같은 격자 $\mathbb{Z}^2$를 생성합니다.&lt;/p>
&lt;p>어떤 기저 $B$와 다른 기저 $B'$가 같은 격자를 생성하기 위한 필요충분조건은, 정수 성분을 가진 행렬 $U \in \mathbb{Z}^{n \times n}$이면서 행렬식이 $\det(U) = \pm 1$이 되는 것이 존재하여,
&lt;/p>
$$ B' = B U $$
&lt;p>
로 표현될 수 있다는 것입니다. 이러한 행렬 $U$를 &amp;lsquo;유니모듈러 행렬(Unimodular matrix)&amp;lsquo;이라고 부릅니다.&lt;/p>
&lt;p>암호에 응용할 때의 기본적인 아이디어는 &amp;lsquo;좋은 기저(직교에 가깝고 짧은 벡터로 이루어진 기저)&amp;lsquo;를 비밀키로 하고, &amp;lsquo;나쁜 기저(서로 극단적으로 비스듬하게 교차하며 매우 긴 벡터로 이루어진 기저)&amp;lsquo;를 공개키로 사용하는 것입니다. 나쁜 기저로부터 좋은 기저를 계산해내는 것은 차원이 높아질수록 매우 어려워집니다. 이것이 격자 암호의 기본적인 직관입니다.&lt;/p>
&lt;h1 id="3-격자에서의-계산이-어려운-문제">3. 격자에서의 계산이 어려운 문제
&lt;/h1>&lt;p>격자 암호의 안전성은 격자 상의 특정한 수학적 문제를 푸는 것의 어려움에 의존하고 있습니다. 여기서는 가장 기본적이면서 유명한 두 가지 문제를 소개합니다.&lt;/p>
&lt;h2 id="31-최단-벡터-문제shortest-vector-problem-svp">3.1 최단 벡터 문제(Shortest Vector Problem: SVP)
&lt;/h2>&lt;p>SVP는 격자 이론에서 가장 고전적이고 유명한 문제입니다.&lt;/p>
&lt;p>&lt;strong>정의 (SVP):&lt;/strong>
임의의 격자 기저 $B$가 주어졌을 때, 그 격자 $\mathcal{L}(B)$에 속하는 영(zero)이 아닌 벡터 중에서 유클리드 노름(길이)이 최소가 되는 벡터 $\mathbf{v}$를 찾아라.&lt;/p>
&lt;p>수식으로 표현하면, $\min_{\mathbf{v} \in \mathcal{L}(B) \setminus \{\mathbf{0}\}} \| \mathbf{v} \|$가 되는 $\mathbf{v}$를 구하는 문제입니다. 이 최소 길이를 $\lambda_1(\mathcal{L})$로 쓰고, &amp;lsquo;격자의 제1연속 최소값(First successive minimum)&amp;lsquo;이라고 부릅니다.&lt;/p>
&lt;p>2차원이나 3차원처럼 낮은 차원이라면, 그림을 그려서 눈으로 가장 짧은 벡터를 찾을 수 있습니다. 또는 가우스의 격자 축소 알고리즘(Gauss lattice reduction algorithm) 등을 사용하여 효율적으로 풀 수 있습니다. 그러나 차원 $n$이 수백에서 수천과 같은 고차원이 되면, SVP를 엄밀하게 푸는 것은 NP-hard임이 알려져 있습니다.&lt;/p>
&lt;p>실제 암호에서는 엄밀한 최단 벡터가 아니라, &amp;lsquo;근사적으로 짧은 벡터&amp;rsquo;를 찾는 근사 SVP($\gamma$-SVP)가 사용됩니다. 근사 계수 $\gamma$가 다항식 크기일 경우, 이 문제는 여전히 매우 어려운 것으로 간주됩니다.&lt;/p>
&lt;h2 id="32-최근접-벡터-문제closest-vector-problem-cvp">3.2 최근접 벡터 문제(Closest Vector Problem: CVP)
&lt;/h2>&lt;p>CVP 또한 격자 암호에 있어서 매우 중요한 문제입니다.&lt;/p>
&lt;p>&lt;strong>정의 (CVP):&lt;/strong>
임의의 격자 기저 $B$와, 공간 내의 임의의 타겟 벡터 $\mathbf{t} \in \mathbb{R}^m$ (반드시 격자점일 필요는 없음)이 주어졌을 때, 격자점 중에서 $\mathbf{t}$에 가장 가까운 격자점 $\mathbf{v} \in \mathcal{L}(B)$를 찾아라.&lt;/p>
&lt;p>수식으로 표현하면, $\min_{\mathbf{v} \in \mathcal{L}(B)} \| \mathbf{v} - \mathbf{t} \|$가 되는 격자점 $\mathbf{v}$를 찾는 문제입니다.&lt;/p>
&lt;p>CVP 역시 SVP와 마찬가지로 고차원에서는 NP-hard입니다. 암호에의 응용이라는 관점에서, 후술할 LWE 문제는 이 CVP의 특수한 변형(Bounded Distance Decoding: BDD)과 밀접한 관계가 있습니다.&lt;/p>
&lt;h2 id="33-왜-고차원이-되면-풀-수-없는가-lll과-bkz의-한계">3.3 왜 고차원이 되면 풀 수 없는가? (LLL과 BKZ의 한계)
&lt;/h2>&lt;p>고차원의 격자 문제를 풀기 위한 유명한 알고리즘으로 LLL 알고리즘(Lenstra-Lenstra-Lovász algorithm)이 있습니다. LLL 알고리즘은 다항식 시간에 동작하며, 격자 기저를 어느 정도 &amp;lsquo;좋은 기저&amp;rsquo;로 축소(Reduction)할 수 있습니다. 그러나 LLL 알고리즘이 찾을 수 있는 최단 벡터는 진정한 최단 벡터의 길이에 대해 지수 함수적인($2^{\mathcal{O}(n)}$) 근사 계수를 가지기 때문에, 암호의 안전성을 깨뜨리기에는 역부족입니다.&lt;/p>
&lt;p>LLL을 개량한 BKZ(Block Korkine-Zolotarev) 알고리즘과 같은 더 강력한 기저 축소 알고리즘을 사용하면 더 짧은 벡터를 찾을 수 있지만, 그 계산량은 블록 크기에 대해 지수 함수적으로 증가합니다. 격자 암호에서는 이 BKZ 알고리즘의 실행 시간을 추정함으로써 안전한 파라미터(차원 $n$의 크기 등)를 결정하고 있습니다. 현재 PQC의 표준 파라미터에서는 차원 $n$이 500에서 1000 이상의 값으로 선택되고 있으며, 슈퍼컴퓨터나 미래의 양자 컴퓨터를 사용하더라도 해독하는 데에는 우주의 나이 이상의 시간이 걸릴 것으로 여겨집니다.&lt;/p>
&lt;h1 id="4-lwe-문제learning-with-errors의-수학적-정식화">4. LWE 문제(Learning With Errors)의 수학적 정식화
&lt;/h1>&lt;p>현대 격자 암호의 대부분은 2005년 오데드 레게브(Oded Regev)가 제안한 &amp;lsquo;LWE 문제(Learning With Errors)&amp;lsquo;를 기반으로 하고 있습니다. LWE 문제의 아름다움은 그 정식화의 단순함과 &amp;lsquo;최악의 경우 복잡도에서 평균적인 경우 복잡도로의 환원&amp;rsquo;이라는 강력한 수학적 증명을 가지고 있다는 점에 있습니다.&lt;/p>
&lt;h2 id="41-노이즈가-없는-연립-일차-방정식">4.1 노이즈가 없는 연립 일차 방정식
&lt;/h2>&lt;p>LWE 문제를 이해하기 위해, 우선 노이즈가 없는 단순한 연립 일차 방정식을 생각해 봅시다.
미지의 비밀 벡터 $\mathbf{s} \in \mathbb{Z}_q^n$ (각 성분은 $0$부터 $q-1$까지의 정수)가 있다고 가정합니다. 여기서 $q$는 소수라고 합니다.&lt;/p>
&lt;p>랜덤한 계수 벡터 $\mathbf{a}_1, \mathbf{a}_2, \dots \in \mathbb{Z}_q^n$을 선택하고, 비밀 벡터 $\mathbf{s}$와의 내적을 법 $q$로 계산합니다.
$b_1 = \langle \mathbf{a}_1, \mathbf{s} \rangle \pmod q$
$b_2 = \langle \mathbf{a}_2, \mathbf{s} \rangle \pmod q$
$\vdots$&lt;/p>
&lt;p>충분한 수($n$개 이상)의 $(\mathbf{a}_i, b_i)$ 쌍이 주어질 경우, 우리는 선형대수의 &amp;lsquo;가우스 소거법(Gaussian elimination)&amp;lsquo;을 사용하여 쉽게 비밀 벡터 $\mathbf{s}$를 복원할 수 있습니다. 이는 다항식 시간 내에 간단히 풀 수 있는 문제입니다.&lt;/p>
&lt;h2 id="42-lwe-문제의-정의-노이즈를-더하다">4.2 LWE 문제의 정의: 노이즈를 더하다
&lt;/h2>&lt;p>그렇다면, 이 문제에 약간의 &amp;lsquo;노이즈(오차)&amp;lsquo;를 더하면 어떻게 될까요?
이것이 LWE 문제의 본질입니다.&lt;/p>
&lt;p>미지의 비밀 벡터 $\mathbf{s} \in \mathbb{Z}_q^n$에 대하여, 각 방정식의 결과에 작은 오차 $e_i \in \mathbb{Z}_q$를 더합니다.
$b_i = \langle \mathbf{a}_i, \mathbf{s} \rangle + e_i \pmod q$&lt;/p>
&lt;p>여기서 $e_i$는 평균이 0이고 표준편차가 비교적 작은(예를 들어 정규분포와 같은, 이산 가우스 분포에서 선택된) 작은 정수값입니다.
주어지는 정보는 랜덤한 벡터 $\mathbf{a}_i$와, 거기에 오차를 더해 계산된 $b_i$ 쌍의 리스트입니다.
$( \mathbf{a}_1, b_1 ), ( \mathbf{a}_2, b_2 ), \dots, ( \mathbf{a}_m, b_m )$&lt;/p>
&lt;p>이를 행렬로 표현하면 매우 깔끔해집니다.
랜덤한 행렬 $A \in \mathbb{Z}_q^{m \times n}$, 비밀 벡터 $\mathbf{s} \in \mathbb{Z}_q^n$, 오차 벡터 $\mathbf{e} \in \mathbb{Z}_q^m$을 사용하여,
&lt;/p>
$$ \mathbf{b} = A \mathbf{s} + \mathbf{e} \pmod q $$
&lt;p>
라고 쓸 수 있습니다. 주어지는 것은 $A$와 $\mathbf{b}$뿐입니다. 여기서 $\mathbf{s}$를 구하는 것이 &amp;lsquo;탐색 LWE 문제(Search LWE problem)&amp;lsquo;입니다.&lt;/p>
&lt;p>오차 $e_i$가 들어있기 때문에, 가우스 소거법을 사용하려고 하면 방정식을 더하고 빼는 과정에서 오차가 지수 함수적으로 증폭되어 올바른 답에 도달할 수 없게 됩니다. 얼핏 보면 단순한 연립 일차 방정식처럼 보이지만, 이 작은 노이즈가 더해지는 것만으로 문제의 난이도가 NP-hard 수준으로 뛰어오르게 됩니다.&lt;/p>
&lt;h2 id="43-결정-lwe-문제decision-lwe">4.3 결정 LWE 문제(Decision LWE)
&lt;/h2>&lt;p>암호 이론의 증명에서 빈번하게 사용되는 것은 탐색 LWE 문제의 변형인 &amp;lsquo;결정 LWE 문제(Decision LWE problem)&amp;lsquo;입니다.&lt;/p>
&lt;p>결정 LWE 문제란, 다음의 2가지 분포에서 얻은 샘플의 리스트가 주어졌을 때, 그것이 어느 분포에서 온 것인지를 판정하는 문제입니다.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>LWE 분포&lt;/strong>: 의도적으로 계산된 $(A, \mathbf{b} = A\mathbf{s} + \mathbf{e} \pmod q)$&lt;/li>
&lt;li>&lt;strong>균등 랜덤 분포&lt;/strong>: 완전히 랜덤하게 선택된 행렬 $A$와 벡터 $\mathbf{u}$로 이루어진 $(A, \mathbf{u})$&lt;/li>
&lt;/ol>
&lt;p>놀랍게도, LWE 문제의 파라미터를 적절히 선택하면, LWE 분포에서 얻은 쌍은 완전히 랜덤한 데이터 쌍과 &amp;lsquo;계산량적으로 식별 불가능(Computationally Indistinguishable)&amp;lsquo;해집니다. 이 성질이 LWE 기반 암호가 &amp;lsquo;난수와 구별할 수 없는 암호문&amp;rsquo;을 생성할 수 있는 근거가 됩니다.&lt;/p>
&lt;h2 id="44-최악의-경우-복잡도에서-평균적인-경우-복잡도로의-환원레게브의-정리">4.4 최악의 경우 복잡도에서 평균적인 경우 복잡도로의 환원(레게브의 정리)
&lt;/h2>&lt;p>오데드 레게브의 가장 큰 공적은 이 LWE 문제의 어려움을 앞서 언급한 격자 문제(SVP나 CVP)의 어려움에 수학적으로 연결시킨 것입니다.&lt;/p>
&lt;p>그는 양자 환원(Quantum reduction)을 사용하여, &amp;lsquo;만약 LWE 문제를 평균적으로(랜덤하게 선택된 $A$와 $\mathbf{e}$에 대해) 풀 수 있는 다항식 시간 알고리즘이 존재한다면, 임의의 격자의 최악의 경우(가장 어려운 경우)의 Gap-SVP를 풀 수 있는 다항식 시간의 양자 알고리즘이 존재한다&amp;rsquo;는 것을 증명했습니다. (나중에 페이커트(Peikert) 등에 의해 고전적인 환원도 증명되었습니다.)&lt;/p>
&lt;p>이는 암호 이론에 있어 꿈과 같은 성질입니다. 왜냐하면, &amp;lsquo;암호가 깨지는 것은 우리가 우연히 약한 키(평균적인 경우의 일부)를 선택해 버렸기 때문일지도 모른다&amp;rsquo;는 우려를 불식시키고, &amp;lsquo;평균적인 LWE를 풀 수 있다면, 격자의 모든 어려운 문제를 풀 수 있게 된다(그러므로 LWE는 절대적으로 어렵다)&amp;lsquo;는 강력한 보증을 해주기 때문입니다.&lt;/p>
&lt;div class="mermaid">graph TD
A["최악의 경우 격자 문제 (Gap-SVP, SIVP)"] -->|양자/고전적 환원| B["평균적인 경우 LWE 문제"]
B -->|암호학적 구성| C["LWE 기반 암호 시스템 (PKE, KEM, FHE)"]
style A fill:#ffcccc,stroke:#ff0000,stroke-width:2px,color:#000
style B fill:#ccffcc,stroke:#00aa00,stroke-width:2px,color:#000
style C fill:#ccccff,stroke:#0000ff,stroke-width:2px,color:#000&lt;/div>
&lt;h1 id="5-lwe를-이용한-공개키-암호-방식레게브-암호의-구성">5. LWE를 이용한 공개키 암호 방식(레게브 암호)의 구성
&lt;/h1>&lt;p>LWE 문제의 어려움을 이해했으니, 그것을 사용하여 어떻게 암호화와 복호화를 수행하는지, 오데드 레게브가 제안한 기본적인 공개키 암호 방식을 살펴봅시다. 여기서는 1비트의 메시지 $M \in \{0, 1\}$를 암호화하는 가장 기본적인 메커니즘을 설명합니다.&lt;/p>
&lt;h2 id="51-키-생성key-generation">5.1 키 생성(Key Generation)
&lt;/h2>&lt;ol>
&lt;li>시스템 파라미터로서 법이 되는 소수 $q$, 차원 $n$, 방정식의 수 $m$($m > n \log q$)을 결정합니다.&lt;/li>
&lt;li>비밀키로서 벡터 $\mathbf{s} \in \mathbb{Z}_q^n$를 랜덤하게 선택합니다.&lt;/li>
&lt;li>랜덤한 행렬 $A \in \mathbb{Z}_q^{m \times n}$을 생성합니다.&lt;/li>
&lt;li>작은 오차 벡터 $\mathbf{e} \in \mathbb{Z}_q^m$를 이산 가우스 분포 등의 오차 분포에서 선택합니다.&lt;/li>
&lt;li>벡터 $\mathbf{b} = A \mathbf{s} + \mathbf{e} \pmod q$를 계산합니다.&lt;/li>
&lt;li>공개키(Public Key)는 $(A, \mathbf{b})$가 됩니다.&lt;/li>
&lt;li>비밀키(Secret Key)는 $\mathbf{s}$가 됩니다.&lt;/li>
&lt;/ol>
&lt;p>공개키는 그야말로 &amp;lsquo;LWE 문제의 인스턴스&amp;rsquo; 그 자체입니다. 공개키 $(A, \mathbf{b})$로부터 비밀키 $\mathbf{s}$를 구하는 것은 탐색 LWE 문제를 푸는 것과 같기 때문에 안전성이 보장됩니다.&lt;/p>
&lt;h2 id="52-암호화encryption">5.2 암호화(Encryption)
&lt;/h2>&lt;p>앨리스는 밥의 공개키 $(A, \mathbf{b})$를 사용하여, 1비트의 메시지 $M \in \{0, 1\}$를 암호화합니다.&lt;/p>
&lt;ol>
&lt;li>랜덤한 이진 벡터(성분이 0 또는 1) $\mathbf{r} \in \{0, 1\}^m$를 선택합니다.&lt;/li>
&lt;li>암호문의 전반부로서 벡터 $\mathbf{u} = A^T \mathbf{r} \pmod q$를 계산합니다. ($A^T$는 $A$의 전치 행렬입니다. 즉, $A$의 행 중에서 $\mathbf{r}$의 성분이 1인 행들을 더하는 것입니다).&lt;/li>
&lt;li>암호문의 후반부로서 스칼라 $v = \mathbf{b}^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor \pmod q$를 계산합니다.
(메시지 $M$이 0이면 아무것도 더하지 않고, $1$이면 $q$의 정확히 절반 값인 $\lfloor \frac{q}{2} \rfloor$를 더합니다).&lt;/li>
&lt;li>암호문(Ciphertext)은 $(\mathbf{u}, v)$가 됩니다.&lt;/li>
&lt;/ol>
&lt;p>암호화의 직관적인 의미는 공개키의 행렬 $A$와 벡터 $\mathbf{b}$에 대하여 &amp;lsquo;랜덤한 부분 집합의 합&amp;rsquo;을 취하는 것입니다. 결정 LWE 문제의 어려움에 의해 이 암호문 $(\mathbf{u}, v)$는 완전히 랜덤한 벡터 및 균등 난수와 구별이 불가능한 것처럼 보입니다(의미론적 안전성: Semantic Security).&lt;/p>
&lt;div class="mermaid">flowchart LR
M["메시지 M in {0,1}"] --> Enc
PK["공개키 (A, b)"] --> Enc
r["랜덤 이진 벡터 r"] --> Enc
subgraph Enc ["암호화 과정"]
direction TB
u_calc["u = A^T * r mod q"]
v_calc["v = b^T * r + M * floor(q/2) mod q"]
end
Enc --> CT["암호문 (u, v)"]&lt;/div>
&lt;h2 id="53-복호화decryption">5.3 복호화(Decryption)
&lt;/h2>&lt;p>밥은 비밀키 $\mathbf{s}$를 사용하여 암호문 $(\mathbf{u}, v)$를 복호화합니다.&lt;/p>
&lt;ol>
&lt;li>다음 값을 계산합니다: $D = v - \mathbf{s}^T \mathbf{u} \pmod q$&lt;/li>
&lt;li>계산한 결과가 $0$에 가까우면 $M=0$, $\lfloor \frac{q}{2} \rfloor$에 가까우면 $M=1$로 출력합니다.&lt;/li>
&lt;/ol>
&lt;p>왜 이렇게 복호화할 수 있는지 수학적으로 전개해 봅시다.
$\mathbf{b} = A \mathbf{s} + \mathbf{e}$ 였음을 상기해 주십시오.&lt;/p>
$$
\begin{aligned}
v - \mathbf{s}^T \mathbf{u} &amp;= (\mathbf{b}^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor) - \mathbf{s}^T (A^T \mathbf{r}) \\
&amp;= ((A \mathbf{s} + \mathbf{e})^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor) - \mathbf{s}^T A^T \mathbf{r} \\
&amp;= (\mathbf{s}^T A^T \mathbf{r} + \mathbf{e}^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor) - \mathbf{s}^T A^T \mathbf{r} \\
&amp;= \mathbf{e}^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor \pmod q
\end{aligned}
$$
&lt;p>여기서, 식 안에서 $\mathbf{s}^T A^T \mathbf{r}$가 깔끔하게 상쇄되어 사라졌습니다!
남은 것은 $\mathbf{e}^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor$ 입니다.&lt;/p>
&lt;p>$\mathbf{e}$는 성분이 매우 작은 노이즈 벡터이고, $\mathbf{r}$는 성분이 0 또는 1인 이진 벡터입니다. 따라서 이들의 내적인 $\mathbf{e}^T \mathbf{r}$도 (파라미터를 적절히 선택하면) 비교적 작은 값에 머물게 됩니다.&lt;/p>
&lt;ul>
&lt;li>만약 $M=0$이라면 결과는 $\mathbf{e}^T \mathbf{r}$가 되어 $0$에 가까운 작은 값이 됩니다.&lt;/li>
&lt;li>만약 $M=1$이라면 결과는 $\mathbf{e}^T \mathbf{r} + \lfloor \frac{q}{2} \rfloor$가 되어 $q$의 절반 값인 $\lfloor \frac{q}{2} \rfloor$의 주변에 위치하게 됩니다.&lt;/li>
&lt;/ul>
&lt;p>오차 $\mathbf{e}^T \mathbf{r}$의 절댓값이 $\frac{q}{4}$ 미만으로 수렴하도록 파라미터가 설계되어 있다면, 밥은 계산 결과가 $0$과 $\lfloor \frac{q}{2} \rfloor$ 중 어느 쪽에 더 가까운지를 보는 것만으로 메시지 $M$을 정확하게 판정(복호화)할 수 있습니다. 이것이 LWE 기반 암호가 기능하는 아름다운 메커니즘입니다.&lt;/p>
&lt;div class="mermaid">flowchart LR
CT["암호문 (u, v)"] --> Dec
SK["비밀키 s"] --> Dec
subgraph Dec ["복호화 과정"]
direction TB
calc["D = v - s^T * u mod q 계산"]
check["D가 0 또는 q/2 중 어디에 가까운지 확인"]
end
calc --> check
Dec --> M_out["복원된 메시지 M"]&lt;/div>
&lt;h1 id="6-구체적인-수치를-이용한-lwe-암호의-토이-이그잼플">6. 구체적인 수치를 이용한 LWE 암호의 토이 이그잼플
&lt;/h1>&lt;p>수식의 나열만으로는 실감하기 어려울 것이라 생각하므로, 실제로 매우 작은 수치 파라미터를 설정하여 암호화부터 복호화까지의 계산을 따라가 보겠습니다.
(※실제 암호 시스템에서는 안전성 확보를 위해 $n$은 500 이상, $q$는 수천 이상의 값이 사용됩니다)&lt;/p>
&lt;p>&lt;strong>【파라미터 설정】&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>법 $q = 17$ (소수. 따라서 값은 $0$부터 $16$까지의 범위를 갖습니다)&lt;/li>
&lt;li>차원 $n = 2$&lt;/li>
&lt;li>방정식의 수 $m = 4$&lt;/li>
&lt;li>메시지 $M = 1$을 암호화한다고 가정합니다.&lt;/li>
&lt;li>메시지의 시프트 양: $\lfloor \frac{q}{2} \rfloor = \lfloor \frac{17}{2} \rfloor = 8$&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>【1. 키 생성 단계】&lt;/strong>
밥은 비밀키 $\mathbf{s}$와 행렬 $A$, 오차 벡터 $\mathbf{e}$를 랜덤하게 선택합니다.
&lt;/p>
$$ \mathbf{s} = \begin{pmatrix} 3 \\ 4 \end{pmatrix} \in \mathbb{Z}_{17}^2 $$
$$ A = \begin{pmatrix} 2 &amp; 15 \\ 1 &amp; 8 \\ 14 &amp; 5 \\ 9 &amp; 10 \end{pmatrix} \in \mathbb{Z}_{17}^{4 \times 2} $$
$$ \mathbf{e} = \begin{pmatrix} 1 \\ -1 \\ 0 \\ 2 \end{pmatrix} \equiv \begin{pmatrix} 1 \\ 16 \\ 0 \\ 2 \end{pmatrix} \pmod{17} $$
&lt;p>다음으로 공개키 $\mathbf{b}$를 계산합니다.
&lt;/p>
$$ A \mathbf{s} = \begin{pmatrix} 2 &amp; 15 \\ 1 &amp; 8 \\ 14 &amp; 5 \\ 9 &amp; 10 \end{pmatrix} \begin{pmatrix} 3 \\ 4 \end{pmatrix} = \begin{pmatrix} 2\times 3 + 15\times 4 \\ 1\times 3 + 8\times 4 \\ 14\times 3 + 5\times 4 \\ 9\times 3 + 10\times 4 \end{pmatrix} = \begin{pmatrix} 6 + 60 \\ 3 + 32 \\ 42 + 20 \\ 27 + 40 \end{pmatrix} = \begin{pmatrix} 66 \\ 35 \\ 62 \\ 67 \end{pmatrix} $$
&lt;p>
이를 법 17로 계산합니다. ($66 = 17 \times 3 + 15$ 등)
&lt;/p>
$$ A \mathbf{s} \pmod{17} = \begin{pmatrix} 15 \\ 1 \\ 11 \\ 16 \end{pmatrix} $$
&lt;p>
오차 벡터 $\mathbf{e}$를 더합니다.
&lt;/p>
$$ \mathbf{b} = A \mathbf{s} + \mathbf{e} = \begin{pmatrix} 15 \\ 1 \\ 11 \\ 16 \end{pmatrix} + \begin{pmatrix} 1 \\ 16 \\ 0 \\ 2 \end{pmatrix} = \begin{pmatrix} 16 \\ 17 \\ 11 \\ 18 \end{pmatrix} \equiv \begin{pmatrix} 16 \\ 0 \\ 11 \\ 1 \end{pmatrix} \pmod{17} $$
&lt;p>공개키는 $A$와 $\mathbf{b} = (16, 0, 11, 1)^T$가 됩니다.&lt;/p>
&lt;p>&lt;strong>【2. 암호화 단계】&lt;/strong>
앨리스는 메시지 $M = 1$을 암호화합니다.
랜덤한 벡터 $\mathbf{r}$를 선택합니다. 여기서는 $\mathbf{r} = (1, 0, 1, 0)^T$로 합니다.&lt;/p>
&lt;p>$\mathbf{u}$를 계산합니다.
&lt;/p>
$$ \mathbf{u} = A^T \mathbf{r} = \begin{pmatrix} 2 &amp; 1 &amp; 14 &amp; 9 \\ 15 &amp; 8 &amp; 5 &amp; 10 \end{pmatrix} \begin{pmatrix} 1 \\ 0 \\ 1 \\ 0 \end{pmatrix} = \begin{pmatrix} 2 \times 1 + 14 \times 1 \\ 15 \times 1 + 5 \times 1 \end{pmatrix} = \begin{pmatrix} 16 \\ 20 \end{pmatrix} \equiv \begin{pmatrix} 16 \\ 3 \end{pmatrix} \pmod{17} $$
&lt;p>$v$를 계산합니다.
&lt;/p>
$$ \mathbf{b}^T \mathbf{r} = (16, 0, 11, 1) \begin{pmatrix} 1 \\ 0 \\ 1 \\ 0 \end{pmatrix} = 16 \times 1 + 11 \times 1 = 27 \equiv 10 \pmod{17} $$
&lt;p>
메시지 $M=1$에 해당하는 값 $\lfloor 17/2 \rfloor = 8$을 더합니다.
&lt;/p>
$$ v = \mathbf{b}^T \mathbf{r} + M \cdot 8 = 10 + 1 \times 8 = 18 \equiv 1 \pmod{17} $$
&lt;p>앨리스는 암호문으로 $(\mathbf{u}, v) = \left( \begin{pmatrix} 16 \\ 3 \end{pmatrix}, 1 \right)$을 밥에게 전송합니다.&lt;/p>
&lt;p>&lt;strong>【3. 복호화 단계】&lt;/strong>
암호문을 받은 밥은 비밀키 $\mathbf{s} = (3, 4)^T$를 사용하여 복호화합니다.
복호화 처리식: $D = v - \mathbf{s}^T \mathbf{u} \pmod{17}$을 계산합니다.&lt;/p>
$$ \mathbf{s}^T \mathbf{u} = (3, 4) \begin{pmatrix} 16 \\ 3 \end{pmatrix} = 3 \times 16 + 4 \times 3 = 48 + 12 = 60 \equiv 9 \pmod{17} $$
$$ D = v - \mathbf{s}^T \mathbf{u} = 1 - 9 = -8 \pmod{17} $$
&lt;p>여기서 법 17의 세계에서는 $-8$이 $9$와 같아집니다($-8 + 17 = 9$).
얻어진 값 $D = 9$를 $0$과 $8$($\lfloor 17/2 \rfloor$) 중 어디에 가까운지 판정합니다.
$9$는 $0$보다 $8$에 명백히 더 가깝기 때문에 밥은 올바르게 $M = 1$을 복원할 수 있었습니다!&lt;/p>
&lt;p>왜 $9$가 되었을까요? 앞서 설명한 증명을 상기해 봅시다.
오차 부분은 $\mathbf{e}^T \mathbf{r} = (1, -1, 0, 2) (1, 0, 1, 0)^T = 1 \times 1 + 0 \times 1 = 1$로 되어 있습니다.
따라서 계산 결과는 $\mathbf{e}^T \mathbf{r} + M \cdot 8 = 1 + 8 = 9$가 되어, 이론대로의 값이 계산되었음을 확인할 수 있었습니다.&lt;/p>
&lt;h1 id="7-실용화를-향한-진화-ring-lwe와-module-lwe">7. 실용화를 향한 진화: Ring-LWE와 Module-LWE
&lt;/h1>&lt;p>지금까지 설명한 표준적인 LWE 문제(Standard LWE)는 매우 강력한 안전성 증명을 가지고 있지만, 실용상 치명적인 약점이 있습니다. 그것은 &amp;lsquo;키의 크기가 거대해진다는 것&amp;rsquo;과 &amp;lsquo;계산 비용이 높다는 것&amp;rsquo;입니다.&lt;/p>
&lt;p>Standard LWE에서는 공개키에 거대한 행렬 $A \in \mathbb{Z}_q^{m \times n}$이 포함됩니다. 파라미터 $n$이 수백에서 수천이 되면 이 행렬의 크기는 수 메가바이트에 달해, 인터넷 상의 통신 프로토콜(TLS 등)에서 매번 송수신하기에는 너무 무겁습니다. 또한 행렬과 벡터의 곱셈에는 $\mathcal{O}(n^2)$의 계산량이 듭니다.&lt;/p>
&lt;p>이 문제를 해결하기 위해 도입된 것이 다항식 환(Polynomial rings)이라는 대수적인 구조를 격자에 결합한 &amp;lsquo;Ring-LWE(RLWE)&amp;lsquo;나 &amp;lsquo;Module-LWE(MLWE)&amp;lsquo;입니다.&lt;/p>
&lt;h2 id="71-ring-lwe의-직관">7.1 Ring-LWE의 직관
&lt;/h2>&lt;p>Ring-LWE에서는 벡터나 행렬을 다항식 환 $\mathcal{R}_q = \mathbb{Z}_q[X]/(X^n + 1)$ 상의 요소(다항식)로 대체합니다. (여기서 $n$은 2의 거듭제곱으로 선택됩니다).&lt;/p>
&lt;p>Standard LWE의 공개키가 행렬 $A$였던 것에 반해, Ring-LWE에서는 단일 다항식 $a(x)$를 사용합니다. 비밀키 $s(x)$나 오차 $e(x)$도 다항식이 됩니다.
방정식은 다음과 같이 됩니다.
&lt;/p>
$$ b(x) = a(x) \cdot s(x) + e(x) \pmod q $$
&lt;p>이는 다항식의 곱셈이므로 고속 푸리에 변환(FFT)과 유사한 &amp;lsquo;수론 변환(Number Theoretic Transform: NTT)&amp;lsquo;을 사용함으로써 계산량을 $\mathcal{O}(n \log n)$까지 극적으로 줄일 수 있습니다. 게다가 공개키의 크기도 행렬에서 단일 다항식으로 작아지기 때문에 데이터 크기가 $\mathcal{O}(n)$으로 감소합니다. 이는 통신 대역폭에 있어서 압도적인 우위를 가져옵니다.&lt;/p>
&lt;p>수학적으로 보면, Ring-LWE는 일반적인 격자가 아니라 &amp;lsquo;아이디얼 격자(Ideal Lattice)&amp;lsquo;라고 불리는 특수한 대칭성을 가진 격자 상의 문제로 귀결됩니다.&lt;/p>
&lt;h2 id="72-module-lwe와-nist의-표준화-kyber--ml-kem">7.2 Module-LWE와 NIST의 표준화 (Kyber / ML-KEM)
&lt;/h2>&lt;p>Ring-LWE는 효율적이지만, 아이디얼 격자의 특수한 대수적 구조가 장래의 공격 실마리가 되지 않을까 하는 일말의 우려가 있었습니다. 그래서 Standard LWE의 보수적인 안전성과 Ring-LWE의 효율성의 &amp;lsquo;장점만을 취한&amp;rsquo; 것이 &amp;lsquo;Module-LWE(MLWE)&amp;lsquo;입니다.&lt;/p>
&lt;p>Module-LWE에서는 다항식을 요소로 하는 작은 행렬과 벡터를 생각합니다. 즉, 환 상의 모듈(가군)을 다룹니다.
현재 NIST가 PQC의 키 캡슐화 메커니즘(KEM) 표준으로 선정한 &amp;lsquo;CRYSTALS-Kyber&amp;rsquo;(표준화 명칭: ML-KEM)는 바로 이 Module-LWE 문제의 어려움에 기반하여 구축되어 있습니다.&lt;/p>
&lt;h1 id="8-왜-양자-컴퓨터에-대해-안전한가">8. 왜 양자 컴퓨터에 대해 안전한가?
&lt;/h1>&lt;p>마지막으로, &amp;lsquo;왜 격자 암호는 양자 컴퓨터를 사용해도 해독되지 않는다고 여겨지는가?&amp;lsquo;라는 핵심 부분을 짚고 넘어가겠습니다.&lt;/p>
&lt;p>양자 컴퓨터가 RSA 암호나 타원곡선암호를 깨는 쇼어 알고리즘은 본질적으로 &amp;lsquo;은닉 부분군 문제(Hidden Subgroup Problem: HSP)&amp;lsquo;를 푸는 알고리즘입니다. RSA나 ECC의 배경에 있는 수학적 구조(유한 아벨 군)는 주기성을 가지고 있으며, 양자 푸리에 변환(QFT)이라는 양자 알고리즘 특유의 조작을 사용함으로써 이 주기(숨겨진 부분군)를 단번에 추출할 수 있습니다.&lt;/p>
&lt;p>그러나 격자 문제는 근본적으로 다릅니다. 격자에도 주기성은 있지만, SVP나 CVP에서 요구되는 것은 &amp;lsquo;최단 거리&amp;rsquo;나 &amp;lsquo;노이즈 제거&amp;rsquo;라는 기하학적이고 비선형적인 성질입니다. 쇼어 알고리즘과 같은 &amp;lsquo;아벨 군 상의 양자 푸리에 변환&amp;rsquo;을 그대로 적용하더라도 격자 문제의 해답이 되는 유용한 정보를 효율적으로 추출할 수 없습니다. 현재까지 SVP나 LWE에 대해 다항식 시간에 풀 수 있는 양자 알고리즘은 발견되지 않았으며, 양자 컴퓨터의 병렬 계산 능력을 동원하더라도 무차별 대입에 가까운 탐색(그로버 알고리즘에 의한 제곱근 수준의 고속화 정도)만이 유효한 수단이라고 널리 믿어지고 있습니다.&lt;/p>
&lt;h1 id="9-요약">9. 요약
&lt;/h1>&lt;p>본 기사에서는 격자 암호의 수학적 직관에 대해 격자의 기하학적 정의부터 시작하여 LWE 문제의 정식화, 그리고 공개키 암호의 구성에 이르기까지 상세히 해설했습니다.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>격자(Lattice)&lt;/strong> 는 기저 벡터의 정수 계수 선형 결합으로 표현되는 이산적인 공간이며, 고차원에서는 직교에 가까운 &amp;lsquo;좋은 기저&amp;rsquo;를 찾는 것(SVP)이 어려워집니다.&lt;/li>
&lt;li>&lt;strong>LWE 문제(Learning With Errors)&lt;/strong> 는 노이즈가 포함된 연립 일차 방정식을 푸는 문제이며, 이것이 격자의 최악의 경우 문제의 어려움에 연결되어 있기 때문에 강력한 안전성의 근거를 제공합니다.&lt;/li>
&lt;li>LWE 문제를 이용함으로써 노이즈를 의도적으로 더하거나 소거하는 교묘한 메커니즘을 통해 암호화 및 복호화(&lt;strong>레게브 암호&lt;/strong>)가 실현됩니다.&lt;/li>
&lt;li>실제 프로토콜에서는 통신 효율과 계산 속도를 높이기 위해 다항식 환을 사용한 &lt;strong>Ring-LWE&lt;/strong>나 &lt;strong>Module-LWE&lt;/strong>가 채택되고 있으며, NIST 표준인 &lt;strong>ML-KEM&lt;/strong>의 기반이 되고 있습니다.&lt;/li>
&lt;/ol>
&lt;p>양자 컴퓨터라는 전대미문의 계산 패러다임 시프트가 다가오는 가운데, 고전적인 선형대수와 정수론의 심연에서 탄생한 &amp;lsquo;격자 암호&amp;rsquo;가 미래 인터넷 보안의 기반을 담당한다는 것은 매우 낭만적인 이야기입니다. 격자 암호의 기초가 되는 수학은 결코 너무 난해한 것이 아니며, 선형대수와 확률에 대한 기초 지식이 있다면 충분히 그 아름다운 구조를 이해할 수 있습니다. 본 기사가 PQC의 핵심이 되는 격자 암호에 대한 이해에 도움이 되기를 바랍니다.&lt;/p></description></item><item><title>영지식 증명(ZKP)의 구조와 최신 Web3 및 보안에의 응용</title><link>http://kenji.blog/ko/p/zero-knowledge-proofs-zkp-web3-security/</link><pubDate>Fri, 11 Sep 2026 19:00:00 +0900</pubDate><guid>http://kenji.blog/ko/p/zero-knowledge-proofs-zkp-web3-security/</guid><description>&lt;img src="http://kenji.blog/p/zero-knowledge-proofs-zkp-web3-security/img/eyecatch.jpg" alt="Featured image of post 영지식 증명(ZKP)의 구조와 최신 Web3 및 보안에의 응용" />&lt;h2 id="들어가며">들어가며
&lt;/h2>&lt;p>현대 디지털 사회에서 데이터 프라이버시와 확장성(scalability)은 가장 중요한 두 가지 과제가 되었습니다. 개인정보 유출이나 부정 사용의 위험이 높아지는 가운데, &amp;ldquo;자신에 관한 정보를 상대방에게 밝히지 않고 자신이 그 정보를 가지고 있음을 증명하는&amp;rdquo; 기술이 강력하게 요구되고 있습니다. 이를 실현하는 것이 **영지식 증명(Zero-Knowledge Proof: ZKP)**입니다.&lt;/p>
&lt;p>영지식 증명은 1980년대에 Shafi Goldwasser, Silvio Micali, Charles Rackoff에 의해 처음 제창된 암호 이론의 개념이지만, 오랫동안 이론적인 연구에 머물러 있었습니다. 그러나 블록체인 기술과 Web3의 대두로 상황은 완전히 바뀌었습니다. 이더리움(Ethereum) 등의 퍼블릭 블록체인이 직면한 확장성 문제(처리 능력의 한계)와 프라이버시 문제(모든 트랜잭션이 공개되는 것)를 동시에 해결하는 &amp;ldquo;마법의 지팡이&amp;quot;로서 ZKP는 일약 각광받게 되었습니다.&lt;/p>
&lt;p>본 기사에서는 영지식 증명의 기본적인 개념부터 현재 주류를 이루고 있는 &lt;strong>zk-SNARKs&lt;/strong> 및 &lt;strong>zk-STARKs&lt;/strong>의 심오한 수학적·암호학적 메커니즘, 그리고 ZK-Rollups나 분산형 신원 증명(DID)과 같은 최신 Web3·보안 응용 사례에 이르기까지 매우 상세하고 기술적으로 깊이 있게 해설합니다.&lt;/p>
&lt;hr>
&lt;h2 id="영지식-증명zkp이란-무엇인가">영지식 증명(ZKP)이란 무엇인가?
&lt;/h2>&lt;p>영지식 증명(ZKP)이란 어떤 명제가 참이라는 것을 증명자(Prover)가 검증자(Verifier)에게 증명할 때, &amp;ldquo;그 명제가 참이라는 것 이외의 어떠한 정보도 전달하지 않는&amp;rdquo; 프로토콜을 뜻합니다.&lt;/p>
&lt;h3 id="zkp가-충족해야-할-3가지-요건">ZKP가 충족해야 할 3가지 요건
&lt;/h3>&lt;p>ZKP로 성립하기 위해서는 다음의 3가지 특성을 엄밀하게 충족해야 합니다.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>완전성 (Completeness)&lt;/strong>
명제가 참이고 증명자와 검증자 양측이 올바르게 프로토콜을 따른다면, 검증자는 압도적인 확률로 그 증명을 수락(Accept)해야 합니다.&lt;/li>
&lt;li>&lt;strong>건전성 (Soundness)&lt;/strong>
명제가 거짓이라면, 아무리 계산 능력이 뛰어나고 악의적인 증명자라 할지라도 검증자를 속여 증명을 수락하게 만드는 것은 (무시할 수 있을 정도로 작은 확률을 제외하고) 불가능합니다.&lt;/li>
&lt;li>&lt;strong>영지식성 (Zero-Knowledge)&lt;/strong>
명제가 참인 경우, 검증자는 &amp;ldquo;명제가 참이다&amp;quot;라는 사실 이외의 어떠한 정보도 증명 과정에서 얻을 수 없습니다. 검증자의 관점에서 보면, 증명 과정을 시뮬레이션하는 것이 가능하다(시뮬레이터가 존재한다)는 수학적 정의에 의해 증명됩니다.&lt;/li>
&lt;/ol>
&lt;h3 id="대화형-증명과-비대화형-증명">대화형 증명과 비대화형 증명
&lt;/h3>&lt;p>ZKP에는 증명자와 검증자가 여러 번 통신을 주고받는 **대화형 증명(Interactive ZKP)**과 증명자가 한 번만 증명 데이터를 전송하고 끝나는 **비대화형 증명(Non-Interactive ZKP)**의 두 종류가 존재합니다.&lt;/p>
&lt;h4 id="대화형-증명-interactive-zkp">대화형 증명 (Interactive ZKP)
&lt;/h4>&lt;p>초기의 ZKP는 대화형 프로토콜로 설계되었습니다. 유명한 &amp;ldquo;알리바바의 동굴&amp;rdquo; 비유가 이에 해당합니다. 일반적인 프로토콜의 흐름은 다음과 같습니다.&lt;/p>
&lt;div class="mermaid">sequenceDiagram
participant Prover as "Prover (증명자)"
participant Verifier as "Verifier (검증자)"
Note over Prover, Verifier: "대화형 증명 프로토콜의 기본 흐름"
Prover->>Verifier: "1. 커미트먼트 전송 (Commitment)"
Verifier->>Prover: "2. 무작위 챌린지 전송 (Challenge)"
Prover->>Verifier: "3. 응답 계산 및 전송 (Response)"
Note over Verifier: "응답 검증 (Verification)"
Verifier-->>Prover: "4. 수락 또는 거부 (Accept / Reject)"
Note over Prover, Verifier: "※정확도를 높이기 위해 이를 수십 번 반복함"&lt;/div>
&lt;p>이 방법은 강력하지만, 검증자가 온라인 상태여야 하므로 블록체인과 같은 비동기적인 분산 시스템에 적용하기에는 불편합니다. 블록체인에서는 누구나 언제든지 과거의 증명을 검증할 수 있어야 합니다.&lt;/p>
&lt;h4 id="피아트-샤미르-변환과-비대화화">피아트-샤미르 변환과 비대화화
&lt;/h4>&lt;p>대화형 증명을 비대화형 증명(Non-Interactive Zero-Knowledge Proof: NIZK)으로 변환하기 위한 획기적인 기법이 바로 **피아트-샤미르 변환(Fiat-Shamir Heuristic)**입니다.&lt;/p>
&lt;p>검증자가 전송하는 &amp;ldquo;무작위 챌린지&amp;rdquo; 대신, 증명자가 자신의 커미트먼트와 공개 정보의 해시값을 사용하여 &amp;ldquo;유사 무작위 챌린지&amp;quot;를 스스로 생성합니다. 암호학적 해시 함수(예: SHA-256이나 Keccak 등)가 랜덤 오라클로 기능한다는 전제하에, 증명자는 챌린지를 사전에 예측하거나 조작할 수 없으며, 대화형 증명과 동등한 보안성을 유지한 채 단 한 번의 메시지 전송으로 증명을 완료할 수 있습니다.&lt;/p>
&lt;hr>
&lt;h2 id="zk-snarks의-기술적-세부-사항">zk-SNARKs의 기술적 세부 사항
&lt;/h2>&lt;p>현재 ZKP 중에서 가장 널리 사용되는 것이 &lt;strong>zk-SNARKs&lt;/strong>(Zero-Knowledge Succinct Non-Interactive Argument of Knowledge)입니다. 이름 그대로 영지식성(zk)을 가지며, 증명 크기가 매우 작고 검증이 빠르며(Succinct), 비대화형(Non-Interactive)인 지식의 논증(Argument of Knowledge)입니다.&lt;/p>
&lt;p>zk-SNARKs의 기반이 되는 것은 고도의 대수기하학과 암호 이론입니다. 프로그램의 실행이나 계산을 특정 다항식의 방정식 검증으로 변환합니다.&lt;/p>
&lt;h3 id="1-산술-회로와-r1csrank-1-constraint-system로의-변환">1. 산술 회로와 R1CS(Rank-1 Constraint System)로의 변환
&lt;/h3>&lt;p>먼저, 증명하고자 하는 임의의 계산(알고리즘이나 스마트 컨트랙트의 로직)을 덧셈 게이트와 곱셈 게이트로 이루어진 **산술 회로(Arithmetic Circuit)**로 변환합니다.&lt;/p>
&lt;p>다음으로, 이 산술 회로를 **R1CS(Rank-1 Constraint System)**라는 행렬 방정식의 집합으로 변환합니다. R1CS는 변수 벡터 $x$에 대해 다음과 같은 제약을 만족하는 행렬 $A, B, C$를 찾는 문제입니다.&lt;/p>
$$ (A \cdot x) \circ (B \cdot x) = C \cdot x $$
&lt;p>여기서 $\circ$는 아다마르 곱(요소별 곱)을 나타냅니다. 이 제약은 회로 내의 모든 논리 게이트(특히 곱셈 게이트)가 올바르게 계산되었음을 보장합니다.&lt;/p>
&lt;h3 id="2-qapquadratic-arithmetic-program로의-변환">2. QAP(Quadratic Arithmetic Program)로의 변환
&lt;/h3>&lt;p>R1CS의 행렬 제약은 무수히 존재하기 때문에 이를 개별적으로 검증하는 것은 매우 비효율적입니다. 따라서 라그랑주 보간법을 사용하여 이러한 제약들을 단일 다항식 방정식으로 압축합니다. 이것이 **QAP(Quadratic Arithmetic Program)**입니다.&lt;/p>
&lt;p>QAP로의 변환을 통해 증명해야 할 문제는 &amp;ldquo;특정 다항식 $P(x)$가 미리 알려진 다른 다항식 $Z(x)$로 나누어 떨어지는가?&amp;ldquo;라는 문제로 귀결됩니다.&lt;/p>
$$ P(x) = L(x) \cdot R(x) - O(x) $$
&lt;p>여기서 $L(x), R(x), O(x)$는 각각 행렬 $A, B, C$의 각 행에 해당하는 다항식을 결합한 것입니다. 만약 증명자가 올바른 해(Witness)를 알고 있다면, $P(x)$의 각 근(평가점)에서 값이 0이 되므로 $P(x)$는 타깃 다항식 $Z(x)$를 인수로 갖게 됩니다. 즉, 어떤 다항식 $H(x)$가 존재하여 다음 식이 성립합니다.&lt;/p>
$$ P(x) = H(x) \cdot Z(x) $$
&lt;p>검증자는 어떤 무작위의 비밀 점 $s$에서 이 방정식 $P(s) = H(s) \cdot Z(s)$가 성립하는지 확인하는 것만으로 계산 전체가 올바르게 수행되었는지를 순식간에 검증할 수 있습니다. 이것이 &amp;ldquo;간결성(Succinct)&amp;ldquo;의 비밀입니다.&lt;/p>
&lt;h3 id="3-타원-곡선-암호와-페어링-bilinear-pairings">3. 타원 곡선 암호와 페어링 (Bilinear Pairings)
&lt;/h3>&lt;p>그러나 검증자가 비밀 점 $s$를 알고 있다면 증명자가 가짜 다항식을 날조하여 방정식을 만족시키는 것이 가능해집니다(건전성의 붕괴). 따라서 $s$를 아무도 알 수 없게 암호화(동형 암호를 이용)한 상태에서 계산을 수행해야 합니다.&lt;/p>
&lt;p>이를 실현하는 것이 **타원 곡선 페어링(Bilinear Pairings)**입니다.
페어링 $e$는 암호화된 두 값으로부터 이들의 곱을 암호화한 것에 해당하는 값을 계산할 수 있는 특수한 함수입니다.&lt;/p>
$$ e(g_1^a, g_2^b) = e(g_1, g_2)^{ab} $$
&lt;p>증명자는 $s$ 자체를 모르더라도 $s$의 거듭제곱이 암호화된 값(이를 CRS: Common Reference String이라 부릅니다)을 사용하여 다항식 $P(s)$나 $H(s)$의 암호화된 값을 계산합니다. 검증자는 페어링 함수를 사용하여 암호화된 값 상태 그대로 $P(s) = H(s) \cdot Z(s)$의 관계가 성립하는지를 검증합니다.&lt;/p>
&lt;h3 id="4-신뢰할-수-있는-설정-trusted-setup">4. 신뢰할 수 있는 설정 (Trusted Setup)
&lt;/h3>&lt;p>zk-SNARKs(특히 초기의 Groth16 등)의 가장 큰 약점은 비밀 점 $s$를 생성하는 과정, 이른바 **신뢰할 수 있는 설정(Trusted Setup)**이 필요하다는 점입니다. 만약 $s$의 생성자가 그 값을 파기하지 않고 보유하고 있다면 임의의 가짜 증명을 생성할 수 있게 됩니다(Toxic Waste 문제).&lt;/p>
&lt;p>이를 방지하기 위해 다자간 컴퓨팅(Multi-Party Computation: MPC)을 활용한 &amp;ldquo;세리머니(Ceremony)&amp;ldquo;라는 의식이 진행됩니다. 다수의 참여자가 협력하여 무작위성을 제공하고, 적어도 1명의 참여자가 정직하게 자신의 무작위 값을 파기한다면 시스템 전체의 보안이 유지되는 구조입니다. 그러나 이러한 의존성을 제거하기 위한 연구가 오랫동안 계속되어 왔습니다.&lt;/p>
&lt;hr>
&lt;h2 id="zk-starks의-기술적-세부-사항">zk-STARKs의 기술적 세부 사항
&lt;/h2>&lt;p>신뢰할 수 있는 설정에 대한 의존성과 양자 컴퓨터에 의한 타원 곡선 암호 해독 위험에 대한 해답으로 등장한 것이 &lt;strong>zk-STARKs&lt;/strong>(Zero-Knowledge Scalable Transparent Argument of Knowledge)입니다.&lt;/p>
&lt;p>Eli Ben-Sasson 등이 개발한 STARKs는 &amp;ldquo;투명성(Transparent)&amp;ldquo;이라는 이름대로 신뢰할 수 있는 설정이 전혀 필요하지 않으며, &amp;ldquo;확장성(Scalable)&amp;ldquo;이라는 이름대로 계산량이 증가해도 증명 크기와 검증 시간이 효율적으로 유지된다는 특징을 가지고 있습니다.&lt;/p>
&lt;h3 id="1-다항식-커미트먼트와-fri-프로토콜">1. 다항식 커미트먼트와 FRI 프로토콜
&lt;/h3>&lt;p>zk-STARKs는 타원 곡선 암호가 아닌, &lt;strong>해시 함수에만&lt;/strong> 보안의 근거를 두고 있습니다. 따라서 양자 내성 암호(Post-Quantum Cryptography)로서의 성질을 가집니다.&lt;/p>
&lt;p>계산의 검증은 AIR(Algebraic Intermediate Representation)라는 형식으로 변환된 후, 1차원 또는 다차원 다항식의 성질을 이용하여 수행됩니다. STARKs의 핵심은 &lt;strong>FRI(Fast Reed-Solomon Interactive Oracle Proof of Proximity)&lt;/strong> 프로토콜에 있습니다.&lt;/p>
&lt;p>FRI 프로토콜은 &amp;ldquo;어떤 함수가 특정 차수의 다항식에 충분히 가까운가(Proximity)&amp;ldquo;를 검증하는 기술입니다. 증명자는 다항식의 값을 머클 트리(Merkle Tree)의 리프(leaf)로 커밋(다항식 커미트먼트)합니다.&lt;/p>
&lt;div class="mermaid">graph TD
Root["Merkle Root (커미트먼트)"] --> Node0["Node 0"]
Root --> Node1["Node 1"]
Node0 --> Leaf0["P(x_0)"]
Node0 --> Leaf1["P(x_1)"]
Node1 --> Leaf2["P(x_2)"]
Node1 --> Leaf3["P(x_3)"]&lt;/div>
&lt;p>검증자는 무작위로 몇 개의 점을 공개하도록 요구하고, 머클 프루프(Merkle Proof)를 사용하여 그것들이 커미트먼트에 포함되어 있는지 확인합니다. 이를 재귀적으로 반복함으로써 원래 다항식의 차수가 실제로 낮다는 것을 압도적인 확률로 보장합니다.&lt;/p>
&lt;h3 id="zk-snarks와-zk-starks의-비교">zk-SNARKs와 zk-STARKs의 비교
&lt;/h3>&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">특징&lt;/th>
&lt;th style="text-align:left">zk-SNARKs&lt;/th>
&lt;th style="text-align:left">zk-STARKs&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>암호학적 가정&lt;/strong>&lt;/td>
&lt;td style="text-align:left">타원 곡선, 페어링&lt;/td>
&lt;td style="text-align:left">충돌 저항성 해시 함수&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>신뢰할 수 있는 설정&lt;/strong>&lt;/td>
&lt;td style="text-align:left">필요 (Plonk 등은 범용적)&lt;/td>
&lt;td style="text-align:left">불필요 (Transparent)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>양자 내성&lt;/strong>&lt;/td>
&lt;td style="text-align:left">없음&lt;/td>
&lt;td style="text-align:left">있음&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>증명 크기&lt;/strong>&lt;/td>
&lt;td style="text-align:left">매우 작음 (~200 Byte)&lt;/td>
&lt;td style="text-align:left">다소 큼 (수십 KB)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>증명 생성의 계산 비용&lt;/strong>&lt;/td>
&lt;td style="text-align:left">높음&lt;/td>
&lt;td style="text-align:left">SNARKs보다 비교적 낮음&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>검증 비용 (가스비)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">매우 낮음 (일정함)&lt;/td>
&lt;td style="text-align:left">낮음 (대수적으로 증가)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>최근에는 Plonk나 Halo2처럼 &amp;ldquo;신뢰할 수 있는 설정이 불필요하거나, 한 번만 수행하면 되는 SNARKs&amp;quot;가 등장하면서 SNARKs와 STARKs의 경계가 점차 모호해지고 있지만, 기본적인 수학적 접근 방식의 차이는 중요합니다.&lt;/p>
&lt;hr>
&lt;h2 id="영지식-증명의-web3-및-보안에의-최신-응용">영지식 증명의 Web3 및 보안에의 최신 응용
&lt;/h2>&lt;p>이론에서 실전으로 넘어온 ZKP는 현재 Web3와 사이버 보안의 최전선에서 혁명을 일으키고 있습니다.&lt;/p>
&lt;h3 id="1-zk-rollups를-통한-이더리움의-궁극적-스케일링">1. ZK-Rollups를 통한 이더리움의 궁극적 스케일링
&lt;/h3>&lt;p>이더리움과 같은 L1(레이어1) 블록체인은 탈중앙화와 보안을 중시한 나머지 확장성에 큰 제약(트릴레마)을 안고 있습니다. 이를 해결하는 L2(레이어2) 솔루션의 결정판이 &lt;strong>ZK-Rollups&lt;/strong>입니다.&lt;/p>
&lt;p>ZK-Rollup에서는 수천 개의 트랜잭션을 오프체인(L2)에서 실행 및 처리하고, 그것들이 모두 올바르게 실행되었음을 나타내는 &amp;ldquo;하나의 ZKP(Validity Proof)&amp;ldquo;를 생성합니다. L1 체인 상의 스마트 컨트랙트는 이 증명만 검증하면 됩니다.&lt;/p>
&lt;div class="mermaid">flowchart LR
Users["Users (Tx 송신)"] --> Sequencer["Sequencer (Tx 수집 및 실행)"]
Sequencer --> Prover["Prover (ZKP 생성)"]
Sequencer --> L1Contract["L1 Smart Contract (Tx 데이터 공개)"]
Prover --> L1Contract["ZKP (증명) 제출"]
L1Contract --> Verify["검증 및 상태 업데이트"]&lt;/div>
&lt;p>ZK-Rollups의 가장 큰 장점은 Optimistic Rollups(Arbitrum이나 Optimism 등)와 달리, 사기 증명(Fraud Proof)을 위한 챌린지 기간(보통 7일)이 불필요하다는 점입니다. 암호학적으로 정확성이 보장되어 있기 때문에 증명이 검증되는 순간 L1으로의 자금 인출(Finality)이 완료됩니다. 현재 zkSync, Starknet, Scroll, Polygon zkEVM 등의 프로젝트가 치열한 개발 경쟁을 펼치고 있으며, EVM(Ethereum Virtual Machine)과 호환성을 가지는 &lt;strong>zkEVM&lt;/strong>의 구현이 생태계를 급성장시키고 있습니다.&lt;/p>
&lt;h3 id="2-개인정보-보호-신원-증명-zkp-for-identity">2. 개인정보 보호 신원 증명 (ZKP for Identity)
&lt;/h3>&lt;p>디지털 세계에서의 개인 인증 방식도 ZKP에 의해 근본적으로 바뀝니다.
예를 들어, &amp;ldquo;당신은 18세 이상입니까?&amp;ldquo;라는 질문에 대해 기존 시스템에서는 운전면허증이나 여권을 제시하여 이름이나 주소와 같은 불필요한 개인정보까지 상대방에게 넘겨주어야 했습니다.&lt;/p>
&lt;p>ZKP를 사용하면 공공기관이 발급한 디지털 인증서(Verifiable Credential)를 바탕으로, &amp;ldquo;내 생년월일로 계산했을 때 현재 날짜 기준으로 18세 이상이다&amp;quot;라는 &lt;strong>사실만을 수학적으로 증명&lt;/strong>하는 것이 가능해집니다. 검증자는 인증서의 서명과 ZKP를 검증하기만 하면 되며, 사용자의 생년월일이나 신원을 알 수 없습니다.&lt;/p>
&lt;p>Worldcoin과 같은 인류 증명(Proof of Personhood) 프로젝트에서도 홍채 데이터를 직접 저장하거나 공유하지 않고, ZKP를 사용하여 &amp;ldquo;고유한 인간임&amp;quot;만을 증명하는 시스템이 도입되어 있습니다.&lt;/p>
&lt;h3 id="3-기밀-스마트-컨트랙트와-기업-활용">3. 기밀 스마트 컨트랙트와 기업 활용
&lt;/h3>&lt;p>퍼블릭 블록체인의 &amp;ldquo;모든 데이터가 공개된다&amp;quot;는 특성은 기업이 기밀 거래나 공급망 정보를 블록체인에서 다룰 때 큰 장벽이었습니다.&lt;/p>
&lt;p>ZKP 기술(예: Aleo나 Aztec 같은 프라이버시 특화 네트워크)을 사용하면 트랜잭션의 입력값, 출력값, 나아가 실행되는 스마트 컨트랙트의 로직 자체를 암호화한 채 상태 업데이트의 정당성만을 퍼블릭 체인에 기록할 수 있습니다. 이를 통해 DeFi(탈중앙화 금융)에서의 선행 매매(Front-running, MEV) 방지나 기업 간의 기밀 컨소시엄 네트워크 구축이 퍼블릭 체인의 높은 보안을 누리면서도 실현 가능해집니다.&lt;/p>
&lt;hr>
&lt;h2 id="zkp의-향후-과제와-전망">ZKP의 향후 과제와 전망
&lt;/h2>&lt;p>ZKP는 틀림없는 차세대 기반 기술이지만, 몇 가지 과제도 남아 있습니다.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>증명 생성의 계산 비용과 하드웨어 가속&lt;/strong>
ZKP의 생성에는 방대한 다항식 연산이나 FFT(고속 푸리에 변환), MSM(다중 스칼라 곱셈)이 필요합니다. 현재 이 증명 생성을 가속하기 위한 전용 하드웨어(FPGA나 ASIC)의 개발, 이른바 &lt;strong>ZKP 마이닝&lt;/strong>(Prover Network) 연구가 빠르게 진행되고 있습니다.&lt;/li>
&lt;li>&lt;strong>표준화와 개발자 경험(DX) 향상&lt;/strong>
Circom, Cairo, Noir, Leo 등 ZKP 회로를 작성하기 위한 전용 언어가 난립하고 있습니다. 이들을 통일하는 표준 규격이나 기존의 Rust나 C++에서 자동으로 ZKP 회로를 생성하는 컴파일러의 성숙이 일반 소프트웨어 엔지니어들의 ZKP 도입에 핵심이 될 것입니다.&lt;/li>
&lt;/ol>
&lt;h2 id="마무리">마무리
&lt;/h2>&lt;p>영지식 증명(ZKP)은 단순한 &amp;ldquo;암호화폐의 익명성을 높이는 기술&amp;quot;에서 &amp;ldquo;인터넷 전체의 신뢰(Trust)를 재정의하는 범용 기술&amp;quot;로 진화했습니다. 수식과 암호 이론의 깊은 곳에서 계산된 작은 증명이 블록체인의 확장성을 무한히 넓히고 우리의 프라이버시를 강력하게 지키는 방패가 됩니다.&lt;/p>
&lt;p>Web3의 진정한 대중화(Mass Adoption), 그리고 안전하고 프라이빗한 차세대 인터넷 구축을 향해 영지식 증명은 가장 중요한 퍼즐 조각으로 계속 기능할 것입니다. 앞으로의 ZKP 기술 진화에서 눈을 뗄 수 없습니다.&lt;/p>
&lt;hr>
&lt;p>&lt;em>참고 문헌 및 관련 링크&lt;/em>&lt;/p>
&lt;ul>
&lt;li>Groth, J. (2016). &amp;ldquo;On the Size of Pairing-based Non-interactive Arguments&amp;rdquo;&lt;/li>
&lt;li>Ben-Sasson, E., et al. (2018). &amp;ldquo;Scalable, transparent, and post-quantum secure computational integrity&amp;rdquo;&lt;/li>
&lt;li>Vitalik Buterin&amp;rsquo;s blog on zk-SNARKs and zk-STARKs&lt;/li>
&lt;/ul></description></item><item><title>완전동형암호(FHE)란? 차세대 보안의 핵심을 해설</title><link>http://kenji.blog/ko/p/fully-homomorphic-encryption-fhe-explained/</link><pubDate>Fri, 11 Sep 2026 11:00:00 +0900</pubDate><guid>http://kenji.blog/ko/p/fully-homomorphic-encryption-fhe-explained/</guid><description>&lt;img src="http://kenji.blog/p/fully-homomorphic-encryption-fhe-explained/img/eyecatch.jpg" alt="Featured image of post 완전동형암호(FHE)란? 차세대 보안의 핵심을 해설" />&lt;p>클라우드 컴퓨팅과 AI 기술이 사회의 기반으로 자리 잡은 가운데, &amp;lsquo;데이터의 프라이버시&amp;rsquo;와 &amp;lsquo;데이터의 활용&amp;rsquo;의 트레이드오프는 가장 중요한 과제 중 하나가 되었습니다. 의료 데이터, 금융 정보, 개인의 생체 정보 등 기밀성이 높은 데이터를 클라우드 상에서 AI에게 분석시키고자 하는 수요는 증가하고 있지만, 보안상의 우려로 데이터의 외부 전송을 주저하는 기업이 적지 않습니다.&lt;/p>
&lt;p>기존의 암호화 기술(AES나 RSA 등)은 스토리지에 저장되어 있는 데이터(Data at Rest)나 네트워크 상을 흐르는 데이터(Data in Transit)를 보호하는 데에는 능숙합니다. 하지만, 서버 측에서 데이터에 대해 검색이나 기계 학습 등의 &lt;strong>처리(계산)를 수행할 때(Data in Use)에는 한 번 암호를 복호화하여 평문으로 되돌려야 합니다&lt;/strong>. 만약 이 복호화된 타이밍에 서버가 해킹당하거나, 내부의 악의적인 관리자가 데이터를 엿본다면 정보 유출로 직결됩니다.&lt;/p>
&lt;p>이 &amp;lsquo;처리 시의 복호화&amp;rsquo;라는 근본적인 약점을 극복하는 꿈의 기술이 **완전동형암호(Fully Homomorphic Encryption: FHE)**입니다. FHE를 이용하면 데이터를 암호화한 채로 일절 복호화하지 않고 계산 처리를 수행하고, 그 결과의 암호문만을 클라이언트에게 반환하는 것이 가능해집니다.&lt;/p>
&lt;p>본 기사에서는 이 FHE의 개념부터 역사, Craig Gentry에 의한 획기적인 돌파구, 수학적인 기초(Ring-LWE 등), 최대 과제인 &amp;lsquo;노이즈&amp;rsquo;와 그 해결책(부트스트래핑), 그리고 최신 구현 라이브러리에 이르기까지 차세대 보안의 핵심인 FHE를 철저하고 깊이 있게 해설합니다.&lt;/p>
&lt;hr>
&lt;h2 id="1-동형암호란-무엇인가-기본적인-개념">1. 동형암호란 무엇인가? 기본적인 개념
&lt;/h2>&lt;p>&amp;lsquo;동형(Homomorphic)&amp;lsquo;이란 대수학의 용어로, 어떤 구조를 가진 집합 간에 연산의 구조를 유지한 채 사상할 수 있는 성질을 뜻합니다. 암호 이론에서의 &amp;lsquo;동형성&amp;rsquo;이란 &lt;strong>평문 공간에서의 연산이 암호문 공간에서의 연산에 대응한다&lt;/strong>는 성질입니다.&lt;/p>
&lt;p>단순한 수식으로 나타내면, 평문 $m_1$ 과 $m_2$ 에 대한 암호화 함수를 $E(\cdot)$ 라 하고, 복호화 함수를 $D(\cdot)$ 라 합니다. 평문 상에서의 연산(덧셈이나 곱셈 등)을 $\circ$ , 암호문 상에서의 연산을 $\diamond$ 라 했을 때, 이하의 관계가 성립합니다.&lt;/p>
$$ D(E(m_1) \diamond E(m_2)) = m_1 \circ m_2 $$
&lt;p>즉, 암호문 $E(m_1)$ 과 $E(m_2)$ 에 대해 어떤 연산 $\diamond$ 를 가한 결과를 복호화하면, 원래의 평문끼리 연산 $\circ$ 를 한 결과와 일치한다는 것입니다.&lt;/p>
&lt;h3 id="클라우드-컴퓨팅에서의-데이터-흐름">클라우드 컴퓨팅에서의 데이터 흐름
&lt;/h3>&lt;p>FHE를 이용한 클라우드 처리의 아키텍처는 기존의 것과 전혀 다릅니다. 다음 그림은 FHE를 활용한 안전한 데이터 처리의 흐름을 보여줍니다.&lt;/p>
&lt;div class="mermaid">graph TD
A["클라이언트 (비밀키를 보유)"] -->|1. 평문 x 를 암호화: E(x)| B["클라우드 서버 (암호화된 데이터만 존재)"]
B -->|2. 암호문인 채로 함수 f 를 적용: E(f(x))| B
B -->|3. 계산 결과의 암호문 E(y)| A
A -->|4. 비밀키로 복호화: y = f(x)| A
style A fill:#d4edda,stroke:#28a745
style B fill:#f8d7da,stroke:#dc3545&lt;/div>
&lt;p>서버는 암호화된 데이터 $E(x)$ 를 받지만, 비밀키를 가지고 있지 않기 때문에 데이터의 내용을 아는 것은 절대 불가능합니다. 그러나 FHE의 성질을 이용함으로써, 암호문에 대해 함수 $f$(예를 들어 기계 학습의 추론 모델)를 적용하여 $E(f(x))$ 를 생성할 수 있습니다. 클라이언트는 이것을 받아 자신의 비밀키로 복호화함으로써 목적하는 결과 $y = f(x)$ 를 얻게 됩니다.&lt;/p>
&lt;hr>
&lt;h2 id="2-동형암호의-진화-역사-phe-she-fhe">2. 동형암호의 진화 역사: PHE, SHE, FHE
&lt;/h2>&lt;p>동형암호는 단번에 현재의 &amp;lsquo;완전&amp;rsquo;한 형태가 된 것은 아닙니다. 실현할 수 있는 연산의 종류나 횟수에 따라 크게 3가지 단계로 분류됩니다.&lt;/p>
&lt;h3 id="partially-homomorphic-encryption-phe-부분동형암호">Partially Homomorphic Encryption (PHE: 부분동형암호)
&lt;/h3>&lt;p>PHE는 덧셈이나 곱셈 중 &lt;strong>어느 한쪽만&lt;/strong>을 무제한으로 수행할 수 있는 암호 방식입니다. 사실 이 성질을 가진 암호는 예전부터 존재했습니다.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>RSA 암호 (곱셈에 대한 동형성)&lt;/strong>
RSA 암호는 의도치 않게 곱셈의 동형성을 가지고 있었습니다. 평문 $m_1, m_2$, 공개키 $(e, N)$ 이라고 하면:
$$ E(m_1) = m_1^e \pmod N $$
$$ E(m_2) = m_2^e \pmod N $$
이들을 곱하면:
$$ E(m_1) \times E(m_2) = (m_1 \cdot m_2)^e \pmod N = E(m_1 \times m_2) $$
이와 같이 암호문끼리의 곱셈이 평문의 곱셈에 대응합니다.&lt;/li>
&lt;li>&lt;strong>Paillier 암호 (덧셈에 대한 동형성)&lt;/strong>
1999년에 고안된 Paillier 암호는 덧셈에 대한 동형성을 가집니다. 전자투표(암호화된 표를 집계하고, 최종 결과만 복호화하는 등) 등에서 실용화되어 있습니다.&lt;/li>
&lt;/ul>
&lt;h3 id="somewhat-homomorphic-encryption-she-유한동형암호">Somewhat Homomorphic Encryption (SHE: 유한동형암호)
&lt;/h3>&lt;p>덧셈과 곱셈 &lt;strong>모두&lt;/strong>를 실행할 수 있지만, 연산할 수 있는 &lt;strong>횟수(회로의 깊이)에 제한&lt;/strong>이 있는 방식입니다. 후술할 &amp;lsquo;노이즈&amp;rsquo;의 축적으로 인해 특정 횟수 이상의 곱셈을 수행하면 복호화가 불가능해집니다. 2005년의 BGN (Boneh-Goh-Nissim) 암호 등이 이에 해당하지만, 실용적이고 복잡한 계산(딥러닝 등)을 수행하기에는 한계가 있었습니다.&lt;/p>
&lt;h3 id="fully-homomorphic-encryption-fhe-완전동형암호">Fully Homomorphic Encryption (FHE: 완전동형암호)
&lt;/h3>&lt;p>덧셈과 곱셈 모두를 &lt;strong>횟수 제한 없이&lt;/strong> 실행할 수 있는 암호 방식입니다. 정보 이론에서의 튜링 완전성과 마찬가지로, 덧셈(XOR에 해당)과 곱셈(AND에 해당)을 무한히 조합할 수 있다면 원리상 어떠한 계산 가능한 함수나 알고리즘도 암호화된 채로 실행할 수 있음을 의미합니다.&lt;/p>
&lt;p>FHE는 오랫동안 &amp;lsquo;암호계의 성배&amp;rsquo;로 불리며 실현 불가능한 것이 아닌가 하는 이야기도 있었습니다. 하지만 2009년 당시 스탠포드 대학교 박사과정에 있던 &lt;strong>Craig Gentry&lt;/strong>가 이상 격자(Ideal Lattices)를 이용한 최초의 FHE 체계를 제안하며 세계에 충격을 안겨주었습니다.&lt;/p>
&lt;hr>
&lt;h2 id="3-fhe의-수학적-기반-lwe-문제와-ring-lwe">3. FHE의 수학적 기반: LWE 문제와 Ring-LWE
&lt;/h2>&lt;p>현재 주류가 되고 있는 FHE 체계의 대부분은 내양자 컴퓨터 암호(Post-Quantum Cryptography)로도 알려진 &amp;lsquo;격자 기반 암호(Lattice-based Cryptography)&amp;lsquo;의 수학적 난제인 &lt;strong>LWE (Learning With Errors) 문제&lt;/strong>에 기반하고 있습니다.&lt;/p>
&lt;h3 id="lwe-문제의-직관적인-이해">LWE 문제의 직관적인 이해
&lt;/h3>&lt;p>연립일차방정식을 푸는 것은 가우스 소거법 등을 이용하면 간단합니다.&lt;/p>
$$ \begin{cases} 3s_1 + 4s_2 + 2s_3 \equiv 12 \pmod{17} \\ 1s_1 + 9s_2 + 5s_3 \equiv 8 \pmod{17} \\ \vdots \end{cases} $$
&lt;p>하지만 이 방정식의 결과에 아주 약간의 &amp;lsquo;무작위 오차(노이즈)&amp;rsquo; $e$ 를 더하면 어떻게 될까요.&lt;/p>
$$ \begin{cases} 3s_1 + 4s_2 + 2s_3 + e_1 \equiv 13 \pmod{17} \\ 1s_1 + 9s_2 + 5s_3 + e_2 \equiv 7 \pmod{17} \\ \vdots \end{cases} $$
&lt;p>이 오차 $e$ 가 더해지는 것만으로 비밀 변수 벡터 $\vec{s}$ 를 찾아내는 문제는 현재의 슈퍼컴퓨터나 양자컴퓨터를 이용해도 해독하기 어려운 NP-난해(NP-hard) 문제로 변모합니다. 이것이 LWE 문제입니다.&lt;/p>
&lt;h3 id="ring-lwe-문제-rlwe">Ring-LWE 문제 (RLWE)
&lt;/h3>&lt;p>표준 LWE 문제는 행렬 연산을 포함하기 때문에 키의 크기가 매우 크고(기가바이트 단위가 되기도 함) 계산 효율도 나쁘다는 문제가 있었습니다. 이를 해결하기 위해 도입된 것이 다항식 환(Polynomial Ring) 위에서의 연산을 이용하는 &lt;strong>Ring-LWE (RLWE) 문제&lt;/strong>입니다.&lt;/p>
&lt;p>RLWE에서는 원소가 다항식 환 $R_q = \mathbb{Z}_q[x] / (x^N + 1)$ 에 속합니다(여기서 $N$ 은 2의 거듭제곱, $q$ 는 법이 되는 소수).
비밀키를 다항식 $s(x)$ 라 하고, 무작위 다항식 $a(x)$, 작은 노이즈 다항식 $e(x)$ 라고 하면, 공개키는 다음과 같은 쌍이 됩니다.&lt;/p>
$$ (a(x), b(x)) \quad \text{where} \quad b(x) = -a(x) \cdot s(x) + e(x) \pmod q $$
&lt;p>암호화할 때는 이 다항식의 성질을 이용하여 평문 $m(x)$ 를 인코딩하고 암호문을 생성합니다.&lt;/p>
&lt;hr>
&lt;h2 id="4-최대의-장벽-노이즈와-gentry의-부트스트래핑">4. 최대의 장벽 &amp;lsquo;노이즈&amp;rsquo;와 Gentry의 부트스트래핑
&lt;/h2>&lt;p>FHE의 이해에 있어 가장 중요한 개념이 **&amp;lsquo;노이즈의 관리&amp;rsquo;**입니다.&lt;/p>
&lt;p>LWE/RLWE 기반의 암호에서는 안전성을 담보하기 위해 의도적으로 작은 &amp;lsquo;노이즈(오차)&amp;lsquo;를 포함하고 있습니다.
평문 $m$ 의 암호문 $c$ 를 복호화하는 과정은 대략적으로 말하면 다음과 같은 수식으로 표현됩니다.&lt;/p>
$$ D(c) = (c \cdot s) \pmod q = m + \text{noise} $$
&lt;p>복호화 시에는 이 &lt;code>noise&lt;/code> 를 반올림 처리 등으로 제거함으로써 올바른 평문 $m$ 을 얻습니다. 그러나 암호문끼리 동형 연산(특히 곱셈)을 수행하면 이 노이즈가 극적으로 증폭되어 버립니다.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>동형 덧셈&lt;/strong>: 노이즈는 덧셈적으로 증가합니다($e_1 + e_2$). 이는 비교적 완만한 증가입니다.&lt;/li>
&lt;li>&lt;strong>동형 덧셈에 의한 동형성의 수식 표현&lt;/strong>:
$$ E(m_1) \oplus E(m_2) = E(m_1 + m_2) $$&lt;/li>
&lt;li>&lt;strong>동형 곱셈&lt;/strong>: 노이즈는 곱셈적으로 폭발합니다($e_1 \times e_2$ 등을 포함하기 때문). 몇 번 곱셈하는 것만으로 노이즈가 임계값 $q/2$ 를 넘어버려 올바른 반올림 처리가 불가능해 복호화에 실패합니다.&lt;/li>
&lt;li>&lt;strong>동형 곱셈에 의한 동형성의 수식 표현&lt;/strong>:
$$ E(m_1) \otimes E(m_2) = E(m_1 \times m_2) $$&lt;/li>
&lt;/ul>
&lt;p>이것이 오랫동안 FHE가 실현되지 못하고 SHE(횟수 제한 있음)에 머물러 있었던 이유입니다.&lt;/p>
&lt;h3 id="부트스트래핑bootstrapping의-마법">부트스트래핑(Bootstrapping)의 마법
&lt;/h3>&lt;p>Craig Gentry의 천재적인 공헌은 **&amp;lsquo;부트스트래핑&amp;rsquo;**이라 불리는 노이즈 감소 기법을 발명한 것입니다. 이는 암호학에 있어서 패러다임 전환이었습니다.&lt;/p>
&lt;p>직관적으로는 &amp;lsquo;암호문이 노이즈 투성이가 되어 망가지기 전에, 암호화된 채로 &amp;ldquo;복호화&amp;quot;하여 깨끗하게 만들고 새로운 암호문에 다시 넣는다&amp;rsquo;는 조작입니다.&lt;/p>
&lt;ol>
&lt;li>노이즈가 커진 암호문 $C_{noisy}$ 가 있다고 가정합니다.&lt;/li>
&lt;li>클라이언트는 비밀키 $sk$ 를 &amp;lsquo;공개키로 암호화한 것&amp;rsquo; $E_{pk}(sk)$ (이를 부트스트래핑 키라고 부름)를 미리 서버에 건네줍니다.&lt;/li>
&lt;li>서버는 $C_{noisy}$ 에 대해 동형적으로 **복호화 회로(Decryption Circuit)**를 실행합니다.&lt;/li>
&lt;li>구체적으로는 $E_{pk}(C_{noisy})$ 에 대해 $E_{pk}(sk)$ 를 이용하여 &amp;lsquo;암호화된 공간 내에서의 복호화&amp;rsquo;를 수행합니다.&lt;/li>
&lt;li>이 복호화 회로 자체도 동형 연산이기 때문에 새로운 노이즈를 낳지만, 출력되는 새로운 암호문 $C_{fresh}$ 의 노이즈는 일정한 &amp;lsquo;고정 레벨&amp;rsquo;로 초기화(리셋)됩니다.&lt;/li>
&lt;/ol>
&lt;div class="mermaid">graph LR
A["높은 노이즈 암호문 C_noisy"] --> B["동형 복호화 회로 (Eval_Dec)"]
C["암호화된 비밀키 E(sk)"] --> B
B --> D["낮은 노이즈 암호문 C_fresh"]
style B fill:#ffeeba,stroke:#ffc107&lt;/div>
&lt;p>이 부트스트래핑을 계산 도중에 정기적으로 실행함으로써, 이론상으로는 무한한 깊이의 회로를 계산 가능(FHE의 달성)하게 만들었습니다. 하지만 초기의 Gentry 방식은 이 부트스트래핑 처리 1회당 수십 분에서 수 시간씩 걸리는 등 절망적일 정도로 계산 비용이 높았습니다.&lt;/p>
&lt;hr>
&lt;h2 id="5-fhe의-세대와-주요-체계의-진화">5. FHE의 세대와 주요 체계의 진화
&lt;/h2>&lt;p>FHE의 실용화를 향해 전 세계의 암호학자들이 앞다투어 알고리즘을 개량해왔습니다. 현재 FHE는 크게 4개의 세대/제품군으로 분류됩니다.&lt;/p>
&lt;h3 id="제2세대-정수의-정확한-연산-bgv-bfv">제2세대: 정수의 정확한 연산 (BGV, BFV)
&lt;/h3>&lt;p>2011~2012년에 걸쳐 등장한 &lt;strong>BGV (Brakerski-Gentry-Vaikuntanathan)&lt;/strong> 와 &lt;strong>BFV (Brakerski/Fan-Vercauteren)&lt;/strong> 체계입니다. 이들은 RLWE를 기반으로 하고 있으며 정수의 모듈러 연산(정확한 계산)에 적합합니다.
SIMD (Single Instruction, Multiple Data)와 같은 배칭(Batching) 기술을 지원하고 있어 하나의 거대한 다항식 암호문 속에 수천 개의 데이터 슬롯을 담아 한 번에 병렬 계산할 수 있는 것이 특징입니다.&lt;/p>
&lt;h3 id="제3세대-부트스트래핑의-고속화-gsw-fhew-tfhe">제3세대: 부트스트래핑의 고속화 (GSW, FHEW, TFHE)
&lt;/h3>&lt;p>2013년의 &lt;strong>GSW (Gentry-Sahai-Waters)&lt;/strong> 체계는 FHE의 구조를 보다 단순하게 만들었습니다. 그리고 이를 발전시킨 것이 현재의 주류 중 하나인 &lt;strong>TFHE (Fast Fully Homomorphic Encryption over the Torus)&lt;/strong> 입니다.
TFHE의 특징은 부트스트래핑이 매우 빠르다는(밀리초 단위) 점입니다. 게이트 단위(AND, XOR 등 논리 회로)에서의 연산에 강하며, 암호문의 크기도 비교적 작기 때문에 임의의 논리 회로를 고속으로 평가하는 데 적합합니다.&lt;/p>
&lt;h3 id="제4세대-근사-계산과-기계-학습에의-특화-ckks">제4세대: 근사 계산과 기계 학습에의 특화 (CKKS)
&lt;/h3>&lt;p>2017년 Cheon 등에 의해 제안된 &lt;strong>CKKS (Cheon-Kim-Kim-Song)&lt;/strong> 체계는 현재 AI·기계 학습의 프라이버시 보호에 있어서 결정판이라 할 수 있는 기술입니다.
지금까지의 FHE가 &amp;lsquo;정확한 정수 계산&amp;rsquo;을 고집했던 것에 반해, CKKS는 **&amp;lsquo;부동소수점 수의 근사 계산&amp;rsquo;**을 암호화된 채로 지원합니다. 신경망의 학습이나 추론 등 작은 오차가 허용되는 실수 계산에 있어서 압도적인 성능을 발휘합니다.&lt;/p>
&lt;p>다음 표는 목적별로 어떤 체계를 선택해야 하는지 요약한 것입니다.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">체계 이름&lt;/th>
&lt;th style="text-align:left">특기인 데이터 형&lt;/th>
&lt;th style="text-align:left">권장되는 유스케이스&lt;/th>
&lt;th style="text-align:left">특징&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>BFV / BGV&lt;/strong>&lt;/td>
&lt;td style="text-align:left">정수 (Integer)&lt;/td>
&lt;td style="text-align:left">정확한 통계 계산, 금융 데이터 집계, DB 검색&lt;/td>
&lt;td style="text-align:left">SIMD 배칭에 의한 높은 처리량&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>CKKS&lt;/strong>&lt;/td>
&lt;td style="text-align:left">실수 (Real/Complex)&lt;/td>
&lt;td style="text-align:left">기계 학습 (DNN, 로지스틱 회귀), 신호 처리&lt;/td>
&lt;td style="text-align:left">근사 계산에 의한 고속화, 리스케일링&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>TFHE&lt;/strong>&lt;/td>
&lt;td style="text-align:left">불리언 값 (Boolean)&lt;/td>
&lt;td style="text-align:left">임의의 논리 회로, 문자열 검색, 비선형 함수의 평가&lt;/td>
&lt;td style="text-align:left">초고속 부트스트래핑 (밀리초 대)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="6-실천-fhe-라이브러리와-개념적인-코드">6. 실천: FHE 라이브러리와 개념적인 코드
&lt;/h2>&lt;p>현재는 암호학에 대한 깊은 지식이 없어도 FHE를 이용할 수 있는 오픈소스 라이브러리가 다수 제공되고 있습니다.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Microsoft SEAL (Simple Encrypted Arithmetic Library)&lt;/strong>: BFV, BGV, CKKS를 지원하는 C++ 라이브러리. 업계 표준 중 하나입니다. Python 바인딩인 &lt;strong>TenSEAL&lt;/strong> 이 AI 엔지니어들 사이에서 인기가 있습니다.&lt;/li>
&lt;li>&lt;strong>Zama (Concrete)&lt;/strong>: TFHE를 기반으로 한 프레임워크. Rust/Python으로 작성할 수 있으며 기존의 PyTorch 모델을 컴파일하여 FHE 상에서 구동하는 기능(Concrete ML)을 제공합니다.&lt;/li>
&lt;li>&lt;strong>OpenFHE&lt;/strong>: PALISADE의 후속으로, 모든 주요 체계를 지원하는 포괄적인 C++ 라이브러리입니다.&lt;/li>
&lt;/ul>
&lt;h3 id="python-tenseal-을-이용한-fhe-프로그래밍-예시">Python (TenSEAL) 을 이용한 FHE 프로그래밍 예시
&lt;/h3>&lt;p>여기서는 CKKS 체계를 이용해 암호화된 채로 실수 벡터를 더하고 곱하는 개념적인 Python 코드의 예시를 보여줍니다.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">tenseal&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">ts&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. 컨텍스트 설정 (키 생성 포함)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># CKKS 체계를 사용하며 다항식의 차수를 8192로 설정&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">context&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ts&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">context&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ts&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">SCHEME_TYPE&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">CKKS&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">poly_modulus_degree&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">8192&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">coeff_mod_bit_sizes&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">60&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">40&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">40&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">60&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">context&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">generate_galois_keys&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">context&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">global_scale&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="mi">40&lt;/span> &lt;span class="c1"># 실수의 스케일링 팩터&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. 클라이언트 측: 데이터의 암호화&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">vector1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mf">1.5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">2.5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">3.5&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">vector2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mf">2.0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">3.0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">4.0&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 평문 벡터를 암호문으로 변환 (원래는 클라이언트 측에서 실행)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">enc_v1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ts&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ckks_vector&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">context&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">vector1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">enc_v2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ts&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ckks_vector&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">context&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">vector2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3. 서버 측: 암호화된 채로 수행하는 연산 (Data in Use 보호)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 서버는 평문을 모르지만 덧셈과 곱셈을 실행할 수 있음&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">enc_add&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">enc_v1&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">enc_v2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">enc_mul&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">enc_v1&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">enc_v2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 4. 클라이언트 측: 결과의 복호화&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 비밀키를 가진 클라이언트만이 결과를 볼 수 있음&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">res_add&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">enc_add&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">decrypt&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">res_mul&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">enc_mul&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">decrypt&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;복호화된 덧셈 결과: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">res_add&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 출력 예: [3.5000001, 5.5000001, 7.5000002] (근사 계산이기 때문에 미세한 오차가 포함됨)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;복호화된 곱셈 결과: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">res_mul&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 출력 예: [3.0000002, 7.5000005, 14.0000003]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>위의 코드에서 알 수 있듯이, &lt;code>enc_v1 + enc_v2&lt;/code> 처럼 일반적인 Python의 연산자를 오버로딩하여 직관적으로 암호문끼리의 계산을 작성할 수 있습니다. 서버 측에서는 벡터의 내용을 모른 채로 벡터 연산을 완료하고 있습니다.&lt;/p>
&lt;hr>
&lt;h2 id="7-fhe의-과제-성능과-하드웨어-가속">7. FHE의 과제: 성능과 하드웨어 가속
&lt;/h2>&lt;p>FHE는 이론적으로 완벽한 보안을 제공하지만, 실용화에 있어서 최대의 과제는 **&amp;lsquo;성능의 오버헤드&amp;rsquo;**입니다.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>계산의 오버헤드&lt;/strong>: 평문에서의 계산에 비해 암호문에서의 계산은 CPU 상에서 수천 배~수만 배 느려집니다. 다항식의 곱셈이나 부트스트래핑에는 방대한 FFT(고속 푸리에 변환)나 NTT(수론 변환)의 계산이 필요합니다.&lt;/li>
&lt;li>&lt;strong>데이터 크기의 팽창 (Ciphertext Expansion)&lt;/strong>: 수 바이트의 평문이 암호화되면 수 메가바이트가 될 수 있습니다. 이는 메모리 대역폭이나 네트워크 대역폭을 강하게 압박합니다.&lt;/li>
&lt;/ol>
&lt;h3 id="하드웨어에-의한-해결-접근">하드웨어에 의한 해결 접근
&lt;/h3>&lt;p>이 오버헤드를 극복하기 위해 전 세계에서 FHE 전용 하드웨어 가속기(ASIC, FPGA, GPU 대응)의 개발이 진행되고 있습니다.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>GPU 가속&lt;/strong>: NVIDIA 등의 강력한 GPU를 이용해 NTT 연산이나 부트스트래핑을 병렬화하는 연구가 진행되고 있으며 소프트웨어 구현 대비 수십 배의 고속화가 보고되고 있습니다(예: 100x.ai, Zama의 TFHE-rs CUDA backend).&lt;/li>
&lt;li>&lt;strong>DARPA DPRIVE 프로젝트&lt;/strong>: 미국 국방고등연구계획국(DARPA)은 FHE의 계산 속도를 평문 처리의 실행 속도와 동등한 수준(오버헤드 10배 이내)으로 끌어올리기 위한 전용 하드웨어 개발 프로젝트 &amp;lsquo;DPRIVE (Data Protection in Virtual Environments)&amp;lsquo;를 추진하고 있으며, Intel이나 Microsoft, Intellectual Ventures 등이 참여하고 있습니다.&lt;/li>
&lt;li>&lt;strong>FPU (FHE Processing Unit) 의 등장&lt;/strong>: Cornami나 Optalysys 같은 스타트업이 광 컴퓨팅이나 특수한 실리콘 아키텍처를 이용한 FHE 전용 칩 개발에 나서고 있습니다.&lt;/li>
&lt;/ul>
&lt;p>가까운 미래에 AI에서의 NPU(Neural Processing Unit)처럼 서버나 클라우드 인프라에 &amp;lsquo;FPU&amp;rsquo;가 표준 탑재되는 시대가 올지도 모릅니다.&lt;/p>
&lt;hr>
&lt;h2 id="8-기대되는-유스케이스">8. 기대되는 유스케이스
&lt;/h2>&lt;p>FHE가 실용적인 속도에 도달해가는 지금, 다음과 같은 분야에서의 파괴적 혁신이 기대되고 있습니다.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>의료·유전체 분석의 프라이버시 보호&lt;/strong>:
여러 병원이 가진 환자의 진료 기록이나 DNA 데이터를 FHE로 암호화한 채 클라우드의 AI에게 학습시킴으로써 프라이버시 법(HIPAA나 GDPR)을 위반하지 않고 고정밀 암 진단 모델이나 신약 개발을 진행할 수 있습니다.&lt;/li>
&lt;li>&lt;strong>금융 기관의 부정 탐지·자금 세탁 방지 (AML)&lt;/strong>:
경쟁하는 은행끼리 고객의 계좌 정보나 거래 내역을 밝히지 않고 암호화된 상태로 서로의 데이터를 대조하여 거대한 부정 송금 네트워크를 탐지하는 교차 은행 분석이 가능해집니다.&lt;/li>
&lt;li>&lt;strong>안전한 AI 추론 API (MaaS: Model as a Service)&lt;/strong>:
사용자는 자신의 음성이나 얼굴 이미지, 프롬프트를 암호화하여 AI 서비스(ChatGPT와 같은 LLM 등)에 전송합니다. AI 제공자는 사용자의 입력을 일절 알지 못한 채로 답변을 생성하여 암호문으로 반환합니다. 이를 통해 &amp;lsquo;AI에게 개인 정보가 학습되거나 도난당한다&amp;rsquo;는 우려가 완전히 불식됩니다.&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="9-결론-암호의-미래는-보이지-않는-계산으로">9. 결론: 암호의 미래는 &amp;lsquo;보이지 않는 계산&amp;rsquo;으로
&lt;/h2>&lt;p>1970년대에 공개키 암호(RSA)가 발명되어 인터넷 상의 안전한 통신(HTTPS 등)이 가능해진 것처럼, Craig Gentry에 의한 FHE의 발명은 암호의 역사에 있어서 가장 중요한 이정표 중 하나입니다.&lt;/p>
&lt;p>현재 완전동형암호(FHE)는 연구실의 이론에서 벗어나 Microsoft, IBM, Intel, Google, 그리고 많은 스타트업들이 실용화를 향해 치열하게 경쟁하는 단계에 접어들었습니다. 계산 비용이나 데이터 크기라는 과제는 여전히 존재하지만 알고리즘의 세련화와 하드웨어 가속기의 진화에 의해 무어의 법칙을 뛰어넘는 속도로 성능 향상이 이어지고 있습니다.&lt;/p>
&lt;p>수년 뒤, &amp;lsquo;데이터를 암호화한 채로 계산하는&amp;rsquo; 것은 특별한 일이 아니라 클라우드 서비스에서의 표준적인 데이터 보호 모범 사례가 될 것입니다. FHE는 데이터 주도형 사회에서의 &lt;strong>궁극적인 프라이버시와 데이터 활용의 양립&lt;/strong>을 실현하는 차세대 보안의 핵심입니다.&lt;/p></description></item></channel></rss>