Fiat-Shamir Transformation

본 글에서는 임의의 public-coin IP 프로토콜 L\mathcal L 을 non-interactive, publicly verifiable한 프로토콜 Q\mathcal Q 로 변환하는, Fiat-Shamir Transformation에 대해 알아보겠습니다.

이 때 Public-coin protocol이란 Verifier의 모든 randomness가 Prover에게 공개되는 IP 시스템을 말합니다. 이러한 프로토콜은 대체로 V\mathcal VP\mathcal P에게 random challenge 를 보내고 P\mathcal P는 그것에 답하는 형식으로 이루어 집니다. 이번 장에서 배울 Fiat-Shamir Transform을 적용하면 해당 IP 증명을 공개적으로 검증가능한 하나의 transcript로 간소화할 수 있습니다.

Random Oracle Model

Random Oracle Model (ROM) 이란 진짜 random function과 구별할 수 없는 Cryptographic hash function RR이 존재한다는 가정입니다. Prover와 Verifier는 모두 RRxx를 쿼리해 R(x)R(x) 값을 얻을 수 있습니다. 이 때 RR은 한번 쿼리한 xx에 대해서는 같은 결과값 R(x)R(x)를 출력한다는 점에서 consistent 하며, 한번도 쿼리되지 않은 xx에 대해선 uniform random한 R(x)R(x) 값을 리턴합니다.

이러한 Random Oracle Model을 가정하는 이유는 일반적인 Cryptographic hash function의 가정으로 안전성이 증명되지 않는 프로토콜을 ROM 하에서 hash function이 완전히 random 하다는 가정으로 안전성을 증명하기 위함입니다.

ROM 가정은 현실 세계와는 거리가 있는데, R:{0,1}in{0,1}outR: \{0,1\}^{\ell_{in}} \to \{0,1\}^{\ell_{out}} 으로 놓으면 랜덤 함수 RR을 저장하는 데에만 2inout2^{\ell_{in}}\cdot\ell_{out} 비트가 필요하게 됩니다. 그러나 현실에서는 2in22562^{\ell_{in}}\ge 2^{256} 정도로 큰 값을 사용하기에 이를 구현하기에 무리가 있습니다. 또한, ROM 하에서 안전성이 증명되었다고 real world에서 안전성이 증명되는 것은 아닙니다. 이와 관련된 반례를 다음 논문에서 찾아볼 수 있습니다. [CGH04] 그럼에도 ROM을 사용하는 것은 아직까지 ROM 가정 하에 안전성이 증명되었으나 뚫린 프로토콜 중 현실에서 사용되는 것은 없으며, ROM과 같은 강한 가정 하에서라도 안전성의 증명이 있는것이 낫기 때문입니다.

Motivation

우리는 어떻게 public-coin IP를 non-interactive, publicly verifiable한 증명으로 변환할 수 있을까요? 가장 naive한 접근은, Prover P\mathcal P에게 모든 random challenges와 transcript 작성을 맡기는 것입니다. 그러면 Verifier V\mathcal VP\mathcal P와 interact할 필요 없이, 주어진 transcript에 적힌 random challenges에 대해 올바른 답이 적혀있는지만 검사하면 됩니다. 그러나 이 방법의 문제점은 P\mathcal P가 untrusted 이므로 P\mathcal P가 제시한 random challenges가 실제 uniform random하게 뽑힌 것인지 확인할 수 없다는 점입니다.

