개요
영지식 증명은 어떤 명제가 참임을 설득하면서도 그 근거가 되는 비밀은 끝까지 숨기는 절차를 말함 블록체인과 프라이버시 보존 컴퓨팅에서 핵심 도구로 자리 잡았고 범용 계산의 유효성을 작은 증명으로 압축해 전달하는 현대 프로토콜의 기초로 쓰임 이 글은 기본 개념과 직관, 수학적 성질, 대화형과 비대화형의 차이, 디지털 서명과의 구분, 이산로그 기반 간단 Σ-프로토콜까지 한 번에 정리함
목적과 맥락
- 비밀을 공개하지 않고 유효성만 검증하려는 요구 증가
- 퍼블릭 블록체인에서 데이터 비공개 유지와 정합성 보장 필요 확대
- 오프체인 연산을 온체인에 작은 증명으로 제출해 확장성과 비용 개선 추구
핵심 개념과 정의
- Prover 비밀을 가진 참여자. 비밀을 공개하지 않고 명제의 참을 설득하려는 주체
- Verifier 검증자. Prover가 비밀을 가진 사실 또는 명제가 참이라는 사실만 확인하려는 주체
- Witness 또는 Secret 명제의 참을 뒷받침하는 비밀 값 또는 비밀 지식
- Statement 공개 가능한 명제 표현. 예 y = g^x mod p에서 x를 알고 있음을 증명
- Challenge 검증자가 제시하는 무작위 도전값. 조작 불가와 예측 불가가 전제
- Transcript 또는 View 대화형 상호작용의 기록. 시뮬레이터가 동일 분포로 재현 가능해야 영지식 성립
영지식 증명의 세 가지 성질
- 완전성 Completeness 정직한 Prover가 비밀을 가지고 있으면 정직한 Verifier는 높은 확률로 설득됨
- 건전성 Soundness 비밀이 없으면 Prover가 속일 확률이 매우 낮음. 도전 공간 확대나 반복으로 속임 확률을 지수적으로 낮춤
- 영지식성 Zero-Knowledge Verifier는 명제가 참이라는 사실 외 추가 정보를 얻지 못함. 시뮬레이터가 실제와 구별 불가한 트랜스크립트를 비밀 없이 생성 가능해야 함
직관적 예시 알리바바 동굴
- 동굴의 두 갈래 A와 B 사이를 가로막는 문이 있고 비밀 주문을 알면 반대편으로 넘어올 수 있음
- 검증자는 Prover가 들어간 뒤 무작위로 A 또는 B로 나오라고 요구함
- Prover가 주문을 모르면 자신이 들어간 쪽을 요구받을 때만 성공 가능. 1회 성공 확률 1/2
- k회 독립 반복하면 모두 속일 확률 2^-k로 급감
- 검증자는 주문 내용은 모르지만 Prover가 주문을 안다는 사실만 높은 확률로 확신 가능함
핵심 포인트
- 비밀 노출 없이 유효성만 확인 가능
- 무작위 도전과 반복으로 사기 가능성 급감
- 대화 기록만으로 비밀 자체를 유추 불가
형식적 관점과 시뮬레이터
- 대화형 증명은 Prover P와 Verifier V가 커밋-챌린지-리스폰스 구조로 상호작용함
- Transcript는 도전값과 응답 및 공개 상태를 포함하는 관찰 기록을 의미함
- 영지식성은 시뮬레이터 S가 비밀 없이도 실제와 분포가 같은 Transcript를 생성할 수 있음을 요구함
- 의미는 검증자가 얻은 정보가 공개 난수로도 재현 가능한 수준에 한정됨을 보장한다는 것임
사전 공모 이슈와 설계 포인트
- 대화형 프로토콜에선 검증자와 Prover가 사전 공모했다면 제3자는 배제 불가 이슈가 생김
- 이 경우를 지정 검증자 영지식 designated-verifier ZK로 분류 가능
- 공개 검증이 필요하면 비대화형 영지식 NIZK 또는 공개 검증 가능한 Σ-프로토콜 조합을 사용해 누구나 검증 가능하게 설계 필요
- Fiat–Shamir 변환으로 도전값을 해시로 결정하면 제3자도 단일 증명을 검증 가능
- 운영 시 검증자의 내부 시드나 도전값 생성 과정을 과도하게 공개하면 지정 검증자 시나리오의 영지식성이 약화될 수 있음
대화형과 비대화형
- 대화형 Interactive 실시간으로 도전과 응답을 주고받는 구조. 장점은 단순성과 강한 보안 모델. 단점은 왕복 상호작용과 제3자 설득 한계 가능
- 비대화형 Non-Interactive 하나의 짧은 증명을 생성해 누구나 검증. Fiat–Shamir로 대화형 도전을 해시로 대체. SNARK와 STARK 등에서 표준 사용
- 트레이드오프 네트워크 왕복 제거와 공개 검증 가능성 vs 해시를 랜덤 오라클로 보는 가정과 경우에 따라 신뢰 설정 필요
디지털 서명과의 차이
- 신원 노출 서명은 공개키로 서명자 신원이 구조적으로 드러남. ZK는 신원과 비밀 모두 숨기고 유효성만 증명 가능
- 제3자 설득 서명은 메시지-서명 쌍을 누구나 검증 가능해 완전 설득 지향. ZK도 NIZK나 공개 검증 가능한 구성에선 제3자 설득 가능. 다만 지정 검증자 ZK에선 제3자 설득이 제한됨
- 프록시 릴레이 공격 대화형 식별 프로토콜은 중간자 릴레이 공격 위험 존재. 세션 바인딩과 채널 인증, 도전값 바인딩으로 완화 필요. 서명은 보통 프로토콜 레벨 인증과 채널 보안으로 대응
- 연결 고리 Σ-프로토콜에 Fiat–Shamir를 적용하면 서명 스킴으로 전환 가능. 대표가 Schnorr 서명임
ZKP Under the Hood 이산로그 기반 Σ-프로토콜
가장 고전적인 지식증명은 이산로그 가정 위에서 동작함 공통 입력 y = g^x mod p에서 x가 비밀이며 Prover는 x를 안다는 사실을 증명함
기본 설정
- 큰 소수 p와 생성원 g를 가진 소수 차수 q 부분군 선택. 연산은 지수에서 mod q로 수행
- 공통 값 y = g^x mod p는 공개. x는 Prover만 아는 비밀
1비트 챌린지 버전 직관
- 커밋 Prover가 임의의 r를 뽑아 C = g^r mod p 전송
- 챌린지 Verifier가 z ∈ {0,1} 전송
- 응답 z = 0이면 r 공개. z = 1이면 s = r + x mod q 공개
- 검증 z = 0이면 g^r ≟ C 확인. z = 1이면 g^s ≟ C · y 확인
- Prover가 x를 모르면 두 경우를 동시에 만족시키는 응답을 준비 불가. 1회 속임 확률 1/2. k회 반복 시 2^-k로 감소
일반화된 Schnorr 식별 프로토콜
- 도전값 c를 Z_q에서 무작위 선택
- 커밋 C = g^r
- 응답 s = r + c·x mod q
- 검증 g^s ≟ C · y^c
- 비대화형으로는 c = H(domain, context, g, y, C)로 정하고 단일 증명을 생성함. 여기서 H는 도메인 분리와 컨텍스트 바인딩을 포함한 해시 함수이며 랜덤 오라클 가정 하에서 분석함
주의사항
- 안전한 구현은 군 차수 q 기준으로 지수 연산 수행 필요
- r은 CSPRNG로 매 증명마다 새로 생성. r 재사용은 즉시 비밀 유출로 이어짐
- 해시 입력엔 도메인 분리 태그와 세션 ID, 검증자 식별 등 컨텍스트를 바인딩해 재생 공격과 교차 프로토콜 간섭을 방지 필요
간단 검증 스니펫 예시
아래는 원리 전달용 최소 형태임. 실제 구현에선 안전한 군 선택, 상수시간 연산, 에러 처리 포함 필요
## 공개 파라미터 p, g, y와 커밋 C, 도전 z, 응답 resp를 검증하는 예시
def verify_one_bit(p, g, y, C, z, resp):
if z == 0:
## resp == r
return pow(g, resp, p) == C
else:
## resp == s = r + x mod q
return pow(g, resp, p) == (C * y) % p
def verify_schnorr(p, g, y, C, c, s):
## 일반형 검증식 g^s == C * y^c mod p
left = pow(g, s, p)
right = (C * pow(y, c, p)) % p
return left == right
확률적 보장과 파라미터 선택
- 1회 속임 확률은 1 / |ChallengeSpace| 임
- 1비트 도전이면 1/2. k회 독립 반복 시 2^-k로 수렴
- NIZK나 공개 검증에서는 도전 공간을 128비트 이상으로 설정해 단일 증명으로 충분한 사운드니스 확보 권장
- 블록체인 환경에서는 검증 비용과 증명 크기, 사운드니스 비트를 함께 고려해 회로 크기와 파라미터를 선택 필요
설계 포인트와 운영 수칙
- 그룹과 곡선 선택 secp256k1, P-256, BLS12-381, Bandersnatch, ristretto255 등 표준 계열 우선 고려
- 난수 생성 CSPRNG 필수. 커밋 nonce r 재사용 금지. 시스템 RNG 품질 모니터링 필요
- 파라미터 바인딩 도전 해시에 프로토콜 식별자, 세션 ID, 검증자 식별 또는 채널 특성 포함해 세션 고정 효과 확보
- 트랜스크립트 관리 지정 검증자 시나리오에서는 불필요한 내부 난수 공개를 줄임. 공개 검증 목표면 처음부터 NIZK 또는 SNARK류 선택
- 부채널 대응 타이밍 누수와 캐시 기반 누수에 대비해 상수시간 구현과 블라인딩 적용
- 리플레이 및 릴레이 방지 세션 바인딩, nonce, 타임스탬프, 채널 인증 적용
- 회귀 방지 회로나 명세 변경 시 검증 규칙에 대한 테스트 자동화와 호환성 체크 필요
SNARK vs STARK vs Bulletproofs 한눈 비교
| 항목 | SNARK | STARK | Bulletproofs |
|---|---|---|---|
| 설정 | 일부 시스템 신뢰 설정 필요. Plonk류는 범용 SRS 가능 | 투명 설정. 신뢰 설정 불요 | 신뢰 설정 불요 |
| 증명 크기 | 매우 작음 수십 바이트 수준까지 가능 | 비교적 큼 수십 KB 이상 | 로그 크기. 범위증명은 수 KB 수준 |
| 검증 비용 | 빠름. 온체인 친화적 | 보통에서 빠름. 해시 중심 | 검증 비용 큼. 집계로 완화 가능 |
| 보안 가정 | 페어링과 다항식 약속 등 수학적 가정 | 해시 기반 IOP와 FRI. 포스트 양자 내성 기대 | 내적 논증 기반. 일반군 가정 |
| 활용 예 | zkEVM, 롤업, 영지식 브리지 | 투명한 롤업, 대규모 추적 증명 | 범위증명, UTXO 프라이버시 |
각 계열의 실제 성능은 구현과 회로 구조, 하드웨어에 크게 의존함
블록체인 적용 예
- 잔액과 금액을 숨긴 비공개 전송과 감사 가능성 확보
- 신원 속성 최소 공개 KYC 예 나이 이상 여부만 증명
- 영지식 롤업 상태 전개 증명과 데이터 가용성 보완
- 오라클 입력의 유효성 증명과 오프체인 계산 검증
- MPC와 결합한 다자 프라이버시 계산의 결과 정합성 증명
자주 묻는 질문
- ZK면 항상 제3자 설득 불가임? 아님. NIZK나 공개 검증 가능한 구성에선 누구나 검증 가능함
- STARK는 포스트 양자 보안 보장임? 양자에 대해 알려진 공격이 약하다는 의미의 내성 기대 수준임. 수학적 증명된 보장은 아님
- 왜 r 재사용이 위험함? 서로 다른 도전에 같은 r을 쓰면 x가 선형식으로 노출됨
- 왜 q 모듈러를 강조함? 안전한 지수 연산의 정의역은 군 차수 q이기 때문임. p-1 전역 모듈러는 안전하지 않을 수 있음
검증과 회귀 방지 체크리스트
- 사운드니스 목표 비트와 도전 공간이 요구 수준 충족하는지 점검
- 난수 생성 모듈 품질과 시드 관리 상태 감사
- 도메인 분리 태그와 세션 ID가 해시 입력에 포함되는지 확인
- 재생 공격과 프록시 릴레이 가능성에 대한 테스트와 채널 인증 적용
- 상수시간 연산 준수 여부와 메모리 접근 패턴 누수 점검
- 회로 변경 시 검증 규칙 스냅샷과 회귀 테스트 자동화
마무리
영지식 증명은 비밀을 드러내지 않고도 유효성을 설득하는 체계임 완전성-건전성-영지식성의 삼각을 이해하고 대화형과 비대화형의 차이를 파악하면 설계 선택이 명확해짐 실무에서는 안전한 군 선택과 난수, 도전 공간 크기, 세션 및 채널 바인딩, 신뢰 설정과 부채널 대응을 종합적으로 관리 필요 목표는 비밀을 지키면서도 누구나 또는 지정된 상대가 납득할 수 있는 검증 가능한 시스템을 만드는 것임
참고 링크
- https://en.wikipedia.org/wiki/Zero-knowledge_proof
- https://en.wikipedia.org/wiki/Interactive_proof_system
- https://en.wikipedia.org/wiki/Schnorr_identification
- https://en.wikipedia.org/wiki/Fiat%E2%80%93Shamir_heuristic
- https://en.wikipedia.org/wiki/SNARK
- https://en.wikipedia.org/wiki/STARK_(cryptography)
- https://en.wikipedia.org/wiki/Bulletproofs
- https://hyun-jeong.medium.com