기본 콘텐츠로 건너뛰기

ZKP-4. 영지식 증명: 계산을 다항식 문제로 변환하기

영지식 증명(Zero-Knowledge Proof)의 핵심은 '무언가를 안다’는 사실을, 그 ‘무엇’ 자체는 공개하지 않고 증명하는 것입니다. 이를 실현하기 위해 암호학자들은 아주 독창적인 방법을 고안했습니다. 바로 컴퓨터가 수행하는 복잡한 '계산’을, 간결하고 강력한 '다항식의 관계’로 번역하는 것입니다. 이 번역 과정만 이해하면 영지식 증명의 가장 중요한 원리를 파악할 수 있습니다. 이 문서에서는 간단한 예제를 통해 그 과정을 단계별로 살펴보겠습니다.

우리가 증명하려는 계산은 x³ + x + 5 = 35 입니다. 증명자(Prover)는 이 방정식의 해인 x=3 이라는 비밀값을 알고 있음을 검증자(Verifier)에게 증명하고자 합니다.

1단계: 계산의 평탄화 (Flattening) - 산술 회로로 변환

가장 먼저, 복잡한 계산식을 기본적인 산술 연산(덧셈, 뺄셈, 곱셈)의 연속으로 분해하여 산술 회로(Arithmetic Circuit)로 만듭니다. 각 연산은 하나의 '게이트(gate)'가 됩니다. 이 과정은 컴퓨터가 이해하는 복잡한 로직을 영지식 증명 시스템이 처리할 수 있는 표준화된 형식으로 바꾸는 첫 단계입니다.

x³ + x + 5 식은 다음과 같이 분해할 수 있습니다.

  1. sym_1 = x * x (x²)
  2. sym_2 = sym_1 * x (x³)
  3. sym_3 = sym_2 + x (x³ + x)
  4. ~out = sym_3 + 5 (x³ + x + 5)

이제 x=3 이라는 비밀값을 각 단계에 대입하여 중간 결과값을 계산합니다.

  • x = 3
  • sym_1 = 3 * 3 = 9
  • sym_2 = 9 * 3 = 27
  • sym_3 = 27 + 3 = 30
  • ~out = 30 + 5 = 35

이 산술 회로는 계산의 흐름을 명확하게 보여주는 청사진 역할을 합니다.


위 다이어그램은 각 변수가 게이트를 통해 어떻게 연결되고 변환되는지 시각적으로 보여줍니다.

2단계: R1CS(Rank-1 Constraint System)로 표현

다음으로, 산술 회로의 각 게이트를 R1CS라는 형식의 제약 조건으로 변환합니다. R1CS는 각 제약 조건을 (s · A) * (s · B) - (s · C) = 0 이라는 형태로 표현합니다. 여기서 s는 증인 벡터(witness vector)이고, A, B, C는 각 제약 조건을 정의하는 벡터들이며, '·'는 두 벡터의 내적(dot product)을 의미합니다.

각 제약 조건이 올바르게 충족되었는지 확인하려면, 계산에 사용된 모든 값(비밀 입력값, 중간 결과값, 최종 출력값)을 하나의 긴 목록으로 만들어야 합니다. 이 목록이 바로 증인(witness) 벡터 s입니다. 이는 마치 수학 문제의 '풀이 과정 전체’를 순서대로 적어놓은 것과 같습니다. 증명자는 이 '풀이 과정’을 제출함으로써 계산을 올바르게 수행했음을 증명하는 것입니다.

    s = [~one, x, ~out, sym_1, sym_2, sym_3]

  • ~one은 상수 '1’을 나타내는 가상 변수입니다.
  • x는 비밀 입력값입니다.
  • ~out은 출력값입니다.
  • sym_1, sym_2, sym_3는 중간값입니다.

x=3일 때의 증인 벡터 s는 다음과 같습니다.

     s = [1, 3, 35, 9, 27, 30]