이를 개선하기 위해 random challenge를 random oracle RR을 이용해 ii번째 랜덤 값을 ri=R(i)r_i=R(i) 와 같은 방법으로 뽑아보겠습니다. 우리는 ROM을 가정했기 때문에 V\mathcal Vri=?R(i)r_i\stackrel{?}{=}R(i) 인지만 확인하면 rir_i가 uniform random 값이라는 것을 확인할 수 있습니다. 그러나 이 방법 또한 unsound 합니다! 그 이유는 P\mathcal P 가 메세지 g1,,gig_1,\cdots,g_i를 보내기 전에 challenge r1,,rir_1,\cdots,r_i를 알고 있으므로 해당 challenge를 만족하도록 gig_i 를 조작한 뒤 보낼 수 있기 때문입니다. 예시로 P\mathcal P가 다항식 g1(X),s(X)g_1(X), s(X)에 대해 g1(r1)=s(r1)g_1(r_1)=s(r_1)임을 확인함으로써 g1=sg_1=s 임을 증명하는 프로토콜을 생각해보겠습니다. 이 때 P\mathcal Pr1=R(1)r_1=R(1) 값을 오라클에 쿼리함으로써 미리 알 수 있기 때문에 false g1g_1을 다음과 같이 설정할 수 있습니다:

g1(X)=s(r1)+(Xr1)h(X)g_1(X)=s(r_1)+(X-r_1)h(X)

(h(X)0h(X)\neq 0는 임의의 다항식). 이 경우 g1sg_1\neq s이지만 g1(r1)=s(r1)g_1(r_1)=s(r_1) 임으로 false proof가 accept 되게 됩니다.

이를 해결하는 방법은 V\mathcal V의 challenge rir_iP\mathcal P의 input g1,,gig_1,\cdots,g_i에 의존하는 점에서 random oracle을 이용해 rir_i를 뽑는 것입니다. 이렇게 하면 P\mathcal Pgig_i를 조작하면 그에 따라 challenge rir_i도 uniform random한 다른 값으로 바뀌므로 위와 같은 공격이 불가능하게 됩니다.

Fiat-Shamir transformation

Fiat-Shamir transformation의 완전한 construction은 다음과 같습니다:

public-coin IP L\mathcal L의 round ii에서 P\mathcal P가 보낸 메세지 gig_i에 대해 V\mathcal V가 random challenge rir_i를 보낸다고 가정하겠습니다. Fiat-Shamir Transform을 적용한 프로토콜 Q\mathcal Q 에서, P\mathcal P 는 challenge r1,,rl1r_1,\dots,r_{l-1} 에 대해 계산된 g1,,glg_1,\dots,g_l 이 포함된 하나의 transcript를 보냅니다. 이 때, round ii의 challenge ri=R(x,g1,,gi)r_i=R(x,g_1,\dots,g_i) (xx는 프로토콜의 public-input) 로 random oracle에 쿼리한 값을 사용합니다. 이렇게 변환된 Q\mathcal Q는 non-interactive하며, random oracle RR에 쿼리할 수 있는 누구나 공개적으로 검증할 수 있습니다.

Notes

실제 구현에선 random oracle RR으로 적당한 cryptographic hash function을 이용합니다. 또한 계산량을 줄이기 위해 hash chaining이라는 테크닉을 사용하는데, rir_i를 계산할 때 한번에 g1,,gig_1,\dots,g_i를 해시하는 것이 아니라 이전 라운드의 ri1r_{i-1} 값을 써서 ri=R(x,i,ri1,gi)r_i=R(x,i,r_{i-1},g_i) 와 같이 계산합니다. 이러한 구현 방법도 random oracle model 하에서 secure함이 증명 가능합니다.

또 하나 중요한 디테일은, 각 라운드의 challenge rir_i에 프로토콜의 input xx가 같이 해시되어야 한다는 점입니다. 이렇게 rir_ixx를 포함해 해시하는 것을 strong Fiat-Shamir, 그렇지 않은 것을 weak Fiat-Shamir라고 부릅니다. 이러한 weak Fiat-Shamir는 false proof를 forge 할 수 있게되는 Frozen Heart 취약점을 일으킵니다. 예시로, input xFnx\in\mathbb F^n에 대해 C(x)=yC(x)=y 를 증명하는 GKR 프로토콜에 weak Fiat-Shmair를 적용한 것을 생각해보겠습니다. GKR 프로토콜의 마지막 라운드에서 우리는 input layer의 xx에 대해 그 MLE x~\tilde x 가 어떤 random point rr과 값 mm에 대해 x~(r)=m\tilde x(r)=m 임을 확인했습니다. 그러나 이 경우 xx가 challenge rr에 independent 하므로, 우리는 rrmm 값을 미리 계산한 뒤 input xx를 조작해 x~(r)=m\tilde {x}'(r)=m 을 만족하는 다른 xx'을 찾을 수 있습니다. 해당 취약점에 대한 설명은 다음 블로그를 참고하세요. [1] [2]

