参考资料:
软件工程里的 Code Obfuscation(字符替换、加入冗余、汇编语言,使代码可读性差),严格意义上并不是好的混淆,因为人眼区分不出来的程序,并不意味着任意的 PPT 敌手(计算机程序)无法区分。事实上,使用反汇编工具,立即可以得到可读性不错的 C 代码。
密码学中的定义为:Virtual Black Box Obfuscation(虚拟黑盒混淆,VBB),一个 Obfuscator 将电路 C C C 混淆为 O ( C ) \mathcal O(C) O(C),就如同封装在了一个黑盒 Oracle 里,唯一可做的就是输入 x x x 输出 C ( x ) C(x) C(x),并且无法获得关于 C C C 的其他信息。
当然,如果电路的输出本身就包含电路的信息(例如它打印自己的代码),那么混淆是无意义的,这种电路称为 Learnable Program。VBB 仅用于混淆 Unlearnable 的电路。但是 BGI+01 证明:存在一族 Unlearnable 的电路 C ∗ C^* C∗,那么任意的 Obfuscator 都无法混淆它的某个属性,但如果放入 Oracle 则可以隐藏这个属性。也就是说:通用 VBB 不存在(VBB Impossibility Result)。
BGI+01 提出了一种新的定义:Indistinguishability Obfuscation(不可区分混淆),一个 Indistinguishability Obfuscator 将两个相同功能的电路 C 1 , C 2 C_1,C_2 C1,C2 混淆为 i O ( C 1 ) , i O ( C 2 ) i\mathcal O(C_1),i\mathcal O(C_2) iO(C1),iO(C2),使得敌手无法区分这两个电路。
现在,我们给出不可区分混淆的正式定义:一个 uniform PPT 的机器 i O i\mathcal O iO 称为关于电路簇 { C λ } \{\mathcal C_\lambda\} {Cλ} 的一个不可区分混淆器(indistinguishability obfuscator),如果它满足
功能性保持(Functionality Preserving):对于任意的 λ ∈ N \lambda \in \mathbb N λ∈N,任意电路 C ∈ C λ C \in \mathcal C_\lambda C∈Cλ,有
P r [ C ′ ( x ) = C ( x ) : C ′ ← i O ( λ , C ) ] = 1 Pr[C'(x)=C(x): C' \leftarrow i\mathcal O(\lambda,C)]=1 Pr[C′(x)=C(x):C′←iO(λ,C)]=1
不可区分性(Indistinguishability):对于任意的 λ ∈ N \lambda \in \mathbb N λ∈N,任意的(non-uniform)PPT 区分器 D \mathcal D D,任意的一对电路 C 0 , C 1 ∈ C λ C_0,C_1 \in \mathcal C_\lambda C0,C1∈Cλ,如果 C 0 ( x ) = C 1 ( x ) , ∀ x C_0(x)=C_1(x),\forall x C0(x)=C1(x),∀x,那么
∣ P r [ D ( i O ( λ , C 0 ) ) = 1 ] − P r [ D ( i O ( λ , C 1 ) ) = 1 ] ∣ ≤ n e g l ( n ) \Big| Pr[\mathcal D(i\mathcal O(\lambda,C_0))=1] - Pr[\mathcal D(i\mathcal O(\lambda,C_1))=1]\Big| \le negl(n) Pr[D(iO(λ,C0))=1]−Pr[D(iO(λ,C1))=1] ≤negl(n)
有效性(Efficiency):混淆器是 PPT 的,其输出长度满足 ∣ i O ( λ , C ) ∣ ≤ p o l y ( ∣ C ∣ ) |i\mathcal O(\lambda,C)| \le poly(|C|) ∣iO(λ,C)∣≤poly(∣C∣)。因为任意函数都可表示为一个指数大的表格,它是不可区分的但是平凡的。
关于 N C 1 NC^1 NC1 的不可区分混淆器:如果 C λ \mathcal C_\lambda Cλ 是深度至多为 O ( log λ ) O(\log \lambda) O(logλ) 大小至多为 O ( λ ) O(\lambda) O(λ) 的电路簇。
关于 P / p o l y P/poly P/poly 的不可区分混淆器:如果 C λ \mathcal C_\lambda Cλ 是大小至多为 O ( λ ) O(\lambda) O(λ) 的电路簇(带有多项式长度 advice 的多项式时间图灵机,非一致多项式时间)。
区分两个混淆:
在 GGH13 和 GGH15 中给出了基于格的多线性映射方案,而 GGH+13 基于此构造了多线性拼图,并给出了第一个不可区分混淆器 i O i\mathcal O iO 的构造。但是后续人们发现了 GGH13 和 GGH15 的多线性映射的弱点,不过幸运的是 GGH+13 只将多线性映射作为一个黑盒来调用,并不关注它的具体实现。然而,多线性度 n ≥ 3 n \ge 3 n≥3 的多线性映射如何实现安全性是个问题;目前已知双线性映射是安全的。Lin 经过一系列研究,将多线性度降低到了常数级,最终在 JLS20 中成功将 iO 建立在了双线性映射上。
多线性拼图猜谜(Multilinear Jigsaw Puzzles)是多线性编码(multilinear encoding schemes)的严格子集,类似拼图一样编码值的组合受限。类似于双线性映射,素数 p p p 阶群上的多线性映射(multilinear maps)为:
e : G 1 × G 2 × ⋯ × G k → G T ( g 1 x 1 , g 2 x 2 , ⋯ , g k x k ) → g T ∏ i x i \begin{aligned} e: G_1 \times G_2 \times \cdots \times G_k \to G_T\\ (g_1^{x_1},g_2^{x_2},\cdots,g_k^{x_k}) \to g_T^{\prod_i x_i} \end{aligned} e:G1×G2×⋯×Gk→GT(g1x1,g2x2,⋯,gkxk)→gT∏ixi
易知 e ( g 1 x 1 , g 2 x 2 , ⋯ , g k x k ) ⋅ e ( g 1 y 1 , g 2 y 2 , ⋯ , g k y k ) = g T ∏ i x i + ∏ i y i e(g_1^{x_1},g_2^{x_2},\cdots,g_k^{x_k}) \cdot e(g_1^{y_1},g_2^{y_2},\cdots,g_k^{y_k}) = g_T^{\prod_i x_i+\prod_iy_i} e(g1x1,g2x2,⋯,gkxk)⋅e(g1y1,g2y2,⋯,gkyk)=gT∏ixi+∏iyi,且 e ( g 1 , g 2 , ⋯ , g k ) = g T e(g_1,g_2,\cdots,g_k)=g_T e(g1,g2,⋯,gk)=gT。有效的多线性型(valid multilinear form)就是任意的形如 ∏ i e ( x i 1 , ⋯ , x i k ) w i ⋅ ∏ j g T w j \prod_i e(x_{i1},\cdots,x_{ik})^{w_i} \cdot \prod_j g_T^{w_j} ∏ie(xi1,⋯,xik)wi⋅∏jgTwj 的可通过群运算和多线性映射表示的任意组合。
多线性拼图猜谜,它是一个 PPT 算法组 M J P = ( J G e n , J V e r ) MJP=(JGen,JVer) MJP=(JGen,JVer),
拼图生成器(Jigsaw Generator):输入一些明文,输出拼图碎片(明文的编码值),这些拼图碎片只能以十分受限的方式通过群运算和多线性映射组合。
拼图验证器(Jigsaw Verifier):输入拼图碎片以及一个关于这些拼图碎片组合方式的多线性型,验证这个多线性型是否成功地将碎片组合成了明文 0 0 0 的编码值。
拼图区分符(Jigsaw Specifier)是一个三元组 { ( k λ , l λ , A λ ) } λ ∈ Z + \{(k_\lambda,l_\lambda,A_\lambda)\}_{\lambda \in \mathbb Z^+} {(kλ,lλ,Aλ)}λ∈Z+,其中 k , l ∈ Z + k,l \in \mathbb Z^+ k,l∈Z+,而 A A A 是一个概率电路:输入素数 p p p,输出有序集合 { ( S 1 , a 1 ) , … , ( S l , a l ) } \{(S_1,a_1),\dots,(S_l,a_l)\} {(S1,a1),…,(Sl,al)},其中 a i ∈ Z p a_i \in \mathbb Z_p ai∈Zp 是明文, S i ⊆ [ k ] S_i \subseteq [k] Si⊆[k] 是编码级别(encoding levels)。
多线性型(Multilinear Form)是一个四元组 F = ( k , l , Π , F ) \mathcal F=(k,l,\Pi,F) F=(k,l,Π,F),其中 k , l ∈ Z + k,l \in \mathbb Z^+ k,l∈Z+, Π \Pi Π 是有 l l l 条 input wires 的多项式大小的电路, F F F 是对电路 Π \Pi Π 中每条 wires 的指标集 S ⊆ [ k ] S \subseteq [k] S⊆[k] 的赋值。电路的构成和约束是:
多线性运算(multilinear evaluation):输入为 X = ( p , { ( S i , a i ) } ) ← ( k , l , A ) X=(p,\{(S_i,a_i)\}) \leftarrow (k,l,A) X=(p,{(Si,ai)})←(k,l,A),且 F \mathcal F F 的 input wires 的指标集赋值为 S i S_i Si,如果在 Z p \mathbb Z_p Zp 上进行运算后,使得输出线为 ( [ k ] , 0 ) ([k],0) ([k],0),我们说 F ( X ) \mathcal F(X) F(X) 成功(在受限的组合下使得 C ( x ) = 0 C(x)=0 C(x)=0)。
拼图生成器是一对 PPT 算法 J G e n = ( I n s t G e n , E n c o d e ) JGen=(InstGen, Encode) JGen=(InstGen,Encode),
拼图验证器是一个 PPT 算法 J V e r JVer JVer,
根据 Barrington’s theorem,可以使用 5-PBP 分支程序 表达在 N C 1 NC^1 NC1 中的布尔电路。GGH+13 在 Kilian 的多方安全计算的基础上,加入更多随机化技术得到了 N C 1 NC^1 NC1 上的不可区分混淆。
Kilian 的两方安全计算:Alice 和 Bob 需要计算 C ( x , y ) C(x,y) C(x,y),其中 ∣ x ∣ + ∣ y ∣ = l |x|+|y|=l ∣x∣+∣y∣=l,令总的输入为 χ : = ( x ∥ y ) \chi:=(x\|y) χ:=(x∥y),步骤如下,
我们直接将上述协议中的 Alice 和 Bob 分别作为不可区分混淆的混淆器(obfuscator)和计算器( evaluator),令 C ( ⋅ , ⋅ ) C(\cdot,\cdot) C(⋅,⋅) 是通用电路(universal circuit),Alice 的输入 x x x 是待混淆电路的描述,Bob 输入 y y y 输出 C x ( y ) C_x(y) Cx(y)。与 Kalian 协议不同的是 Alice 直接将 y y y 对应位置的所有随机矩阵 { ( A ˉ i , 0 , A ˉ i , 1 ) : i n p ( i ) > ∣ x ∣ } \{(\bar A_{i,0},\bar A_{i,1}):inp(i) > |x|\} {(Aˉi,0,Aˉi,1):inp(i)>∣x∣} 都发送给 Bob,这使得 Bob 可以随意执行关于不同输入的多次计算。但是这将导致一些问题:
下面,我们依次解决这三个问题。
为了解决 Other attacks,GGH+13 使用多线性拼图,约束敌手无法执行非线性运算。
为了解决 Partial Evaluation Attacks,GGH+13 认为关键在于随机性不够多,于是通过扩张矩阵维度来加入更多随机性。
对于 5-PBP 中的矩阵 A i , b A_{i,b} Ai,b,将它扩充到更高维,
D i , b = [ $ ⋱ $ A i , b ] , D ˉ i , b = R i − 1 D i , b R i − 1 D_{i,b} = \begin{bmatrix} \$\\ &\ddots\\ &&\$\\ &&& A_{i,b} \end{bmatrix}, \bar D_{i,b} = R_{i-1} D_{i,b} R_i^{-1} Di,b= $⋱$Ai,b ,Dˉi,b=Ri−1Di,bRi−1
其中 $$$ 表示随机数, D i , b D_{i,b} Di,b 是 2 m + 5 2m+5 2m+5 阶矩阵,它的左上角是 2 m 2m 2m 阶随机对角阵,这个对角阵关于每个 A i , b A_{i,b} Ai,b 是唯一的(不要复用)。随机化矩阵 R i R_i Ri 的维度也提升到了 2 m + 5 2m+5 2m+5 阶。
虽然没有理由认为 m = 1 m=1 m=1 不安全,GGH+13 还是选取了较大的 m = 2 n + 5 m=2n+5 m=2n+5 以抵御非预期的攻击。
现在,RBP 的计算结果为 ∏ i D ˉ i , χ i n p ( i ) = R 0 P R n − 1 \prod_i \bar D_{i,\chi_{inp(i)}} = R_0PR_n^{-1} ∏iDˉi,χinp(i)=R0PRn−1,其中 P = ∏ i D i , χ i n p ( i ) P = \prod_i D_{i,\chi_{inp(i)}} P=∏iDi,χinp(i) 的右下角的 5 5 5 阶子矩阵为原始 5-PBP 的计算结果 A = ∏ i A i , χ i n p ( i ) A=\prod_i A_{i,\chi_{inp(i)}} A=∏iAi,χinp(i)。为了提取它,GGH+13 设计了特殊的”书挡向量“(bookend),它们被分为 m + m + 5 m+m+5 m+m+5 三块,
s = ( 0 , ⋯ , 0 , $ , ⋯ , $ , − s ∗ − ) , t = ( $ , ⋯ , $ , 0 , ⋯ , 0 , − t ∗ − ) s=(0,\cdots,0,\$,\cdots,\$,-s^*-),\ \ t=(\$,\cdots,\$,0,\cdots,0,-t^*-) s=(0,⋯,0,$,⋯,$,−s∗−), t=($,⋯,$,0,⋯,0,−t∗−)
将 s ˉ = s R 0 − 1 \bar s=sR_0^{-1} sˉ=sR0−1 以及 t ˉ = R n t T \bar t=R_nt^T tˉ=RntT 作为 RBP 的一部分。容易看出 r : = s ˉ ⋅ ∏ i D ˉ i , χ i n p ( i ) ⋅ t ˉ = s ∗ A t ∗ T r:=\bar s \cdot \prod_i \bar D_{i,\chi_{inp(i)}} \cdot \bar t = s^* A {t^*}^T r:=sˉ⋅∏iDˉi,χinp(i)⋅tˉ=s∗At∗T,当 A = I A=I A=I 时它为内积 r ∗ : = ⟨ s ∗ , t ∗ ⟩ r^*:=\lang s^*,t^* \rang r∗:=⟨s∗,t∗⟩,当 A A A 是随机置换阵等于这个值的概率约为 1 / p 1/p 1/p。
因此,判断 C x ( y ) = 0 C_x(y)=0 Cx(y)=0 就是用 J V e r JVer JVer 判断 r ′ : = r − r ∗ r':=r-r^* r′:=r−r∗ 是否为零,除了一个较小的错误率。
为了解决 Mixed Input Attacks,可以类似 SPDZ 或者 ZKsnark,通过“牺牲”另一个相同的程序,来确保敌手的计算步骤的合法性。
GGH+13 使用乘法捆绑(multiplicative bundling),随机选择 { α i , b } \{\alpha_{i,b}\} {αi,b} 构造计算 C x ( y ) C_x(y) Cx(y) 的主程序 ( s , t , { D i , b ′ } ) (s,t,\{D_{i,b}'\}) (s,t,{Di,b′}),
D i , b = [ $ ⋱ $ α i , b A i , b ] , D ˉ i , b ′ = R i − 1 D i , b R i − 1 D_{i,b} = \begin{bmatrix} \$\\ &\ddots\\ &&\$\\ &&& \alpha_{i,b}A_{i,b} \end{bmatrix}, \bar D_{i,b}' = R_{i-1} D_{i,b} R_i^{-1} Di,b= $⋱$αi,bAi,b ,Dˉi,b′=Ri−1Di,bRi−1
然后随机选择 { α i , b ′ } \{\alpha_{i,b}'\} {αi,b′} 构造计算 f ( x , y ) = 1 f(x,y)=1 f(x,y)=1 的虚拟程序 ( s ′ , t ′ , { D i , b ′ } ) (s',t',\{D_{i,b}'\}) (s′,t′,{Di,b′}),
D i , b ′ = [ $ ⋱ $ α i , b ′ I ] , D ˉ i , b ′ = R i − 1 ′ D i , b ′ R i ′ − 1 D_{i,b}' = \begin{bmatrix} \$\\ &\ddots\\ &&\$\\ &&& \alpha_{i,b}'I \end{bmatrix}, \bar D_{i,b}' = R_{i-1}' D_{i,b}' {R_i'}^{-1} Di,b′= $⋱$αi,b′I ,Dˉi,b′=Ri−1′Di,b′Ri′−1
为了保证当 A = I A=I A=I 时,主程序的结果 r : = s ∗ A t ∗ T ⋅ ∏ i α i , χ i n p ( i ) r:=s^*A{t^*}^T \cdot \prod_i \alpha_{i,\chi_{inp(i)}} r:=s∗At∗T⋅∏iαi,χinp(i) 与虚拟程序的结果 r ∗ : = s ∗ ′ I t ∗ ′ T ⋅ ∏ i α i , χ i n p ( i ) ′ r^*:=s^{*'}I{t^{*'}}^T \cdot \prod_i \alpha'_{i,\chi_{inp(i)}} r∗:=s∗′It∗′T⋅∏iαi,χinp(i)′ 相同,这需要满足两个约束条件:首先是 ⟨ s ∗ , t ∗ ⟩ = ⟨ s ∗ ′ , t ∗ ′ ⟩ \lang s^*,t^* \rang = \lang s^{*'},t^{*'} \rang ⟨s∗,t∗⟩=⟨s∗′,t∗′⟩,其次是
∏ i n p ( i ) = j α i , b = ∏ i n p ( i ) = j α i , b ′ , ∀ j ∈ [ l ] , b ∈ { 0 , 1 } \prod_{inp(i)=j}\alpha_{i,b} = \prod_{inp(i)=j}\alpha_{i,b}',\forall j \in [l],b \in \{0,1\} inp(i)=j∏αi,b=inp(i)=j∏αi,b′,∀j∈[l],b∈{0,1}
如果敌手遵循了 PBP 的计算法则,那么 r ′ : = r − r ∗ = 0 r':=r-r^*=0 r′:=r−r∗=0 就正确反映了 C x ( y ) = 0 C_x(y)=0 Cx(y)=0 的计算结果。而如果敌手试图采取 mix-and-match 的攻击,那么主程序和虚拟程序的结果将是独立随机的,只有 1 / p 1/p 1/p 的概率使得 r ′ = 0 r'=0 r′=0
方便起见,我们定义 I j = { i : i n p ( i ) = j } I_j=\{i:inp(i)=j\} Ij={i:inp(i)=j}。另外,我们将 i n p ( ⋅ ) inp(\cdot) inp(⋅) 扩展到集合上,定义 i n p ( S ) = { i n p ( i ) : i ∈ S } inp(S)=\{inp(i):i \in S\} inp(S)={inp(i):i∈S},以及 I J = { I j : j ∈ J } I_J=\{I_j:j \in J\} IJ={Ij:j∈J}。
综合上述的技术,我们获得了如下的安全性更好的 RBP 程序:
我们使用多线性拼图来执行上述的长度为 n n n 的 RBP 程序:首先执行 J G e n . I n s t G e n JGen.InstGen JGen.InstGen 获得多线性度为 n + 2 n+2 n+2 的随机实例,然后执行拼图区分符 ( k , l , A ) (k,l,A) (k,l,A) 获得上述的 R N D p ( B P ) RND_p(BP) RNDp(BP) 及其编码索引,接着执行 J G e n . E n c o d e JGen.Encode JGen.Encode 将它编码为
给定一组输入 χ : = ( x ∥ y ) ∈ { 0 , 1 } l \chi:=(x\|y) \in \{0,1\}^l χ:=(x∥y)∈{0,1}l,我们定义它的多线性型 F χ \mathcal F_\chi Fχ 为:
F χ ( R N D p ( B P ) ) : = s ˉ ⋅ ∏ i D ˉ i , χ i n p ( i ) ⋅ t ˉ − s ˉ ′ ⋅ ∏ i D ˉ i , χ i n p ( i ) ′ ⋅ t ˉ ′ ( m o d p ) \mathcal F_\chi(RND_p(BP)) := \bar s \cdot \prod_i \bar D_{i,\chi_{inp(i)}} \cdot \bar t - \bar s' \cdot \prod_i \bar D'_{i,\chi_{inp(i)}} \cdot \bar t' \pmod{p} Fχ(RNDp(BP)):=sˉ⋅i∏Dˉi,χinp(i)⋅tˉ−sˉ′⋅i∏Dˉi,χinp(i)′⋅tˉ′(modp)
易知,当 C x ( y ) = 0 C_x(y)=0 Cx(y)=0 时 B P ( χ ) = I BP(\chi)=I BP(χ)=I,此时以 P r = 1 Pr=1 Pr=1 的概率 F χ ( R N D p ( B P ) ) = 0 \mathcal F_\chi(RND_p(BP))=0 Fχ(RNDp(BP))=0。而当 C x ( y ) ≠ 0 C_x(y)\neq0 Cx(y)=0 时 B P ( χ ) ≠ I BP(\chi)\neq I BP(χ)=I,此时以 P r = 1 − 1 / p Pr=1-1/p Pr=1−1/p 的概率 F χ ( R N D p ( B P ) ) ≠ 0 \mathcal F_\chi(RND_p(BP))\neq0 Fχ(RNDp(BP))=0。
现在,我们定义部分赋值的 RBP 程序(Garbled Branching Programs)。定义赋值函数为 σ : J → { 0 , 1 } , J ⊆ [ l ] \sigma:J \to \{0,1\}, J \subseteq [l] σ:J→{0,1},J⊆[l],接着从 RBP 中移除 i ∈ I J , b ≠ σ ( i n p ( i ) ) i \in I_J,b \neq \sigma(inp(i)) i∈IJ,b=σ(inp(i)) 的那些矩阵 D i , b , D i , b ′ D_{i,b},D'_{i,b} Di,b,Di,b′,程序如下:
其中 ( J , σ ) (J,\sigma) (J,σ) 是一组部分赋值,如果 B P BP BP 计算的原始函数为 F F F,那么现在它所计算的函数为 F ∣ σ F|_\sigma F∣σ。对于不同的赋值 ( J , σ 0 ) , ( J , σ 1 ) (J,\sigma_0),(J,\sigma_1) (J,σ0),(J,σ1),如果 F ∣ σ 0 = F ∣ σ 1 F|_{\sigma_0} = F|_{\sigma_1} F∣σ0=F∣σ1,我们称两个部分赋值是关于 F F F 功能等价的(functionally equivalent)。
GGH+13 做了一个 Equivalent Program Indistinguishability 假设:任意的 n n n 长 BP 程序可计算函数 F : { 0 , 1 } l → { 0 , 1 } F:\{0,1\}^l \to \{0,1\} F:{0,1}l→{0,1},以及任意部分赋值 ( J , σ 0 ) , ( J , σ 1 ) (J,\sigma_0),(J,\sigma_1) (J,σ0),(J,σ1),如果它们是功能等价的,那么它们的 garbled programs 是计算不可区分的,
G A R B L E ( R N D ‾ p ( B P ) , ( J , σ 0 ) ) ≡ c G A R B L E ( R N D ‾ p ( B P ) , ( J , σ 1 ) ) GARBLE(\overline{RND}_p(BP),(J,\sigma_0)) \overset{c}{\equiv} GARBLE(\overline{RND}_p(BP),(J,\sigma_1)) GARBLE(RNDp(BP),(J,σ0))≡cGARBLE(RNDp(BP),(J,σ1))
根据上述假设,就可以构造出电路类 N C 1 NC^1 NC1 上的不可区分混淆器 i O i\mathcal O iO:
对于固定常数 c c c,任意安全参数 λ \lambda λ,电路簇 C λ \mathcal C_\lambda Cλ 包含所有的深度为 c log λ c\log\lambda clogλ 大小至多为 λ \lambda λ 的电路,令 U λ U_\lambda Uλ 是通用电路, U λ ( C , m ) = C ( m ) , ∀ C ∈ C λ U_\lambda(C,m)=C(m),\forall C \in \mathcal C_\lambda Uλ(C,m)=C(m),∀C∈Cλ,其中 C C C 是长度 l ( λ ) l(\lambda) l(λ) 的电路描述。
将通用电路 U λ U_\lambda Uλ 转化为 universal branching program U B P λ ( C , m ) UBP_\lambda(C,m) UBPλ(C,m),令混淆器的输入 C C C 对应的矩阵指标集为 I C I_C IC,电路 C C C 的一组赋值为 σ C \sigma_C σC,那么定义不可区分混淆器为
i O ( λ , C ) : = G A R B L E ( R N D ‾ p ( U B P λ ) , ( I C , σ C ) ) i\mathcal O(\lambda,C) := GARBLE(\overline{RND}_p(UBP_\lambda),(I_C,\sigma_C)) iO(λ,C):=GARBLE(RNDp(UBPλ),(IC,σC))
对于不同的两个有相同功能的电路 U B P λ ( C 1 , ⋅ ) , U B P λ ( C 2 , ⋅ ) UBP_\lambda(C_1,\cdot), UBP_\lambda(C_2,\cdot) UBPλ(C1,⋅),UBPλ(C2,⋅),根据 Equivalent Program Indistinguishability 的假设, i O ( λ , C 1 ) ≡ c i O ( λ , C 2 ) i\mathcal O(\lambda,C_1) \overset{c}{\equiv} i\mathcal O(\lambda,C_2) iO(λ,C1)≡ciO(λ,C2),混淆后两者计算不可区分。
为了构造语言类 P / p o l y P/poly P/poly 上不可区分混淆,GGH+13 引入一个解密算法属于 N C 1 NC^1 NC1 的全同态加密,使得我们可以在密文下计算 P / p o l y P/poly P/poly 电路。另外,还需要一个 Perfect Soundness 的 NI-ZKP,特别地要求它有 low-depth proof,可以在 N C 1 NC^1 NC1 电路中被验证。
选取两个公私钥对 ( S K 1 , P K 1 ) , ( S K 2 , P K 2 ) (SK_1,PK_1), (SK_2,PK_2) (SK1,PK1),(SK2,PK2),将电路 C C C 加密两次,然后将其中之一的解密电路做混淆(不可区分是哪个秘钥的解密电路)。在解密之前,首先验证敌手在两个电路上都是正确计算的。协议如下:
接着 GGH+13 在这个的基础上,再加入 PKE 和 SSS-NIZK(Statistical Simulation-Soundness),构造了一个应用:函数加密(Functional Encryption)。思路是:在 i O i\mathcal O iO 下简单地解密密文,然后直接在明文上计算任意函数,将这个混淆程序 i O ( f ( D e c ( s k , c t ) ) ) i\mathcal O(f(Dec(sk,ct))) iO(f(Dec(sk,ct))) 作为函数私钥 S K f SK_f SKf。类似上面的构造,它也需要两个公私钥对,并使用 NIZK 验证密文的正确性,然后才提供解密谕言服务。