이제 각 게이트를 s와의 내적을 통해 (s · A) * (s · B) - (s · C) = 0 형태로 표현합니다.

게이트 1: sym_1 = x * x

  • A = [0, 1, 0, 0, 0, 0] (x를 선택)
  • B = [0, 1, 0, 0, 0, 0] (x를 선택)
  • C = [0, 0, 0, 1, 0, 0] (sym_1을 선택)
  • 검증: (s · A) * (s · B) - (s · C) = (3) * (3) - (9) = 0

게이트 2: sym_2 = sym_1 * x

  • A = [0, 0, 0, 1, 0, 0] (sym_1을 선택)
  • B = [0, 1, 0, 0, 0, 0] (x를 선택)
  • C = [0, 0, 0, 0, 1, 0] (sym_2를 선택)
  • 검증: (s · A) * (s · B) - (s · C) = (9) * (3) - (27) = 0

게이트 3: sym_3 = sym_2 + x

  • A = [0, 1, 0, 0, 1, 0] (x + sym_2를 선택)
  • B = [1, 0, 0, 0, 0, 0] (1을 선택)
  • C = [0, 0, 0, 0, 0, 1] (sym_3를 선택)
  • 검증: (s · A) * (s · B) - (s · C) = (3 + 27) * (1) - (30) = 0

게이트 4: out = sym_3 + 5

  • A = [5, 0, 0, 0, 0, 1] (5*~one + sym_3를 선택)
  • B = [1, 0, 0, 0, 0, 0] (1을 선택)
  • C = [0, 0, 1, 0, 0, 0] (~out을 선택)
  • 검증: (s · A) * (s · B) - (s · C) = (5 + 30) * (1) - (35) = 0

이렇게 모든 계산 과정을 벡터 연산으로 구성된 제약 조건 시스템으로 변환했습니다.

A
  • [0, 1, 0, 0, 0, 0]
  • [0, 0, 0, 1, 0, 0]
  • [0, 1, 0, 0, 1, 0]
  • [5, 0, 0, 0, 0, 1]
B
  • [0, 1, 0, 0, 0, 0]
  • [0, 1, 0, 0, 0, 0]
  • [1, 0, 0, 0, 0, 0]
  • [1, 0, 0, 0, 0, 0]
C
  • [0, 0, 0, 1, 0, 0]
  • [0, 0, 0, 0, 1, 0]
  • [0, 0, 0, 0, 0, 1]
  • [0, 0, 1, 0, 0, 0]

3단계: R1CS를 QAP(Quadratic Arithmetic Program)로 변환

R1CS는 계산을 여러 개의 개별적인 제약 조건으로 표현합니다. 하지만 수백만 개의 게이트가 있는 복잡한 계산에서는 제약 조건의 수도 그만큼 많아져 하나씩 확인하는 것이 현실적으로 불가능합니다. QAP 변환의 진정한 목적은 이 수많은 벡터 제약 조건들을 단 하나의 다항식 등식으로 '압축’하여, 검증자가 단 한 번의 확인만으로 전체 계산의 정당성을 검증할 수 있게 만드는 데 있습니다. 이를 위해 라그랑주 보간법(Lagrange Interpolation)과 같은 기법을 사용합니다.

각 게이트(1, 2, 3, 4)를 다항식을 평가할 x좌표(예: x=1, x=2, x=3, x=4)로 간주합니다. 그리고 각 변수 위치에 해당하는 다항식을 만듭니다. 예를 들어, A 벡터들의 첫 번째 요소 [0, 0, 0, 5]를 가져와봅시다. 이 값들은 각각 x=1, 2, 3, 4에서의 다항식의 결과값입니다. 즉, (1,0), (2,0), (3,0), (4,5)를 지나는 다항식을 찾는 것입니다.