Security

Sound한 public-coin IP I\mathcal I에 대해, 그것을 Fiat-Shamir로 변환한 non-interactive proof Q\mathcal Q는 sound 할까요? 답은 그렇지 않을 수 있다입니다. (이것은 Fiat-Shamir가 만능이 아니라는 것을 시사해줍니다.) 우리는 변환된 Q\mathcal Q가 sound하게 되는 증명된 두 개의 (I\mathcal I에 대한) 조건을 살펴보겠습니다.

Round-by-round soundness

먼저, I\mathcal Iround-by-round soundness 성질을 만족시키면 Q\mathcal Q 또한 (ROM 하에서) sound 합니다. 이 때 round-by-round soundness란 다음 세 성질을 만족할 때 성립합니다:

  1. I\mathcal I의 모든 라운드에서 지금까지의 transcript에 의존하는 잘 정의된 state가 존재합니다. 이 때 "doomed" 상태라는게 존재하는데, 한번 doomed된 프로토콜은 (negligible한 확률을 제외하고) 영원히 doomed 상태를 유지하게 됩니다.

  2. false input xx에 대해서 I\mathcal I의 초기 상태는 doomed 여야 합니다.

  3. 만약 interaction이 끝날때 doomed 상태이면 검증자가 reject 합니다.

Sum-check 프로토콜을 예시로 생각해보면, 각 라운드마다 gj1(rj1)=gj(0)+gj(1)g_{j-1}(r_{j-1})=g_j(0)+g_j(1) 와 같은 관계식이 성립하는지 확인하고 한번이라도 reject되면 전체 프로토콜을 reject 하므로 round-by-round soundness를 만족한다는 것을 알 수 있습니다. 더 나아가 [CCH+19] 논문은 sum-check를 기반으로 한 모든 IP가 round-by-round soundness 하다는 것을 증명하였습니다. 따라서 이전 블로그에서 다룬 GKR 프로토콜 또한 Fiat-Shamir를 적용해도 (물론 ROM 가정 하에) 안전합니다.

Constant-round 인 경우

두번째로, I\mathcal I가 sound한 constant-round IP 이면 Q\mathcal Q 또한 sound 합니다. 여기에 대한 암호학적인 증명을 살펴보겠습니다.

Theorem 5.1. I\mathcal{I}negligible한 soundness error를 갖는 constant-round public-coin IP (또는 argument) 라고 하자. 그러면 ROM 하에서 I\mathcal{I}에 Fiat-Shamir 변환을 적용하여 얻은 Q\mathcal{Q} 또한 negligible한 (computational) soundness error를 갖는다.

Proof. 이 증명은 귀류법과 함께 proof by reduction을 사용합니다. 만약 변환된 프로토콜 Q\mathcal{Q}를 깰 수 있는 공격자 PFS\mathcal{P}_{FS}가 존재한다면, 이를 이용해 원래 프로토콜 I\mathcal{I}를 깨는 공격자 P\mathcal{P}^*를 만들 수 있음을 보입니다. 그러나 가정에 의해 이는 모순이므로 증명이 끝이 납니다.

먼저 증명을 간단히 하기 위해, I\mathcal{I}를 증명자가 먼저 말하는 3-메시지 프로토콜이라고 가정합니다. 메시지 형태는 (α,β,γ)(\alpha, \beta, \gamma)입니다. (α\alpha: P\mathcal P의 첫 메시지, β\beta: V\mathcal V의 random challenge, γ\gamma: P\mathcal P의 응답) 이제 false input xx에 대해 시간 TT 안에 Q\mathcal{Q}의 검증자를 non-negligible한 확률 ϵ\epsilon으로 통과시키는 악의적인 증명자 PFS\mathcal{P}_{FS}가 존재한다고 가정합니다. 일반성을 잃지 않고 PFS\mathcal{P}_{FS}는 랜덤 오라클 RR에 정확히 TT번의 서로 다른 쿼리를 하며, random challenge β=R(x,α)\beta=R(x, \alpha)는 반드시 이 TT번의 쿼리 중에 포함되어 있다고 가정합니다.