이 과정을 모든 변수 위치(6개)와 모든 벡터(A, B, C)에 대해 반복하면, 아래와 같은 다항식의 집합을 얻게 됩니다.

  • $A_{polynomials} = [A_1(x), A_2(x), ..., A_6(x)]$
  • $B_{polynomials} = [B_1(x), B_2(x), ..., B_6(x)]$
  • $C_{polynomials} = [C_1(x), C_2(x), ..., C_6(x)]$

이 다항식들은 R1CS 제약 조건을 다항식 형태로 인코딩한 결과물입니다.

4단계: 다항식 결합 및 최종 검증 문제 생성

마지막으로, 3단계에서 만든 다항식들과 증인 벡터 s를 결합하여 단 하나의 다항식 방정식을 만듭니다.

먼저, 각 다항식 집합을 증인 벡터 s와 내적하여 세 개의 대표 다항식 A(x), B(x), C(x)를 만듭니다.

  • $A(x) = s[0]*A_1(x) + s[1]*A_2(x) + ... + s[5]*A_6(x)$
  • $B(x) = s[0]*B_1(x) + s[1]*B_2(x) + ... + s[5]*B_6(x)$
  • $C(x) = s[0]*C_1(x) + s[1]*C_2(x) + ... + s[5]*C_6(x)$

여기서 이 변환 과정의 마법이 드러납니다. 만약 증명자가 올바른 증인 s를 사용했다면, 이 다항식들을 조합한 P(x) = A(x) * B(x) - C(x)는 우리의 모든 제약 조건에 해당하는 지점(x=1, 2, 3, 4)에서 정확히 0이 됩니다. 즉, 증명자의 계산이 올바를 때만 P(x)가 이 특정 지점들에서 0이 되는 것입니다.

다항식이 특정 지점에서 0이 된다는 것은, 그 지점들을 근으로 갖는다는 의미입니다. 즉, P(x)는 (x-1), (x-2), (x-3), (x-4)를 인수로 가져야 합니다. 이 인수들을 모두 곱한 다항식을 타겟 다항식 Z(x)라고 합니다.

    $Z(x) = (x-1)(x-2)(x-3)(x-4)$

따라서, 증명자가 올바른 계산을 수행했다면 아래의 등식이 반드시 성립해야 합니다.

    $A(x) * B(x) - C(x) = H(x) * Z(x)$

여기서 H(x)P(x) / Z(x)의 몫에 해당하는 다항식입니다.

이처럼 복잡한 계산의 정당성을 단 하나의 다항식 관계로 압축하여 증명하는 것이 이 과정의 핵심입니다. 정리하자면, 우리는 'x=3’이라는 구체적인 비밀값을 아는지를 증명하는 문제를, 수많은 제약 조건을 거쳐 최종적으로는 '두 다항식이 특정 관계를 만족하는가’라는 단 하나의 문제로 변환한 것입니다. 이것이 바로 영지식 증명의 정수입니다.

관련 자료

댓글

이 블로그의 인기 게시물

Windows에 AMP와 MediaWiki 설치하기

1. 들어가기     AMP는 Apache + MySQL +  Perl/PHP/Python에 대한 줄임말이다. LAMP (Linux + AMP)라고 하여 Linux에 설치하는 것으로 많이 소개하고 있지만 Windows에서도 간편하게 설치하여 사용할 수 있다.       이 글은 Windows 7에 Apache + MySQL + PHP를 설치하고 그 기반에서 MediaWiki를 설치하여 실행하는 과정을 간략히 정리한 것이다. 2. MySQL     * 버전 5.6.12     1) 다운로드         http://dev.mysql.com/downloads/installer/         MySQL Installer 5.6.12         Windows (x86, 32-bit), MSI Installer         (mysql-installer-web-community-5.6.12.0.msi)     2) 다운로드한 MSI 파일을 더블클릭하여 설치를 진행한다.           설치 위치:                   C:\Program Files\MySQL               선택 사항:                       Install MySQL Products             Choosing a Se...

MATLAB Rutime 설치하기