P\mathcal{P}^*의 구성: 우리는 PFS\mathcal{P}_{FS}를 내부 subroutine으로 실행시켜서, 원본 프로토콜 I\mathcal{I}의 실제 검증자 V\mathcal{V}를 속이는 증명자 P\mathcal{P}^*를 다음과 같이 구성합니다. (이 과정이 proof by reduction의 핵심입니다. 이러한 증명에 익숙해지고 싶으시면 Katz & Lindell 교재를 보시는 것을 추천드립니다.)

  1. P\mathcal{P}^*i{1,,T}i \in \{1, \dots, T\} 중 하나를 무작위로 선택합니다. (이는 PFS\mathcal{P}_{FS}가 보낼 (x,α)(x,\alpha) 쿼리가 몇 번째일지 맞히는 것입니다.)

  2. P\mathcal{P}^*PFS\mathcal{P}_{FS} 를 실행시키며 PFS\mathcal{P}_{FS} 가 랜덤 오라클에 쿼리할 때 마다 다음 규칙으로 대신 응답해줍니다.

    • 1i11 \dots i-1 번째 쿼리: PFS\mathcal{P}_{FS}가 쿼리한 값을 그대로 랜덤 오라클에 쿼리해서 응답합니다.

    • ii 번째 쿼리: PFS\mathcal{P}_{FS}(x,α)(x, \alpha)를 쿼리 하면, P\mathcal{P}^*는 이 α\alpha외부의 실제 검증자 V\mathcal{V}에게 첫 메시지로 전송합니다. V\mathcal{V}α\alpha에 대한 random challenge β\beta를 보내오면, P\mathcal{P}^*는 이 β\beta를 마치 랜덤 오라클의 응답인 것처럼 PFS\mathcal{P}_{FS}에게 전달합니다. (만약 쿼리가 (x,α)(x,\alpha) 가 아니라면 ii 값을 맞추지 못한 것이므로 종료합니다.)

    • i+1Ti+1 \dots T 번째 쿼리: 다시 랜덤 오라클에 쿼리해 응답합니다.

  3. PFS\mathcal{P}_{FS}가 최종 transcript (α,β,γ)(\alpha, \beta, \gamma)를 출력하면, P\mathcal{P}^*γ\gammaV\mathcal{V}에게 마지막 응답으로 보냅니다.

이제 P\mathcal P^*가 성공할 확률 ϵ\epsilon^*을 구해보겠습니다. P\mathcal P^* 가 무작위로 선택한 ii에 대해 정확히 ii 번째 쿼리가 (x,α)(x,\alpha) 가 되면 P\mathcal P^* 는 항상 성공함을 알 수 있습니다. 이 때 ii 값을 맞출 확률은 1/T1/T 이므로, ϵϵ/T\epsilon^* \ge \epsilon/T 가 성립합니다. ϵ\epsilon은 non-negligible이고 TT는 다항시간이므로 ϵ\epsilon^* 또한 non-negligible 합니다. 즉, 우리는 false input xx에 대해 기존의 IP I\mathcal I를 non-negligible한 확률로 통과하는 증명자 P\mathcal P^* 를 만들었습니다. 이는 가정에 모순이므로, Q\mathcal Q를 다항시간에 깨는 공격자 PFS\mathcal P_{FS}는 존재하지 않습니다.  \ \square

Conclusion

이번 블로그에서는 Fiat-Shamir를 이용해 public-coin IP를 non-interactive, publicly verifiable한 증명으로 변환하는 방법을 알아보았습니다. 그러나 그 구현과 조건에 따라 취약점이 발생할 수 있다는 것을 이해해야 합니다. 감사합니다.

Last updated