MATLAB Rutime 설치하기 미설치시 에러 MATLAB Runtime 을 설치하지 않은 환경에서 MATLAB 응용프로그램이나 공유 라이브러리를 사용하려고 하면 아래와 같은 에러 메시지가 표시될 것입니다. 처리되지 않은 예외: System.TypeInitializationException: 'MathWorks.MATLAB.NET.Utility.MWMCR'의 형식 이니셜라이저에서 예 외를 Throw했습니다. ---> System.TypeInitializationException: 'MathWorks.MATLAB.NET.Arrays.MWArray'의 형식 이니셜라이저에서 예외를 Throw했습니다. ---> System.DllNotFoundException: DLL 'mclmcrrt9_3.dll'을(를) 로드할 수 없습니다. 지정된 모듈을 찾을 수 없습니다. (예외가 발생한 HRESULT: 0x8007007E) 위치: MathWorks.MATLAB.NET.Arrays.MWArray.mclmcrInitialize2(Int32 primaryMode) 위치: MathWorks.MATLAB.NET.Arrays.MWArray..cctor() --- 내부 예외 스택 추적의 끝 --- 위치: MathWorks.MATLAB.NET.Utility.MWMCR..cctor() --- 내부 예외 스택 추적의 끝 --- 위치: MathWorks.MATLAB.NET.Utility.MWMCR.processExiting(Exception exception) 해결 방법 이 문제를 해결하기 위해서는 MATLAB Runtime 을 설치해야 합니다. 여러 가지 방법으로 MATLAB Runtime 을 설치할 수 있습니다. MATLAB 이 설치되어 있는 경우에는 MATLAB 설치 폴더 아래에 있는 MATLAB Runtime 설치 프로그램을 실행하여 설치합니다. ...

Wi-Fi 카드 2.4GHz로만 동작시키기

Wi-Fi 카드 2.4GHz로만 동작시키기 별도의 Wi-Fi AP 장치를 두지 않고 아래와 같은 기기들로만 Wi-Fi 네트워크를 구성하고자 할 때 주변 기기들이 2.4GHz만 지원하기 때문에 PC에서 실행하는 AP가 항상 2.4GHz를 사용하도록 Wi-Fi 카드를 설정해 주어야 합니다. 기기 Wi-Fi 카드 주파수 대역 Wi-Fi Direct 지원 PC (Windows 10) 2.4GHz, 5GHz O 주변 기기들 2.4GHz X Wi-Fi 카드별 주파수 대역 선택 방법 Windows 시작 메뉴에서 설정 을 클릭합니다. Windows 설정 화면에서 네트워크 및 인터넷 을 클릭합니다. 설정 화면의 왼쪽 메뉴바에서 Wi-Fi 를 클릭합니다. 화면 오른쪽 관련 설정 구역에 있는 어댑터 옵션 변경 을 클릭합니다. 설정을 바꾸고자 하는 Wi-Fi 카드 항목을 선택하고 마우스 오른쪽을 누른 다음 속성 메뉴를 클릭합니다. 대화상자의 네트워킹 탭 화면에 있는 구성 버튼을 클릭합니다. 장치 속성 대화상자의 고급 탭 화면으로 이동합니다. 제시되는 속성 항목들은 제품별로 다르며 자세한 사항은 아래의 제품별 설명을 참고하여 값을 설정하시기 바랍니다. Intel Dual Band Wireless-AC 7265 기술 사양 주파수 대역: 2.4GHz, 5GHz 무선 표준: 802.11ac 주파수 대역 선택 장치 속성 대화상자에서 아래와 같이 선택합니다. Wireless Mode 1. 802.11a => 5GHz 4. 802.11b/g => 2.4GHz (이 항목 선택) 6. 802.11a/b/g => 2.4GHz, 5GHz Intel Dual Band Wireless-AC 8265 기술 사양 주파수 대역: 2.4GHz, 5GHz 무선 표준: 802.11ac 주파수 대역 선택 장치 속성 대화상자에서 아래와 같이 ...