Theorem .
使用 Dolev-Dwork-Naor 构造的 PKE’ 具有 CCA2 安全。
【证明】
Game 0 . 即 Exp PKE ′ , A CCA2-0 ( κ ) \textbf{Exp}_{\text{PKE}',\mathcal{A}}^\text{CCA2-0}(\kappa) Exp PKE ′ , A CCA2-0 ( κ ) .
C A ( p k , s k ) ← Gen ′ ( 1 κ ) ⟶ p k r ← { 0 , 1 } poly ( κ ) ; ( p k i 0 , s k i 0 ) ← Gen ( 1 κ ) , i ∈ [ k ] ; ( p k i 1 , s k i 1 ) ← Gen ( 1 κ ) , i ∈ [ k ] ; p k : = ( p k 1 : k , 0 / 1 , r ) ; s k : = ( s k 1 , 0 / 1 ) ⟵ c = ( v k , c ⃗ , π , σ ) decryption queries m / ⊥ ← Dec ′ ( s k , c ) ⟶ m / ⊥ if Vrfy ( v k , ( c ⃗ , π ) , σ ) = 0 ∨ V ( r , c ⃗ , π ) = 0 , m : = ⊥ ; else, m ← Dec ( s k 1 , v k 1 , c 1 ) ⟵ ( m 0 , m 1 ) choose m 0 , m 1 c ∗ ← Enc ′ ( p k , m 0 ; w ⃗ ∗ ) ⟶ c ∗ ( v k ∗ , s s k ∗ ) ← SigGen ( 1 κ ) ; w i ∗ ← { 0 , 1 } poly ( κ ) , i ∈ [ k ] ; c i ∗ ← Enc ( p k i , v k i ∗ , m 0 ; w i ∗ ) , i ∈ [ k ] ; π ∗ ← P ( r , c ⃗ ∗ , ( m 0 , w ⃗ ∗ ) ) ; σ ∗ ← Sign ( s s k ∗ , ( c ⃗ ∗ , π ∗ ) ) c ∗ : = ( v k ∗ , c ⃗ ∗ , π ∗ , σ ∗ ) ⟵ c = ( v k , c ⃗ , π , σ ) decryption queries m / ⊥ ← Dec ′ ( s k , c ) ⟶ m / ⊥ if Vrfy ( v k , ( c ⃗ , π ) , σ ) = 0 ∨ V ( r , c ⃗ , π ) = 0 , m : = ⊥ ; else, m ← Dec ( s k 1 , v k 1 , c 1 ) return b ′ ⟵ b ′ compute b ′ \color{darkblue}\begin{matrix}\mathcal{C}& &\mathcal{A}\\ (pk,sk)\leftarrow\text{Gen}'(1^\kappa) & \stackrel{pk}{\longrightarrow}\\ \scriptsize r \leftarrow \{0,1\}^{\text{poly}(\kappa)};\\ \scriptsize (pk_{i0},sk_{i0})\leftarrow\text{Gen}(1^\kappa),i\in[k];\\ \scriptsize(pk_{i1},sk_{i1})\leftarrow\text{Gen}(1^\kappa),i\in[k];\\ \scriptsize pk:=(pk_{1:k,0/1},r);sk:=(sk_{1,0/1}) \\ & \stackrel{c=(vk,\vec{c},\pi,\sigma)}{\longleftarrow}& \text{decryption queries}\\ m/\perp\leftarrow\text{Dec}'(sk,c) & \stackrel{m/\perp}{\longrightarrow}\\ \scriptsize \text{if } \text{Vrfy}(vk,(\vec{c},\pi),\sigma)=0\vee V(r,\vec{c},\pi)=0, \\\scriptsize m:=\perp;\quad\text{else,}\quad m\leftarrow \text{Dec}(sk_{1,vk_1},c_1) \\ & \stackrel{(m_0,m_1)}{\longleftarrow}& \text{choose }m_0,m_1\\ c^*\leftarrow \text{Enc}'(pk,m_0;\vec{w}^*)& \stackrel{c^*}{\longrightarrow}& \\ \scriptsize (vk^*,ssk^*)\leftarrow\text{SigGen}(1^\kappa);\\ \scriptsize w_i^*\leftarrow\{0,1\}^{\text{poly}(\kappa)},i\in[k];\\ \scriptsize c_i^*\leftarrow\text{Enc}(pk_{i,vk^*_i},m_0;w_i^*),i\in[k];\\ \scriptsize \pi^*\leftarrow P(r,\vec{c}^*,(m_0,\vec{w}^*));\\ \scriptsize \sigma^*\leftarrow\text{Sign}(ssk^*,(\vec{c}^*,\pi^*))\\ \scriptsize c^*:=(vk^*,\vec{c}^*,\pi^*,\sigma^*)\\& \stackrel{c=(vk,\vec{c},\pi,\sigma)}{\longleftarrow}& \text{decryption queries}\\ m/\perp\leftarrow\text{Dec}'(sk,c) & \stackrel{m/\perp}{\longrightarrow}\\ \scriptsize \text{if } \text{Vrfy}(vk,(\vec{c},\pi),\sigma)=0\vee V(r,\vec{c},\pi)=0, \\\scriptsize m:=\perp;\quad\text{else,}\quad m\leftarrow \text{Dec}(sk_{1,vk_1},c_1) \\\text{return }b' & \stackrel{b'}{\longleftarrow} & \text{compute }b'\end{matrix} C ( p k , s k ) ← Gen ′ ( 1 κ ) r ← { 0 , 1 } poly ( κ ) ; ( p k i 0 , s k i 0 ) ← Gen ( 1 κ ) , i ∈ [ k ] ; ( p k i 1 , s k i 1 ) ← Gen ( 1 κ ) , i ∈ [ k ] ; p k := ( p k 1 : k , 0/1 , r ) ; s k := ( s k 1 , 0/1 ) m / ⊥← Dec ′ ( s k , c ) if Vrfy ( v k , ( c , π ) , σ ) = 0 ∨ V ( r , c , π ) = 0 , m :=⊥ ; else, m ← Dec ( s k 1 , v k 1 , c 1 ) c ∗ ← Enc ′ ( p k , m 0 ; w ∗ ) ( v k ∗ , ss k ∗ ) ← SigGen ( 1 κ ) ; w i ∗ ← { 0 , 1 } poly ( κ ) , i ∈ [ k ] ; c i ∗ ← Enc ( p k i , v k i ∗ , m 0 ; w i ∗ ) , i ∈ [ k ] ; π ∗ ← P ( r , c ∗ , ( m 0 , w ∗ )) ; σ ∗ ← Sign ( ss k ∗ , ( c ∗ , π ∗ )) c ∗ := ( v k ∗ , c ∗ , π ∗ , σ ∗ ) m / ⊥← Dec ′ ( s k , c ) if Vrfy ( v k , ( c , π ) , σ ) = 0 ∨ V ( r , c , π ) = 0 , m :=⊥ ; else, m ← Dec ( s k 1 , v k 1 , c 1 ) return b ′ ⟶ p k ⟵ c = ( v k , c , π , σ ) ⟶ m / ⊥ ⟵ ( m 0 , m 1 ) ⟶ c ∗ ⟵ c = ( v k , c , π , σ ) ⟶ m / ⊥ ⟵ b ′ A decryption queries choose m 0 , m 1 decryption queries compute b ′ Game 1 . 修改 Game 0 ,先生成签名密钥 v k ∗ vk^* v k ∗ ;同时,若解密时出现了 v k = v k ∗ vk=vk^* v k = v k ∗ ,则不给解密(返回 ⊥ \perp ⊥ )。
对于挑战者来说 SigGen \text{SigGen} SigGen 只运行一次,在开头运行还是在加密时运行是一样的,在证明过程中我们想让他在开头就确定下来,这样允许我们在后续的证明中直接使用 v k ∗ vk^* v k ∗ 。 C A ( v k ∗ , s s k ∗ ) ← SigGen ( 1 κ ) ; ( p k , s k ) ← Gen ′ ( 1 κ ) ⟶ p k r ← { 0 , 1 } poly ( κ ) ; ( p k i 0 , s k i 0 ) ← Gen ( 1 κ ) , i ∈ [ k ] ; ( p k i 1 , s k i 1 ) ← Gen ( 1 κ ) , i ∈ [ k ] ; p k : = ( p k 1 : k , 0 / 1 , r ) ; s k : = ( s k 1 , 0 / 1 ) ⟵ c = ( v k , c ⃗ , π , σ ) decryption queries m / ⊥ ← Dec ′ ( s k , c ) ⟶ m / ⊥ if Vrfy ( v k , ( c ⃗ , π ) , σ ) = 0 ∨ V ( r , c ⃗ , π ) = 0 ∨ v k = v k ∗ , m : = ⊥ ; else, m ← Dec ( s k 1 , v k 1 , c 1 ) ⟵ ( m 0 , m 1 ) choose m 0 , m 1 c ∗ ← Enc ′ ( p k , m 0 ; w ⃗ ∗ ) ⟶ c ∗ w i ∗ ← { 0 , 1 } poly ( κ ) , i ∈ [ k ] ; c i ∗ ← Enc ( p k i , v k i ∗ , m 0 ; w i ∗ ) , i ∈ [ k ] ; π ∗ ← P ( r , c ⃗ ∗ , ( m 0 , w ⃗ ∗ ) ) ; σ ∗ ← Sign ( s s k ∗ , ( c ⃗ ∗ , π ∗ ) ) c ∗ : = ( v k ∗ , c ⃗ ∗ , π ∗ , σ ∗ ) ⟵ c = ( v k , c ⃗ , π , σ ) decryption queries m / ⊥ ← Dec ′ ( s k , c ) ⟶ m / ⊥ if Vrfy ( v k , ( c ⃗ , π ) , σ ) = 0 ∨ V ( r , c ⃗ , π ) = 0 ∨ v k = v k ∗ , m : = ⊥ ; else, m ← Dec ( s k 1 , v k 1 , c 1 ) return b ′ ⟵ b ′ compute b ′ \color{darkblue}\begin{matrix}\mathcal{C}& &\mathcal{A}\\ \scriptsize\color{red} (vk^*,ssk^*)\leftarrow\text{SigGen}(1^\kappa);\\(pk,sk)\leftarrow\text{Gen}'(1^\kappa) & \stackrel{pk}{\longrightarrow}\\ \scriptsize r \leftarrow \{0,1\}^{\text{poly}(\kappa)};\\ \scriptsize (pk_{i0},sk_{i0})\leftarrow\text{Gen}(1^\kappa),i\in[k];\\ \scriptsize(pk_{i1},sk_{i1})\leftarrow\text{Gen}(1^\kappa),i\in[k];\\ \scriptsize pk:=(pk_{1:k,0/1},r);sk:=(sk_{1,0/1}) \\ & \stackrel{c=(vk,\vec{c},\pi,\sigma)}{\longleftarrow}& \text{decryption queries}\\ m/\perp\leftarrow\text{Dec}'(sk,c) & \stackrel{m/\perp}{\longrightarrow}\\ \scriptsize \text{if } \text{Vrfy}(vk,(\vec{c},\pi),\sigma)=0\vee V(r,\vec{c},\pi)=0 \\\scriptsize {\color{red}\vee vk=vk^*},\ m:=\perp;\ \text{else,}\ m\leftarrow \text{Dec}(sk_{1,vk_1},c_1) \\ & \stackrel{(m_0,m_1)}{\longleftarrow}& \text{choose }m_0,m_1\\ c^*\leftarrow \text{Enc}'(pk,m_0;\vec{w}^*)& \stackrel{c^*}{\longrightarrow}& \\ \scriptsize w_i^*\leftarrow\{0,1\}^{\text{poly}(\kappa)},i\in[k];\\ \scriptsize c_i^*\leftarrow\text{Enc}(pk_{i,vk^*_i},m_0;w_i^*),i\in[k];\\ \scriptsize \pi^*\leftarrow P(r,\vec{c}^*,(m_0,\vec{w}^*));\\ \scriptsize \sigma^*\leftarrow\text{Sign}(ssk^*,(\vec{c}^*,\pi^*))\\\scriptsize c^*:=(vk^*,\vec{c}^*,\pi^*,\sigma^*)\\ & \stackrel{c=(vk,\vec{c},\pi,\sigma)}{\longleftarrow}& \text{decryption queries}\\ m/\perp\leftarrow\text{Dec}'(sk,c) & \stackrel{m/\perp}{\longrightarrow}\\ \scriptsize \text{if } \text{Vrfy}(vk,(\vec{c},\pi),\sigma)=0\vee V(r,\vec{c},\pi)=0 \\\scriptsize {\color{red}\vee vk=vk^*},\ m:=\perp;\ \text{else,}\ m\leftarrow \text{Dec}(sk_{1,vk_1},c_1) \\\text{return }b' & \stackrel{b'}{\longleftarrow} & \text{compute }b'\end{matrix} C ( v k ∗ , ss k ∗ ) ← SigGen ( 1 κ ) ; ( p k , s k ) ← Gen ′ ( 1 κ ) r ← { 0 , 1 } poly ( κ ) ; ( p k i 0 , s k i 0 ) ← Gen ( 1 κ ) , i ∈ [ k ] ; ( p k i 1 , s k i 1 ) ← Gen ( 1 κ ) , i ∈ [ k ] ; p k := ( p k 1 : k , 0/1 , r ) ; s k := ( s k 1 , 0/1 ) m / ⊥← Dec ′ ( s k , c ) if Vrfy ( v k , ( c , π ) , σ ) = 0 ∨ V ( r , c , π ) = 0 ∨ v k = v k ∗ , m :=⊥ ; else, m ← Dec ( s k 1 , v k 1 , c 1 ) c ∗ ← Enc ′ ( p k , m 0 ; w ∗ ) w i ∗ ← { 0 , 1 } poly ( κ ) , i ∈ [ k ] ; c i ∗ ← Enc ( p k i , v k i ∗ , m 0 ; w i ∗ ) , i ∈ [ k ] ; π ∗ ← P ( r , c ∗ , ( m 0 , w ∗ )) ; σ ∗ ← Sign ( ss k ∗ , ( c ∗ , π ∗ )) c ∗ := ( v k ∗ , c ∗ , π ∗ , σ ∗ ) m / ⊥← Dec ′ ( s k , c ) if Vrfy ( v k , ( c , π ) , σ ) = 0 ∨ V ( r , c , π ) = 0 ∨ v k = v k ∗ , m :=⊥ ; else, m ← Dec ( s k 1 , v k 1 , c 1 ) return b ′ ⟶ p k ⟵ c = ( v k , c , π , σ ) ⟶ m / ⊥ ⟵ ( m 0 , m 1 ) ⟶ c ∗ ⟵ c = ( v k , c , π , σ ) ⟶ m / ⊥ ⟵ b ′ A decryption queries choose m 0 , m 1 decryption queries compute b ′ 接下来,我们定义 Forge i \text{Forge}_i Forge i 表示在 Game i i i 中敌手 A \mathcal{A} A 询问密文 ( v k , c ⃗ , π , σ ) (vk,\vec{c},\pi,\sigma) ( v k , c , π , σ ) ,使得 v k = v k ∗ vk=vk^* v k = v k ∗ 但是 Vrfy ( v k , ( c ⃗ , π ) , σ ) = 1 ∧ V ( r , c ⃗ , π ) = 1 \text{Vrfy}(vk,(\vec{c},\pi),\sigma)=1\wedge V(r,\vec{c},\pi)=1 Vrfy ( v k , ( c , π ) , σ ) = 1 ∧ V ( r , c , π ) = 1 (验证的两关都通过了),即该事件发生等价于 v k = v k ∗ ∧ Vrfy ( v k , ( c ⃗ , π ) , σ ) = 1 ∧ V ( r , c ⃗ , π ) = 1 vk=vk^*\wedge \text{Vrfy}(vk,(\vec{c},\pi),\sigma)=1\wedge V(r,\vec{c},\pi)=1 v k = v k ∗ ∧ Vrfy ( v k , ( c , π ) , σ ) = 1 ∧ V ( r , c , π ) = 1 。
如果 Forge 事件发生:Game 0 和 Game 1 就不一样了,因为 Game 1 的时候如果 v k = v k ∗ vk=vk^* v k = v k ∗ 就直接拒绝了;而 Game 0 会继续走流程。对于 Game 0 和 Game 1 来说,反正 v k ∗ vk^* v k ∗ 只生成一次,在哪生成都是一样的,从敌手的层面完全看不出来区别,所以 Forge 0 \text{Forge}_0 Forge 0 和 Forge 1 \text{Forge}_1 Forge 1 发生的概率是一样的,即 Pr [ Forge 0 ] = Pr [ Forge 1 ] \text{Pr}[\text{Forge}_0]=\text{Pr}[\text{Forge}_1] Pr [ Forge 0 ] = Pr [ Forge 1 ] 如果 Forge 事件不发生:要么 v k ≠ v k ∗ vk\ne vk^* v k = v k ∗ ,要么验证的两关有没通过的。 Game 0 和 Game 1 完全相同,即 Game 0 ∣ ¬ Forge 0 = Game 1 ∣ ¬ Forge 1 \textbf{Game 0}|\neg\text{Forge}_0= \textbf{Game 1}|\neg\text{Forge}_1 Game 0 ∣¬ Forge 0 = Game 1 ∣¬ Forge 1 ,从而 Game 0 = 1 ∣ ¬ Forge 0 = Game 1 = 1 ∣ ¬ Forge 1 \textbf{Game 0}=1|\neg\text{Forge}_0= \textbf{Game 1}=1|\neg\text{Forge}_1 Game 0 = 1∣¬ Forge 0 = Game 1 = 1∣¬ Forge 1 。 于是,根据 Lecture 4 中 lemma 的推论,有
∣ Pr [ Game 1 = 1 ] − Pr [ Game 0 = 1 ] ∣ ≤ Pr [ Forge 0 / 1 ] = Pr [ v k = v k ∗ ∧ Vrfy ( v k , ( c ⃗ , π ) , σ ) = 1 ∧ V ( r , c ⃗ , π ) = 1 ] ≤ Pr [ v k = v k ∗ ∧ Vrfy ( v k , ( c ⃗ , π ) , σ ) = 1 ] \begin{aligned}&\left|\text{Pr}[\textbf{Game 1}=1]-\text{Pr}[\textbf{Game 0}=1]\right|\\\leq\ &\text{Pr}[\text{Forge}_{0/1}]\\=\ &\text{Pr}[vk=vk^*\wedge \text{Vrfy}(vk,(\vec{c},\pi),\sigma)=1\wedge V(r,\vec{c},\pi)=1]\\ \leq \ &\text{Pr}[vk=vk^*\wedge\text{Vrfy}(vk,(\vec{c},\pi),\sigma)=1]\end{aligned} ≤ = ≤ ∣ Pr [ Game 1 = 1 ] − Pr [ Game 0 = 1 ] ∣ Pr [ Forge 0/1 ] Pr [ v k = v k ∗ ∧ Vrfy ( v k , ( c , π ) , σ ) = 1 ∧ V ( r , c , π ) = 1 ] Pr [ v k = v k ∗ ∧ Vrfy ( v k , ( c , π ) , σ ) = 1 ] 如果敌手能够在 Game 0 中以不可忽略的概率产生 v k = v k ∗ ∧ Vrfy ( v k , ( c ⃗ , π ) , σ ) = 1 vk=vk^*\wedge\text{Vrfy}(vk,(\vec{c},\pi),\sigma)=1 v k = v k ∗ ∧ Vrfy ( v k , ( c , π ) , σ ) = 1 的密文,我们就可以利用其能力打破数字签名的 SOT-UF-CMA 安全(这相当于,我们已经伪造了一个签名)。因此规约如下,
C ′ A ′ / C A ( v k ∗ , s s k ∗ ) ← SigGen ( 1 κ ) ⟶ v k ∗ ( p k , s k ) ← Gen ′ ( 1 κ ) ⟶ p k r ← { 0 , 1 } poly ( κ ) ; ( p k i 0 , s k i 0 ) i ∈ [ k ] ← Gen ( 1 κ ) ; ( p k i 1 , s k i 1 ) i ∈ [ k ] ← Gen ( 1 κ ) ; x ′ p k : = ( p k 1 : k , 0 / 1 , r ) ; s k : = ( s k 1 , 0 / 1 ) ⟵ c = ( v k , c ⃗ , π , σ ) c m / ⊥ ← Dec ′ ( s k , c ) ⟶ m / ⊥ ⟵ ( c ⃗ , π , σ ) if v k = v k ∗ ∧ Vrfy ( v k , ( c ⃗ , π ) , σ ) = 1 , abort if Vrfy ( v k , ( c ⃗ , π ) , σ ) = 0 ∨ V ( r , c ⃗ , π ) = 0 , m : = ⊥ ; else, m ← Dec ( s k 1 , v k 1 , c 1 ) ⟵ m 0 , m 1 m 0 , m 1 c ∗ ← Enc ′ ( p k , m 0 ; w ⃗ ∗ ) ⟶ c ∗ ( w i ∗ ) i ∈ [ k ] ← { 0 , 1 } poly ( κ ) ; ( c i ∗ ) i ∈ [ k ] ← Enc ( p k i , v k i ∗ , m 0 ; w i ∗ ) ; ⟵ ( c ⃗ ∗ , π ∗ ) π ∗ ← P ( r , c ⃗ ∗ , ( m 0 , w ⃗ ∗ ) ) ; σ ∗ = Sign ( s s k ∗ , ( c ⃗ ∗ , π ∗ ) ) ⟶ σ ∗ c ∗ = ( v k ∗ , c ⃗ ∗ , π ∗ , σ ∗ ) ⟵ c = ( v k , c ⃗ , π , σ ) c m / ⊥ ← Dec ′ ( s k , c ) ⟶ m / ⊥ ⟵ ( c ⃗ , π , σ ) if v k = v k ∗ ∧ Vrfy ( v k , ( c ⃗ , π ) , σ ) = 1 , abort if Vrfy ( v k , ( c ⃗ , π ) , σ ) = 0 ∨ V ( r , c ⃗ , π ) = 0 , m : = ⊥ ; else, m ← Dec ( s k 1 , v k 1 , c 1 ) ⟵ b ′ b ′ \color{darkblue}\small\begin{matrix}\mathcal{C'}& &\mathcal{A'/C} & &\mathcal{A}\\\scriptsize (vk^*,ssk^*)\leftarrow\text{SigGen}(1^\kappa) & \stackrel{vk^*}{\longrightarrow} & (pk,sk)\leftarrow\text{Gen}'(1^\kappa)&\stackrel{pk}{\longrightarrow}\\ & &\scriptsize r \leftarrow \{0,1\}^{\text{poly}(\kappa)};\\ & &\scriptsize (pk_{i0},sk_{i0})_{i\in[k]}\leftarrow\text{Gen}(1^\kappa);\\ & &\scriptsize(pk_{i1},sk_{i1})_{i\in[k]}\leftarrow\text{Gen}(1^\kappa);\\ x'& &\scriptsize pk:=(pk_{1:k,0/1},r);sk:=(sk_{1,0/1}) \\ & & & \stackrel{c=(vk,\vec{c},\pi,\sigma)}{\longleftarrow}& c\\ & & m/\perp\leftarrow\text{Dec}'(sk,c) &\stackrel{m/\perp}{\longrightarrow}\\&\color{red} \stackrel{(\vec{c},\pi,\sigma)}\longleftarrow&\scriptsize \color{red}\text{if }vk=vk^*\wedge \text{Vrfy}(vk,(\vec{c},\pi),\sigma)=1,\ \text{abort}\\ & &\scriptsize\text{if } \text{Vrfy}(vk,(\vec{c},\pi),\sigma)=0\vee V(r,\vec{c},\pi)=0, \\& &\scriptsize m:=\perp;\ \text{else,}\ m\leftarrow \text{Dec}(sk_{1,vk_1},c_1) \\ & & & \stackrel{m_0,m_1}{\longleftarrow}& m_0,m_1\\& & c^*\leftarrow\text{Enc}'(pk,m_0;\vec{w}^*) &\stackrel{c^*}{\longrightarrow}\\ & &\scriptsize (w_i^*)_{i\in[k]}\leftarrow\{0,1\}^{\text{poly}(\kappa)};\\ & & \scriptsize (c_i^*)_{i\in[k]}\leftarrow\text{Enc}(pk_{i,vk^*_i},m_0;w_i^*);\\ & \stackrel{(\vec{c}^*,\pi^*)}{\longleftarrow}&\scriptsize \pi^*\leftarrow P(r,\vec{c}^*,(m_0,\vec{w}^*));\\\scriptsize\sigma^*=\text{Sign}(ssk^*,(\vec{c}^*,\pi^*)) & \stackrel{\sigma^*}{\longrightarrow} & \scriptsize c^*=(vk^*,\vec{c}^*,\pi^*,\sigma^*)\\& & & \stackrel{c=(vk,\vec{c},\pi,\sigma)}{\longleftarrow}& c\\ & & m/\perp\leftarrow\text{Dec}'(sk,c) &\stackrel{m/\perp}{\longrightarrow}\\&\color{red} \stackrel{(\vec{c},\pi,\sigma)}\longleftarrow&\scriptsize \color{red}\text{if }vk=vk^*\wedge \text{Vrfy}(vk,(\vec{c},\pi),\sigma)=1,\ \text{abort}\\ & &\scriptsize\text{if } \text{Vrfy}(vk,(\vec{c},\pi),\sigma)=0\vee V(r,\vec{c},\pi)=0, \\& &\scriptsize m:=\perp;\ \text{else,}\ m\leftarrow \text{Dec}(sk_{1,vk_1},c_1) \\ & & & \stackrel{b'}{\longleftarrow}&b' \end{matrix} C ′ ( v k ∗ , ss k ∗ ) ← SigGen ( 1 κ ) x ′ σ ∗ = Sign ( ss k ∗ , ( c ∗ , π ∗ )) ⟶ v k ∗ ⟵ ( c , π , σ ) ⟵ ( c ∗ , π ∗ ) ⟶ σ ∗ ⟵ ( c , π , σ ) A ′ / C ( p k , s k ) ← Gen ′ ( 1 κ ) r ← { 0 , 1 } poly ( κ ) ; ( p k i 0 , s k i 0 ) i ∈ [ k ] ← Gen ( 1 κ ) ; ( p k i 1 , s k i 1 ) i ∈ [ k ] ← Gen ( 1 κ ) ; p k := ( p k 1 : k , 0/1 , r ) ; s k := ( s k 1 , 0/1 ) m / ⊥← Dec ′ ( s k , c ) if v k = v k ∗ ∧ Vrfy ( v k , ( c , π ) , σ ) = 1 , abort if Vrfy ( v k , ( c , π ) , σ ) = 0 ∨ V ( r , c , π ) = 0 , m :=⊥ ; else, m ← Dec ( s k 1 , v k 1 , c 1 ) c ∗ ← Enc ′ ( p k , m 0 ; w ∗ ) ( w i ∗ ) i ∈ [ k ] ← { 0 , 1 } poly ( κ ) ; ( c i ∗ ) i ∈ [ k ] ← Enc ( p k i , v k i ∗ , m 0 ; w i ∗ ) ; π ∗ ← P ( r , c ∗ , ( m 0 , w ∗ )) ; c ∗ = ( v k ∗ , c ∗ , π ∗ , σ ∗ ) m / ⊥← Dec ′ ( s k , c ) if v k = v k ∗ ∧ Vrfy ( v k , ( c , π ) , σ ) = 1 , abort if Vrfy ( v k , ( c , π ) , σ ) = 0 ∨ V ( r , c , π ) = 0 , m :=⊥ ; else, m ← Dec ( s k 1 , v k 1 , c 1 ) ⟶ p k ⟵ c = ( v k , c , π , σ ) ⟶ m / ⊥ ⟵ m 0 , m 1 ⟶ c ∗ ⟵ c = ( v k , c , π , σ ) ⟶ m / ⊥ ⟵ b ′ A c m 0 , m 1 c b ′ 于是,
∣ Pr [ Game 1 = 1 ] − Pr [ Game 0 = 1 ] ∣ ≤ Pr [ v k = v k ∗ ∧ Vrfy ( v k , ( c ⃗ , π ) , σ ) = 1 ] = Pr [ A ′ wins ] ≤ Adv SIG , A ′ SOT-UF-CMA ( κ ) ≤ Adv SIG SOT-UF-CMA ( κ ) \begin{aligned}&\left|\text{Pr}[\textbf{Game 1}=1]-\text{Pr}[\textbf{Game 0}=1]\right|\\\leq\ &\text{Pr}[vk=vk^*\wedge\text{Vrfy}(vk,(\vec{c},\pi),\sigma)=1] \\ =\ &\text{Pr}[\mathcal{A'}\text{ wins}]\\ \leq\ &\textbf{Adv}_{\text{SIG},\mathcal{A'}}^\text{SOT-UF-CMA}(\kappa)\\ \leq\ &\textbf{Adv}_{\text{SIG}}^\text{SOT-UF-CMA}(\kappa)\end{aligned} ≤ = ≤ ≤ ∣ Pr [ Game 1 = 1 ] − Pr [ Game 0 = 1 ] ∣ Pr [ v k = v k ∗ ∧ Vrfy ( v k , ( c , π ) , σ ) = 1 ] Pr [ A ′ wins ] Adv SIG , A ′ SOT-UF-CMA ( κ ) Adv SIG SOT-UF-CMA ( κ ) Game 2 . 如果 v k ≠ v k ∗ vk\ne vk^* v k = v k ∗ ,那么我们选择其中不同的那一比特(假设第 j j j 比特),使用那一比特代表的钥匙 s k j , v k j sk_{j,vk_j} s k j , v k j 进行解密。于是修改 Game 1 如下:
C A ( v k ∗ , s s k ∗ ) ← SigGen ( 1 κ ) ; ( p k , s k ) ← Gen ′ ( 1 κ ) ⟶ p k r ← { 0 , 1 } poly ( κ ) ; ( p k i 0 , s k i 0 ) ← Gen ( 1 κ ) , i ∈ [ k ] ; ( p k i 1 , s k i 1 ) ← Gen ( 1 κ ) , i ∈ [ k ] ; p k : = ( p k 1 : k , 0 / 1 , r ) ; s k : = ( s k 1 : k , 0 / 1 ) ⟵ c = ( v k , c ⃗ , π , σ ) decryption queries m / ⊥ ← Dec ′ ( s k , c ) ⟶ m / ⊥ if Vrfy ( v k , ( c ⃗ , π ) , σ ) = 0 ∨ V ( r , c ⃗ , π ) = 0 ∨ v k = v k ∗ , m : = ⊥ ; else, find j s.t. v k j ≠ v k j ∗ , m ← Dec ( s k j , v k j , c j ) ⟵ ( m 0 , m 1 ) choose m 0 , m 1 c ∗ ← Enc ′ ( p k , m 0 ; w ⃗ ∗ ) ⟶ c ∗ w i ∗ ← { 0 , 1 } poly ( κ ) , i ∈ [ k ] ; c i ∗ ← Enc ( p k i , v k i ∗ , m 0 ; w i ∗ ) , i ∈ [ k ] ; π ∗ ← P ( r , c ⃗ ∗ , ( m 0 , w ⃗ ∗ ) ) ; σ ∗ ← Sign ( s s k ∗ , ( c ⃗ ∗ , π ∗ ) ) c ∗ : = ( v k ∗ , c ⃗ ∗ , π ∗ , σ ∗ ) ⟵ c = ( v k , c ⃗ , π , σ ) decryption queries m / ⊥ ← Dec ′ ( s k , c ) ⟶ m / ⊥ if Vrfy ( v k , ( c ⃗ , π ) , σ ) = 0 ∨ V ( r , c ⃗ , π ) = 0 ∨ v k = v k ∗ , m : = ⊥ ; else, find j s.t. v k j ≠ v k j ∗ , m ← Dec ( s k j , v k j , c j ) return b ′ ⟵ b ′ compute b ′ \color{darkblue}\begin{matrix}\mathcal{C}& &\mathcal{A}\\ \scriptsize(vk^*,ssk^*)\leftarrow\text{SigGen}(1^\kappa);\\(pk,sk)\leftarrow\text{Gen}'(1^\kappa) & \stackrel{pk}{\longrightarrow}\\ \scriptsize r \leftarrow \{0,1\}^{\text{poly}(\kappa)};\\ \scriptsize (pk_{i0},sk_{i0})\leftarrow\text{Gen}(1^\kappa),i\in[k];\\ \scriptsize(pk_{i1},sk_{i1})\leftarrow\text{Gen}(1^\kappa),i\in[k];\\ \scriptsize pk:=(pk_{1:k,0/1},r);\color{red}sk:=(sk_{1:k,0/1}) \\ & \stackrel{c=(vk,\vec{c},\pi,\sigma)}{\longleftarrow}& \text{decryption queries}\\ m/\perp\leftarrow\text{Dec}'(sk,c) & \stackrel{m/\perp}{\longrightarrow}\\ \scriptsize \text{if } \text{Vrfy}(vk,(\vec{c},\pi),\sigma)=0\vee V(r,\vec{c},\pi)=0 \\\scriptsize \vee vk=vk^*,\ m:=\perp;\ \\\scriptsize\text{else, }{\color{red}\text{find } j \text{ s.t. }vk_j\ne vk^*_j},\\\scriptsize m\leftarrow \text{Dec}({\color{red}sk_{j,vk_j}},c_j) \\ & \stackrel{(m_0,m_1)}{\longleftarrow}& \text{choose }m_0,m_1\\ c^*\leftarrow \text{Enc}'(pk,m_0;\vec{w}^*)& \stackrel{c^*}{\longrightarrow}& \\ \scriptsize w_i^*\leftarrow\{0,1\}^{\text{poly}(\kappa)},i\in[k];\\ \scriptsize c_i^*\leftarrow\text{Enc}(pk_{i,vk^*_i},m_0;w_i^*),i\in[k];\\ \scriptsize \pi^*\leftarrow P(r,\vec{c}^*,(m_0,\vec{w}^*));\\ \scriptsize \sigma^*\leftarrow\text{Sign}(ssk^*,(\vec{c}^*,\pi^*))\\\scriptsize c^*:=(vk^*,\vec{c}^*,\pi^*,\sigma^*)\\ & \stackrel{c=(vk,\vec{c},\pi,\sigma)}{\longleftarrow}& \text{decryption queries}\\ m/\perp\leftarrow\text{Dec}'(sk,c) & \stackrel{m/\perp}{\longrightarrow}\\ \scriptsize \text{if } \text{Vrfy}(vk,(\vec{c},\pi),\sigma)=0\vee V(r,\vec{c},\pi)=0 \\\scriptsize \vee vk=vk^*,\ m:=\perp;\ \\\scriptsize\text{else, }{\color{red}\text{find } j \text{ s.t. }vk_j\ne vk^*_j},\\\scriptsize m\leftarrow \text{Dec}({\color{red}sk_{j,vk_j}},c_j) \\\text{return }b' & \stackrel{b'}{\longleftarrow} & \text{compute }b'\end{matrix} C ( v k ∗ , ss k ∗ ) ← SigGen ( 1 κ ) ; ( p k , s k ) ← Gen ′ ( 1 κ ) r ← { 0 , 1 } poly ( κ ) ; ( p k i 0 , s k i 0 ) ← Gen ( 1 κ ) , i ∈ [ k ] ; ( p k i 1 , s k i 1 ) ← Gen ( 1 κ ) , i ∈ [ k ] ; p k := ( p k 1 : k , 0/1 , r ) ; s k := ( s k 1 : k , 0/1 ) m / ⊥← Dec ′ ( s k , c ) if Vrfy ( v k , ( c , π ) , σ ) = 0 ∨ V ( r , c , π ) = 0 ∨ v k = v k ∗ , m :=⊥ ; else, find j s.t. v k j = v k j ∗ , m ← Dec ( s k j , v k j , c j ) c ∗ ← Enc ′ ( p k , m 0 ; w ∗ ) w i ∗ ← { 0 , 1 } poly ( κ ) , i ∈ [ k ] ; c i ∗ ← Enc ( p k i , v k i ∗ , m 0 ; w i ∗ ) , i ∈ [ k ] ; π ∗ ← P ( r , c ∗ , ( m 0 , w ∗ )) ; σ ∗ ← Sign ( ss k ∗ , ( c ∗ , π ∗ )) c ∗ := ( v k ∗ , c ∗ , π ∗ , σ ∗ ) m / ⊥← Dec ′ ( s k , c ) if Vrfy ( v k , ( c , π ) , σ ) = 0 ∨ V ( r , c , π ) = 0 ∨ v k = v k ∗ , m :=⊥ ; else, find j s.t. v k j = v k j ∗ , m ← Dec ( s k j , v k j , c j ) return b ′ ⟶ p k ⟵ c = ( v k , c , π , σ ) ⟶ m / ⊥ ⟵ ( m 0 , m 1 ) ⟶ c ∗ ⟵ c = ( v k , c , π , σ ) ⟶ m / ⊥ ⟵ b ′ A decryption queries choose m 0 , m 1 decryption queries compute b ′ 下面我们定义 Fake i \text{Fake}_i Fake i 事件:在 Game i i i 中敌手 A \mathcal{A} A 询问的密文 ( v k , c ⃗ , π , σ ) (vk,\vec{c},\pi,\sigma) ( v k , c , π , σ ) 通过了检测(即Vrfy ( v k , ( c ⃗ , π ) , σ ) = 1 ∧ V ( r , c ⃗ , π ) = 1 \text{Vrfy}(vk,(\vec{c},\pi),\sigma)=1 \wedge V(r,\vec{c},\pi)=1 Vrfy ( v k , ( c , π ) , σ ) = 1 ∧ V ( r , c , π ) = 1 ),但是 ∃ i , j ∈ [ k ] , Dec ( s k i , v k i , c i ) ≠ Dec ( s k j , v k j , c j ) \exist i,j\in[k], \text{Dec}(sk_{i,vk_i},c_i)\ne\text{Dec}(sk_{j,vk_j},c_j) ∃ i , j ∈ [ k ] , Dec ( s k i , v k i , c i ) = Dec ( s k j , v k j , c j ) 。
如果 Fake 事件发生,有两个比特 i , j i, j i , j 解密出来的明文不一样 。于是,这个 c ⃗ \vec{c} c 就一定不在 aNIZK 语言 L \mathcal{L} L 中,但是其能通过 V ( r , c ⃗ , π ) V(r,\vec{c},\pi) V ( r , c , π ) 验证,这就违背了 aNIZK 的 adaptive soundness。对于 Game 1 和 Game 2 来说,从敌手的层面完全看不出来 Fake 事件在 Game 1 中发生和在 Game 2 中发生的区别,因此 Pr [ Fake 1 ] = Pr [ Fake 2 ] \text{Pr}[\text{Fake}_1]=\text{Pr}[\text{Fake}_2] Pr [ Fake 1 ] = Pr [ Fake 2 ] 。 如果 Fake 事件不发生,对于任意合法的密文 c ⃗ ∈ L \vec{c}\in L c ∈ L ,每个比特解密出来的都是相同的明文。 如果 Fake 事件不发生,即对于所有通过检测的密文,都能保证 ∀ i , j ∈ [ k ] , Dec ( s k i , v k i , c i ) = Dec ( s k j , v k j , c j ) \forall i,j\in[k],\text{Dec}(sk_{i,vk_i},c_i)=\text{Dec}(sk_{j,vk_j},c_j) ∀ i , j ∈ [ k ] , Dec ( s k i , v k i , c i ) = Dec ( s k j , v k j , c j ) ,令 i = 1 i=1 i = 1 ,即 Dec ( s k 1 , v k 1 , c 1 ) = Dec ( s k j , v k j , c j ) \text{Dec}(sk_{1,vk_1},c_1)=\text{Dec}(sk_{j,vk_j},c_j) Dec ( s k 1 , v k 1 , c 1 ) = Dec ( s k j , v k j , c j ) ,于是 Game 1 和 Game 2 完全一样。故 Game 1 ∣ ¬ Fake 1 = Game 2 ∣ ¬ Fake 2 \textbf{Game 1}|\neg\text{Fake}_1= \textbf{Game 2}|\neg\text{Fake}_2 Game 1 ∣¬ Fake 1 = Game 2 ∣¬ Fake 2 ,即 Game 1 = 1 ∣ ¬ Fake 1 = Game 2 = 1 ∣ ¬ Fake 2 \textbf{Game 1}=1|\neg\text{Fake}_1= \textbf{Game 2}=1|\neg\text{Fake}_2 Game 1 = 1∣¬ Fake 1 = Game 2 = 1∣¬ Fake 2 。 于是,根据 Lecture 4 中 lemma 的推论,有
∣ Pr [ Game 2 = 1 ] − Pr [ Game 1 = 1 ] ∣ ≤ Pr [ Fake 0 / 1 ] = Pr [ Vrfy ( v k , ( c ⃗ , π ) , σ ) = 1 ∧ V ( r , c ⃗ , π ) = 1 ∧ c ∉ L ] ≤ Pr [ V ( r , c ⃗ , π ) = 1 ∧ c ∉ L ] ≤ Adv aNIZK sound ( κ ) \begin{aligned}&\left|\text{Pr}[\textbf{Game 2}=1]-\text{Pr}[\textbf{Game 1}=1]\right|\\\leq\ &\text{Pr}[\text{Fake}_{0/1}]\\=\ &\text{Pr}[\text{Vrfy}(vk,(\vec{c},\pi),\sigma)=1\wedge V(r,\vec{c},\pi)=1\wedge c\notin L]\\ \leq \ &\text{Pr}[V(r,\vec{c},\pi)=1\wedge c\notin L]\\ \leq\ &\textbf{Adv}_\text{aNIZK}^\text{sound}(\kappa)\end{aligned} ≤ = ≤ ≤ ∣ Pr [ Game 2 = 1 ] − Pr [ Game 1 = 1 ] ∣ Pr [ Fake 0/1 ] Pr [ Vrfy ( v k , ( c , π ) , σ ) = 1 ∧ V ( r , c , π ) = 1 ∧ c ∈ / L ] Pr [ V ( r , c , π ) = 1 ∧ c ∈ / L ] Adv aNIZK sound ( κ ) Game 3 . 将 Game 2 中的 aNIZK 换成仿真器 Sim \text{Sim} Sim 。
C A ( v k ∗ , s s k ∗ ) ← SigGen ( 1 κ ) ; ( p k , s k ) ← Gen ′ ( 1 κ ) ⟶ p k r ← Sim 1 ( 1 κ ) ; ( p k i 0 , s k i 0 ) ← Gen ( 1 κ ) , i ∈ [ k ] ; ( p k i 1 , s k i 1 ) ← Gen ( 1 κ ) , i ∈ [ k ] ; p k : = ( p k 1 : k , 0 / 1 , r ) ; s k : = ( s k 1 : k , 0 / 1 ) ⟵ c = ( v k , c ⃗ , π , σ ) decryption queries m / ⊥ ← Dec ′ ( s k , c ) ⟶ m / ⊥ if Vrfy ( v k , ( c ⃗ , π ) , σ ) = 0 ∨ V ( r , c ⃗ , π ) = 0 ∨ v k = v k ∗ , m : = ⊥ ; else, find j s.t. v k j ≠ v k j ∗ , m ← Dec ( s k j , v k j , c j ) ⟵ ( m 0 , m 1 ) choose m 0 , m 1 c ∗ ← Enc ′ ( p k , m 0 ; w ⃗ ∗ ) ⟶ c ∗ w i ∗ ← { 0 , 1 } poly ( κ ) , i ∈ [ k ] ; c i ∗ ← Enc ( p k i , v k i ∗ , m 0 ; w i ∗ ) , i ∈ [ k ] ; π ∗ ← Sim 2 ( r , c ⃗ ∗ ) ; σ ∗ ← Sign ( s s k ∗ , ( c ⃗ ∗ , π ∗ ) ) c ∗ : = ( v k ∗ , c ⃗ ∗ , π ∗ , σ ∗ ) ⟵ c = ( v k , c ⃗ , π , σ ) decryption queries m / ⊥ ← Dec ′ ( s k , c ) ⟶ m / ⊥ if Vrfy ( v k , ( c ⃗ , π ) , σ ) = 0 ∨ V ( r , c ⃗ , π ) = 0 ∨ v k = v k ∗ , m : = ⊥ ; else, find j s.t. v k j ≠ v k j ∗ , m ← Dec ( s k j , v k j , c j ) return b ′ ⟵ b ′ compute b ′ \color{darkblue}\begin{matrix}\mathcal{C}& &\mathcal{A}\\ \scriptsize(vk^*,ssk^*)\leftarrow\text{SigGen}(1^\kappa);\\(pk,sk)\leftarrow\text{Gen}'(1^\kappa) & \stackrel{pk}{\longrightarrow}\\ \color{red}\scriptsize r \leftarrow \text{Sim}_1(1^\kappa);\\ \scriptsize (pk_{i0},sk_{i0})\leftarrow\text{Gen}(1^\kappa),i\in[k];\\ \scriptsize(pk_{i1},sk_{i1})\leftarrow\text{Gen}(1^\kappa),i\in[k];\\ \scriptsize pk:=(pk_{1:k,0/1},r);sk:=(sk_{1:k,0/1}) \\ & \stackrel{c=(vk,\vec{c},\pi,\sigma)}{\longleftarrow}& \text{decryption queries}\\ m/\perp\leftarrow\text{Dec}'(sk,c) & \stackrel{m/\perp}{\longrightarrow}\\ \scriptsize \text{if } \text{Vrfy}(vk,(\vec{c},\pi),\sigma)=0\vee V(r,\vec{c},\pi)=0 \\\scriptsize \vee vk=vk^*,\ m:=\perp;\ \\\scriptsize\text{else, }\text{find } j \text{ s.t. }vk_j\ne vk^*_j,\\\scriptsize m\leftarrow \text{Dec}(sk_{j,vk_j},c_j) \\ & \stackrel{(m_0,m_1)}{\longleftarrow}& \text{choose }m_0,m_1\\ c^*\leftarrow \text{Enc}'(pk,m_0;\vec{w}^*)& \stackrel{c^*}{\longrightarrow}& \\ \scriptsize w_i^*\leftarrow\{0,1\}^{\text{poly}(\kappa)},i\in[k];\\ \scriptsize c_i^*\leftarrow\text{Enc}(pk_{i,vk^*_i},m_0;w_i^*),i\in[k];\\ \scriptsize \color{red}\pi^*\leftarrow \text{Sim}_2(r,\vec{c}^*);\\ \scriptsize \sigma^*\leftarrow\text{Sign}(ssk^*,(\vec{c}^*,\pi^*))\\\scriptsize c^*:=(vk^*,\vec{c}^*,\pi^*,\sigma^*)\\ & \stackrel{c=(vk,\vec{c},\pi,\sigma)}{\longleftarrow}& \text{decryption queries}\\ m/\perp\leftarrow\text{Dec}'(sk,c) & \stackrel{m/\perp}{\longrightarrow}\\ \scriptsize \text{if } \text{Vrfy}(vk,(\vec{c},\pi),\sigma)=0\vee V(r,\vec{c},\pi)=0 \\\scriptsize \vee vk=vk^*,\ m:=\perp;\ \\\scriptsize\text{else, }\text{find } j \text{ s.t. }vk_j\ne vk^*_j,\\\scriptsize m\leftarrow \text{Dec}(sk_{j,vk_j},c_j) \\\text{return }b' & \stackrel{b'}{\longleftarrow} & \text{compute }b'\end{matrix} C ( v k ∗ , ss k ∗ ) ← SigGen ( 1 κ ) ; ( p k , s k ) ← Gen ′ ( 1 κ ) r ← Sim 1 ( 1 κ ) ; ( p k i 0 , s k i 0 ) ← Gen ( 1 κ ) , i ∈ [ k ] ; ( p k i 1 , s k i 1 ) ← Gen ( 1 κ ) , i ∈ [ k ] ; p k := ( p k 1 : k , 0/1 , r ) ; s k := ( s k 1 : k , 0/1 ) m / ⊥← Dec ′ ( s k , c ) if Vrfy ( v k , ( c , π ) , σ ) = 0 ∨ V ( r , c , π ) = 0 ∨ v k = v k ∗ , m :=⊥ ; else, find j s.t. v k j = v k j ∗ , m ← Dec ( s k j , v k j , c j ) c ∗ ← Enc ′ ( p k , m 0 ; w ∗ ) w i ∗ ← { 0 , 1 } poly ( κ ) , i ∈ [ k ] ; c i ∗ ← Enc ( p k i , v k i ∗ , m 0 ; w i ∗ ) , i ∈ [ k ] ; π ∗ ← Sim 2 ( r , c ∗ ) ; σ ∗ ← Sign ( ss k ∗ , ( c ∗ , π ∗ )) c ∗ := ( v k ∗ , c ∗ , π ∗ , σ ∗ ) m / ⊥← Dec ′ ( s k , c ) if Vrfy ( v k , ( c , π ) , σ ) = 0 ∨ V ( r , c , π ) = 0 ∨ v k = v k ∗ , m :=⊥ ; else, find j s.t. v k j = v k j ∗ , m ← Dec ( s k j , v k j , c j ) return b ′ ⟶ p k ⟵ c = ( v k , c , π , σ ) ⟶ m / ⊥ ⟵ ( m 0 , m 1 ) ⟶ c ∗ ⟵ c = ( v k , c , π , σ ) ⟶ m / ⊥ ⟵ b ′ A decryption queries choose m 0 , m 1 decryption queries compute b ′ 用 Lecture 4 中 NY-PKE 的 CCA1 安全性证明的 Game 0 到 Game 1 一步完全相同的方法,我们可以得到:
∣ Pr [ Game 3 = 1 ] − Pr [ Game 2 = 1 ] ∣ ≤ Adv aNIZK ZK ( κ ) \left|\text{Pr}[\textbf{Game 3}=1]-\text{Pr}[\textbf{Game 2}=1]\right|\leq\textbf{Adv}_\text{aNIZK}^\text{ZK}(\kappa) ∣ Pr [ Game 3 = 1 ] − Pr [ Game 2 = 1 ] ∣ ≤ Adv aNIZK ZK ( κ ) Game 4 . 将 m 0 m_0 m 0 替换成 m 1 m_1 m 1 。
C A ( v k ∗ , s s k ∗ ) ← SigGen ( 1 κ ) ; ( p k , s k ) ← Gen ′ ( 1 κ ) ⟶ p k r ← Sim 1 ( 1 κ ) ; ( p k i 0 , s k i 0 ) ← Gen ( 1 κ ) , i ∈ [ k ] ; ( p k i 1 , s k i 1 ) ← Gen ( 1 κ ) , i ∈ [ k ] ; p k : = ( p k 1 : k , 0 / 1 , r ) ; s k : = ( s k 1 : k , 0 / 1 ) ⟵ c = ( v k , c ⃗ , π , σ ) decryption queries m / ⊥ ← Dec ′ ( s k , c ) ⟶ m / ⊥ if Vrfy ( v k , ( c ⃗ , π ) , σ ) = 0 ∨ V ( r , c ⃗ , π ) = 0 ∨ v k = v k ∗ , m : = ⊥ ; else, find j s.t. v k j ≠ v k j ∗ , m ← Dec ( s k j , v k j , c j ) ⟵ ( m 0 , m 1 ) choose m 0 , m 1 c ∗ ← Enc ′ ( p k , m 1 ; w ⃗ ∗ ) ⟶ c ∗ w i ∗ ← { 0 , 1 } poly ( κ ) , i ∈ [ k ] ; c i ∗ ← Enc ( p k i , v k i ∗ , m 1 ; w i ∗ ) , i ∈ [ k ] ; π ∗ ← Sim 2 ( r , c ⃗ ∗ ) ; σ ∗ ← Sign ( s s k ∗ , ( c ⃗ ∗ , π ∗ ) ) c ∗ : = ( v k ∗ , c ⃗ ∗ , π ∗ , σ ∗ ) ⟵ c = ( v k , c ⃗ , π , σ ) decryption queries m / ⊥ ← Dec ′ ( s k , c ) ⟶ m / ⊥ if Vrfy ( v k , ( c ⃗ , π ) , σ ) = 0 ∨ V ( r , c ⃗ , π ) = 0 ∨ v k = v k ∗ , m : = ⊥ ; else, find j s.t. v k j ≠ v k j ∗ , m ← Dec ( s k j , v k j , c j ) return b ′ ⟵ b ′ compute b ′ \color{darkblue}\begin{matrix}\mathcal{C}& &\mathcal{A}\\ \scriptsize(vk^*,ssk^*)\leftarrow\text{SigGen}(1^\kappa);\\(pk,sk)\leftarrow\text{Gen}'(1^\kappa) & \stackrel{pk}{\longrightarrow}\\ \scriptsize r \leftarrow \text{Sim}_1(1^\kappa);\\ \scriptsize (pk_{i0},sk_{i0})\leftarrow\text{Gen}(1^\kappa),i\in[k];\\ \scriptsize(pk_{i1},sk_{i1})\leftarrow\text{Gen}(1^\kappa),i\in[k];\\\scriptsize pk:=(pk_{1:k,0/1},r);sk:=(sk_{1:k,0/1}) \\ & \stackrel{c=(vk,\vec{c},\pi,\sigma)}{\longleftarrow}& \text{decryption queries}\\ m/\perp\leftarrow\text{Dec}'(sk,c) & \stackrel{m/\perp}{\longrightarrow}\\ \scriptsize \text{if } \text{Vrfy}(vk,(\vec{c},\pi),\sigma)=0\vee V(r,\vec{c},\pi)=0 \\\scriptsize \vee vk=vk^*,\ m:=\perp;\ \\\scriptsize\text{else, }\text{find } j \text{ s.t. }vk_j\ne vk^*_j,\\\scriptsize m\leftarrow \text{Dec}(sk_{j,vk_j},c_j) \\ & \stackrel{(m_0,m_1)}{\longleftarrow}& \text{choose }m_0,m_1\\ c^*\leftarrow \text{Enc}'(pk,{\color{red}m_1};\vec{w}^*)& \stackrel{c^*}{\longrightarrow}& \\ \scriptsize w_i^*\leftarrow\{0,1\}^{\text{poly}(\kappa)},i\in[k];\\ \scriptsize c_i^*\leftarrow\text{Enc}(pk_{i,vk^*_i},{\color{red}m_1};w_i^*),i\in[k];\\ \scriptsize \pi^*\leftarrow \text{Sim}_2(r,\vec{c}^*);\\ \scriptsize \sigma^*\leftarrow\text{Sign}(ssk^*,(\vec{c}^*,\pi^*))\\\scriptsize c^*:=(vk^*,\vec{c}^*,\pi^*,\sigma^*)\\ & \stackrel{c=(vk,\vec{c},\pi,\sigma)}{\longleftarrow}& \text{decryption queries}\\ m/\perp\leftarrow\text{Dec}'(sk,c) & \stackrel{m/\perp}{\longrightarrow}\\ \scriptsize \text{if } \text{Vrfy}(vk,(\vec{c},\pi),\sigma)=0\vee V(r,\vec{c},\pi)=0 \\\scriptsize \vee vk=vk^*,\ m:=\perp;\ \\\scriptsize\text{else, }\text{find } j \text{ s.t. }vk_j\ne vk^*_j,\\\scriptsize m\leftarrow \text{Dec}(sk_{j,vk_j},c_j) \\\text{return }b' & \stackrel{b'}{\longleftarrow} & \text{compute }b'\end{matrix} C ( v k ∗ , ss k ∗ ) ← SigGen ( 1 κ ) ; ( p k , s k ) ← Gen ′ ( 1 κ ) r ← Sim 1 ( 1 κ ) ; ( p k i 0 , s k i 0 ) ← Gen ( 1 κ ) , i ∈ [ k ] ; ( p k i 1 , s k i 1 ) ← Gen ( 1 κ ) , i ∈ [ k ] ; p k := ( p k 1 : k , 0/1 , r ) ; s k := ( s k 1 : k , 0/1 ) m / ⊥← Dec ′ ( s k , c ) if Vrfy ( v k , ( c , π ) , σ ) = 0 ∨ V ( r , c , π ) = 0 ∨ v k = v k ∗ , m :=⊥ ; else, find j s.t. v k j = v k j ∗ , m ← Dec ( s k j , v k j , c j ) c ∗ ← Enc ′ ( p k , m 1 ; w ∗ ) w i ∗ ← { 0 , 1 } poly ( κ ) , i ∈ [ k ] ; c i ∗ ← Enc ( p k i , v k i ∗ , m 1 ; w i ∗ ) , i ∈ [ k ] ; π ∗ ← Sim 2 ( r , c ∗ ) ; σ ∗ ← Sign ( ss k ∗ , ( c ∗ , π ∗ )) c ∗ := ( v k ∗ , c ∗ , π ∗ , σ ∗ ) m / ⊥← Dec ′ ( s k , c ) if Vrfy ( v k , ( c , π ) , σ ) = 0 ∨ V ( r , c , π ) = 0 ∨ v k = v k ∗ , m :=⊥ ; else, find j s.t. v k j = v k j ∗ , m ← Dec ( s k j , v k j , c j ) return b ′ ⟶ p k ⟵ c = ( v k , c , π , σ ) ⟶ m / ⊥ ⟵ ( m 0 , m 1 ) ⟶ c ∗ ⟵ c = ( v k , c , π , σ ) ⟶ m / ⊥ ⟵ b ′ A decryption queries choose m 0 , m 1 decryption queries compute b ′ 下面我们证明,如果有敌手 A \mathcal{A} A 在 Game 3 和 Game 4 输出 1 的概率不可忽略的不同,那么我们可以利用其攻破 PKE 的 CPA 安全性(可以类比 LorR-CPA 安全性,即确定一个 b b b ,用 k k k 个不同的密钥对 m b m_b m b 进行加密,这个安全性的 bound 应该是 k Adv PKE CPA ( κ ) k\textbf{Adv}_\text{PKE}^\text{CPA}(\kappa) k Adv PKE CPA ( κ ) )。
C ′ A ′ / C A b ← { 0 , 1 } ( p k i , s k i ) i ∈ [ k ] ← Gen ( 1 κ ) ⟶ p k 1 : k ( p k , s k ) ← Gen ′ ( 1 κ ) ⟶ p k r ← Sim 1 ( 1 κ ) ; ( p k i ′ , s k i ′ ) i ∈ [ k ] ← Gen ( 1 κ ) ; p k i , v k i ∗ : = p k i , p k i , 1 − v k i ∗ = p k i ′ p k : = ( p k 1 : k , 0 / 1 , r ) ; s k : = ( s k 1 : k , 0 / 1 ) ⟵ c = ( v k , c ⃗ , π , σ ) c m / ⊥ ← Dec ′ ( s k , c ) ⟶ m / ⊥ if v k = v k ∗ ∨ Vrfy ( v k , ( c ⃗ , π ) , σ ) = 0 ∨ V ( r , c ⃗ , π ) = 0 , m : = ⊥ ; else, find j s.t. v k j ≠ v k j ∗ , m ← Dec ( s k j , v k j , c j ) ⟵ m 0 , m 1 m 0 , m 1 c ∗ ← Enc ′ ( p k , m ; w ⃗ ∗ ) ⟶ c ∗ ( w i ∗ ) i ∈ [ k ] ← { 0 , 1 } poly ( κ ) ⟵ m 0 , m 1 ( c i ∗ ) i ∈ [ k ] ← Enc ( p k i , v k i ∗ , m 0 ; w i ∗ ) ⟶ c ⃗ π ∗ ← Sim 2 ( r , c ⃗ ∗ ) ; σ ∗ = Sign ( s s k ∗ , ( c ⃗ ∗ , π ∗ ) ) c ∗ : = ( v k ∗ , c ⃗ ∗ , π ∗ , σ ∗ ) ⟵ c = ( v k , c ⃗ , π , σ ) c m / ⊥ ← Dec ′ ( s k , c ) ⟶ m / ⊥ if v k = v k ∗ ∨ Vrfy ( v k , ( c ⃗ , π ) , σ ) = 0 ∨ V ( r , c ⃗ , π ) = 0 , m : = ⊥ ; else, find j s.t. v k j ≠ v k j ∗ , m ← Dec ( s k j , v k j , c j ) ⟵ b ′ ⟵ b ′ b ′ \color{darkblue}\small\begin{matrix}\mathcal{C'}& &\mathcal{A'/C} & &\mathcal{A}\\b\leftarrow\{0,1\}\\\scriptsize (pk_i,sk_i)_{i\in[k]}\leftarrow\text{Gen}(1^\kappa) & \stackrel{pk_{1:k}}{\longrightarrow} & (pk,sk)\leftarrow\text{Gen}'(1^\kappa)&\stackrel{pk}{\longrightarrow}\\ & &\scriptsize r \leftarrow \text{Sim}_1(1^\kappa);\\ & &\scriptsize (pk_{i}',sk_{i}')_{i\in[k]}\leftarrow\text{Gen}(1^\kappa);\\ & &\scriptsize pk_{i,vk_i^*}:=pk_i,pk_{i,1-vk_i^*}=pk_i'\\& &\scriptsize pk:=(pk_{1:k,0/1},r);sk:=(sk_{1:k,0/1}) \\ & & & \stackrel{c=(vk,\vec{c},\pi,\sigma)}{\longleftarrow}& c\\ & & m/\perp\leftarrow\text{Dec}'(sk,c) &\stackrel{m/\perp}{\longrightarrow}\\& &\scriptsize\text{if } vk=vk^*\vee\text{Vrfy}(vk,(\vec{c},\pi),\sigma)=0 \\& &\scriptsize \vee V(r,\vec{c},\pi)=0,\ m:=\perp;\ \\& &\scriptsize\text{else, }\text{find } j \text{ s.t. }vk_j\ne vk^*_j,\\& &\scriptsize m\leftarrow \text{Dec}(sk_{j,vk_j},c_j) \\ & & & \stackrel{m_0,m_1}{\longleftarrow}& m_0,m_1\\& & c^*\leftarrow\text{Enc}'(pk,m;\vec{w}^*) &\stackrel{c^*}{\longrightarrow}\\\scriptsize(w_i^*)_{i\in[k]}\leftarrow\{0,1\}^\text{poly}(\kappa) & \stackrel{m_0,m_1}{\longleftarrow}&\\ \scriptsize (c_i^*)_{i\in[k]}\leftarrow\text{Enc}(pk_{i,vk^*_i},m_0;w_i^*)& \stackrel{\vec{c}}{\longrightarrow}& \scriptsize \pi^*\leftarrow \text{Sim}_2(r,\vec{c}^*); \\& &\scriptsize\sigma^*=\text{Sign}(ssk^*,(\vec{c}^*,\pi^*)) \\ & & \scriptsize c^*:=(vk^*,\vec{c}^*,\pi^*,\sigma^*)\\ & & & \stackrel{c=(vk,\vec{c},\pi,\sigma)}{\longleftarrow}& c\\ & & m/\perp\leftarrow\text{Dec}'(sk,c) &\stackrel{m/\perp}{\longrightarrow}\\& &\scriptsize\text{if } vk=vk^*\vee\text{Vrfy}(vk,(\vec{c},\pi),\sigma)=0 \\& &\scriptsize \vee V(r,\vec{c},\pi)=0,\ m:=\perp;\ \\& &\scriptsize\text{else, }\text{find } j \text{ s.t. }vk_j\ne vk^*_j,\\& &\scriptsize m\leftarrow \text{Dec}(sk_{j,vk_j},c_j) \\&\stackrel{b'}{\longleftarrow} & &\stackrel{b'}{\longleftarrow} & b' \end{matrix} C ′ b ← { 0 , 1 } ( p k i , s k i ) i ∈ [ k ] ← Gen ( 1 κ ) ( w i ∗ ) i ∈ [ k ] ← { 0 , 1 } poly ( κ ) ( c i ∗ ) i ∈ [ k ] ← Enc ( p k i , v k i ∗ , m 0 ; w i ∗ ) ⟶ p k 1 : k ⟵ m 0 , m 1 ⟶ c ⟵ b ′ A ′ / C ( p k , s k ) ← Gen ′ ( 1 κ ) r ← Sim 1 ( 1 κ ) ; ( p k i ′ , s k i ′ ) i ∈ [ k ] ← Gen ( 1 κ ) ; p k i , v k i ∗ := p k i , p k i , 1 − v k i ∗ = p k i ′ p k := ( p k 1 : k , 0/1 , r ) ; s k := ( s k 1 : k , 0/1 ) m / ⊥← Dec ′ ( s k , c ) if v k = v k ∗ ∨ Vrfy ( v k , ( c , π ) , σ ) = 0 ∨ V ( r , c , π ) = 0 , m :=⊥ ; else, find j s.t. v k j = v k j ∗ , m ← Dec ( s k j , v k j , c j ) c ∗ ← Enc ′ ( p k , m ; w ∗ ) π ∗ ← Sim 2 ( r , c ∗ ) ; σ ∗ = Sign ( ss k ∗ , ( c ∗ , π ∗ )) c ∗ := ( v k ∗ , c ∗ , π ∗ , σ ∗ ) m / ⊥← Dec ′ ( s k , c ) if v k = v k ∗ ∨ Vrfy ( v k , ( c , π ) , σ ) = 0 ∨ V ( r , c , π ) = 0 , m :=⊥ ; else, find j s.t. v k j = v k j ∗ , m ← Dec ( s k j , v k j , c j ) ⟶ p k ⟵ c = ( v k , c , π , σ ) ⟶ m / ⊥ ⟵ m 0 , m 1 ⟶ c ∗ ⟵ c = ( v k , c , π , σ ) ⟶ m / ⊥ ⟵ b ′ A c m 0 , m 1 c b ′ 当 b = 0 b=0 b = 0 时,相当于模拟 Game 3 ;当 b = 1 b=1 b = 1 时,相当于模拟 Game 4 。于是,
∣ Pr [ Game 4 = 1 ] − Pr [ Game 3 = 1 ] ∣ = Pr [ b ′ = 1 ∣ b = 1 ] − Pr [ b ′ = 1 ∣ b = 0 ] ≤ k Adv PKE , A ′ CPA ( κ ) ≤ k Adv PKE CPA ( κ ) \begin{aligned}&\left|\text{Pr}[\textbf{Game 4}=1]-\text{Pr}[\textbf{Game 3}=1]\right|\\=\ &\text{Pr}[b'=1|b=1]-\text{Pr}[b'=1|b=0] \\ \leq \ &k\textbf{Adv}_{\text{PKE},\mathcal{A}'}^\text{CPA}(\kappa)\\ \leq \ &k\textbf{Adv}_{\text{PKE}}^\text{CPA}(\kappa)\end{aligned} = ≤ ≤ ∣ Pr [ Game 4 = 1 ] − Pr [ Game 3 = 1 ] ∣ Pr [ b ′ = 1∣ b = 1 ] − Pr [ b ′ = 1∣ b = 0 ] k Adv PKE , A ′ CPA ( κ ) k Adv PKE CPA ( κ ) Game 5 . 类似 Game 3 的逆操作,将仿真器变回原始情况。
C A ( v k ∗ , s s k ∗ ) ← SigGen ( 1 κ ) ; ( p k , s k ) ← Gen ′ ( 1 κ ) ⟶ p k r ← { 0 , 1 } poly ( κ ) ; ( p k i 0 , s k i 0 ) ← Gen ( 1 κ ) , i ∈ [ k ] ; ( p k i 1 , s k i 1 ) ← Gen ( 1 κ ) , i ∈ [ k ] ; p k : = ( p k 1 : k , 0 / 1 , r ) ; s k : = ( s k 1 : k , 0 / 1 ) ⟵ c = ( v k , c ⃗ , π , σ ) decryption queries m / ⊥ ← Dec ′ ( s k , c ) ⟶ m / ⊥ if Vrfy ( v k , ( c ⃗ , π ) , σ ) = 0 ∨ V ( r , c ⃗ , π ) = 0 ∨ v k = v k ∗ , m : = ⊥ ; else, find j s.t. v k j ≠ v k j ∗ , m ← Dec ( s k j , v k j , c j ) ⟵ ( m 0 , m 1 ) choose m 0 , m 1 c ∗ ← Enc ′ ( p k , m 1 ; w ⃗ ∗ ) ⟶ c ∗ w i ∗ ← { 0 , 1 } poly ( κ ) , i ∈ [ k ] ; c i ∗ ← Enc ( p k i , v k i ∗ , m 1 ; w i ∗ ) , i ∈ [ k ] ; π ∗ ← P ( r , c ⃗ ∗ , ( m 1 , w ⃗ ∗ ) ) ; σ ∗ ← Sign ( s s k ∗ , ( c ⃗ ∗ , π ∗ ) ) c ∗ : = ( v k ∗ , c ⃗ ∗ , π ∗ , σ ∗ ) ⟵ c = ( v k , c ⃗ , π , σ ) decryption queries m / ⊥ ← Dec ′ ( s k , c ) ⟶ m / ⊥ if Vrfy ( v k , ( c ⃗ , π ) , σ ) = 0 ∨ V ( r , c ⃗ , π ) = 0 ∨ v k = v k ∗ , m : = ⊥ ; else, find j s.t. v k j ≠ v k j ∗ , m ← Dec ( s k j , v k j , c j ) return b ′ ⟵ b ′ compute b ′ \color{darkblue}\begin{matrix}\mathcal{C}& &\mathcal{A}\\ \scriptsize(vk^*,ssk^*)\leftarrow\text{SigGen}(1^\kappa);\\(pk,sk)\leftarrow\text{Gen}'(1^\kappa) & \stackrel{pk}{\longrightarrow}\\ \color{red}\scriptsize r \leftarrow \{0,1\}^{\text{poly}(\kappa)};\\ \scriptsize (pk_{i0},sk_{i0})\leftarrow\text{Gen}(1^\kappa),i\in[k];\\ \scriptsize(pk_{i1},sk_{i1})\leftarrow\text{Gen}(1^\kappa),i\in[k];\\ \scriptsize pk:=(pk_{1:k,0/1},r);sk:=(sk_{1:k,0/1}) \\ & \stackrel{c=(vk,\vec{c},\pi,\sigma)}{\longleftarrow}& \text{decryption queries}\\ m/\perp\leftarrow\text{Dec}'(sk,c) & \stackrel{m/\perp}{\longrightarrow}\\ \scriptsize \text{if } \text{Vrfy}(vk,(\vec{c},\pi),\sigma)=0\vee V(r,\vec{c},\pi)=0 \\\scriptsize \vee vk=vk^*,\ m:=\perp;\ \\\scriptsize\text{else, }\text{find } j \text{ s.t. }vk_j\ne vk^*_j,\\\scriptsize m\leftarrow \text{Dec}(sk_{j,vk_j},c_j) \\ & \stackrel{(m_0,m_1)}{\longleftarrow}& \text{choose }m_0,m_1\\ c^*\leftarrow \text{Enc}'(pk,m_1;\vec{w}^*)& \stackrel{c^*}{\longrightarrow}& \\ \scriptsize w_i^*\leftarrow\{0,1\}^{\text{poly}(\kappa)},i\in[k];\\ \scriptsize c_i^*\leftarrow\text{Enc}(pk_{i,vk^*_i},m_1;w_i^*),i\in[k];\\ \scriptsize \color{red}\pi^*\leftarrow P(r,\vec{c}^*,(m_1,\vec{w}^*));\\ \scriptsize \sigma^*\leftarrow\text{Sign}(ssk^*,(\vec{c}^*,\pi^*))\\\scriptsize c^*:=(vk^*,\vec{c}^*,\pi^*,\sigma^*)\\ & \stackrel{c=(vk,\vec{c},\pi,\sigma)}{\longleftarrow}& \text{decryption queries}\\ m/\perp\leftarrow\text{Dec}'(sk,c) & \stackrel{m/\perp}{\longrightarrow}\\ \scriptsize \text{if } \text{Vrfy}(vk,(\vec{c},\pi),\sigma)=0\vee V(r,\vec{c},\pi)=0 \\\scriptsize \vee vk=vk^*,\ m:=\perp;\ \\\scriptsize\text{else, }\text{find } j \text{ s.t. }vk_j\ne vk^*_j,\\\scriptsize m\leftarrow \text{Dec}(sk_{j,vk_j},c_j) \\\text{return }b' & \stackrel{b'}{\longleftarrow} & \text{compute }b'\end{matrix} C ( v k ∗ , ss k ∗ ) ← SigGen ( 1 κ ) ; ( p k , s k ) ← Gen ′ ( 1 κ ) r ← { 0 , 1 } poly ( κ ) ; ( p k i 0 , s k i 0 ) ← Gen ( 1 κ ) , i ∈ [ k ] ; ( p k i 1 , s k i 1 ) ← Gen ( 1 κ ) , i ∈ [ k ] ; p k := ( p k 1 : k , 0/1 , r ) ; s k := ( s k 1 : k , 0/1 ) m / ⊥← Dec ′ ( s k , c ) if Vrfy ( v k , ( c , π ) , σ ) = 0 ∨ V ( r , c , π ) = 0 ∨ v k = v k ∗ , m :=⊥ ; else, find j s.t. v k j = v k j ∗ , m ← Dec ( s k j , v k j , c j ) c ∗ ← Enc ′ ( p k , m 1 ; w ∗ ) w i ∗ ← { 0 , 1 } poly ( κ ) , i ∈ [ k ] ; c i ∗ ← Enc ( p k i , v k i ∗ , m 1 ; w i ∗ ) , i ∈ [ k ] ; π ∗ ← P ( r , c ∗ , ( m 1 , w ∗ )) ; σ ∗ ← Sign ( ss k ∗ , ( c ∗ , π ∗ )) c ∗ := ( v k ∗ , c ∗ , π ∗ , σ ∗ ) m / ⊥← Dec ′ ( s k , c ) if Vrfy ( v k , ( c , π ) , σ ) = 0 ∨ V ( r , c , π ) = 0 ∨ v k = v k ∗ , m :=⊥ ; else, find j s.t. v k j = v k j ∗ , m ← Dec ( s k j , v k j , c j ) return b ′ ⟶ p k ⟵ c = ( v k , c , π , σ ) ⟶ m / ⊥ ⟵ ( m 0 , m 1 ) ⟶ c ∗ ⟵ c = ( v k , c , π , σ ) ⟶ m / ⊥ ⟵ b ′ A decryption queries choose m 0 , m 1 decryption queries compute b ′ 类似从 Game 2 到 Game 3 的推导,有
∣ Pr [ Game 5 = 1 ] − Pr [ Game 4 = 1 ] ∣ ≤ Adv aNIZK ZK ( κ ) \left|\text{Pr}[\textbf{Game 5}=1]-\text{Pr}[\textbf{Game 4}=1]\right|\leq\textbf{Adv}_\text{aNIZK}^\text{ZK}(\kappa) ∣ Pr [ Game 5 = 1 ] − Pr [ Game 4 = 1 ] ∣ ≤ Adv aNIZK ZK ( κ ) Game 6 . 类似 Game 2 的逆操作。
C A ( v k ∗ , s s k ∗ ) ← SigGen ( 1 κ ) ; ( p k , s k ) ← Gen ′ ( 1 κ ) ⟶ p k r ← { 0 , 1 } poly ( κ ) ; ( p k i 0 , s k i 0 ) ← Gen ( 1 κ ) , i ∈ [ k ] ; ( p k i 1 , s k i 1 ) ← Gen ( 1 κ ) , i ∈ [ k ] ; p k : = ( p k 1 : k , 0 / 1 , r ) ; s k : = ( s k 1 , 0 / 1 ) ⟵ c = ( v k , c ⃗ , π , σ ) decryption queries m / ⊥ ← Dec ′ ( s k , c ) ⟶ m / ⊥ if Vrfy ( v k , ( c ⃗ , π ) , σ ) = 0 ∨ V ( r , c ⃗ , π ) = 0 ∨ v k = v k ∗ , m : = ⊥ ; else, m ← Dec ( s k 1 , v k 1 , c 1 ) ⟵ ( m 0 , m 1 ) choose m 0 , m 1 c ∗ ← Enc ′ ( p k , m 1 ; w ⃗ ∗ ) ⟶ c ∗ w i ∗ ← { 0 , 1 } poly ( κ ) , i ∈ [ k ] ; c i ∗ ← Enc ( p k i , v k i ∗ , m 1 ; w i ∗ ) , i ∈ [ k ] ; π ∗ ← P ( r , c ⃗ ∗ , ( m 1 , w ⃗ ∗ ) ) ; σ ∗ ← Sign ( s s k ∗ , ( c ⃗ ∗ , π ∗ ) ) c ∗ : = ( v k ∗ , c ⃗ ∗ , π ∗ , σ ∗ ) ⟵ c = ( v k , c ⃗ , π , σ ) decryption queries m / ⊥ ← Dec ′ ( s k , c ) ⟶ m / ⊥ if Vrfy ( v k , ( c ⃗ , π ) , σ ) = 0 ∨ V ( r , c ⃗ , π ) = 0 ∨ v k = v k ∗ , m : = ⊥ ; m ← Dec ( s k 1 , v k 1 , c 1 ) return b ′ ⟵ b ′ compute b ′ \color{darkblue}\begin{matrix}\mathcal{C}& &\mathcal{A}\\ \scriptsize(vk^*,ssk^*)\leftarrow\text{SigGen}(1^\kappa);\\(pk,sk)\leftarrow\text{Gen}'(1^\kappa) & \stackrel{pk}{\longrightarrow}\\ \scriptsize r \leftarrow \{0,1\}^{\text{poly}(\kappa)};\\ \scriptsize (pk_{i0},sk_{i0})\leftarrow\text{Gen}(1^\kappa),i\in[k];\\ \scriptsize(pk_{i1},sk_{i1})\leftarrow\text{Gen}(1^\kappa),i\in[k];\\ \scriptsize pk:=(pk_{1:k,0/1},r);\color{red}sk:=(sk_{1,0/1}) \\ & \stackrel{c=(vk,\vec{c},\pi,\sigma)}{\longleftarrow}& \text{decryption queries}\\ m/\perp\leftarrow\text{Dec}'(sk,c) & \stackrel{m/\perp}{\longrightarrow}\\ \scriptsize \text{if } \text{Vrfy}(vk,(\vec{c},\pi),\sigma)=0\vee V(r,\vec{c},\pi)=0 \\\scriptsize \vee vk=vk^*,\ m:=\perp;\ \text{else, }m\leftarrow \text{Dec}({\color{red}sk_{1,vk_1}},c_1) \\ & \stackrel{(m_0,m_1)}{\longleftarrow}& \text{choose }m_0,m_1\\ c^*\leftarrow \text{Enc}'(pk,m_1;\vec{w}^*)& \stackrel{c^*}{\longrightarrow}& \\ \scriptsize w_i^*\leftarrow\{0,1\}^{\text{poly}(\kappa)},i\in[k];\\ \scriptsize c_i^*\leftarrow\text{Enc}(pk_{i,vk^*_i},m_1;w_i^*),i\in[k];\\ \scriptsize \pi^*\leftarrow P(r,\vec{c}^*,(m_1,\vec{w}^*));\\ \scriptsize \sigma^*\leftarrow\text{Sign}(ssk^*,(\vec{c}^*,\pi^*))\\\scriptsize c^*:=(vk^*,\vec{c}^*,\pi^*,\sigma^*)\\ & \stackrel{c=(vk,\vec{c},\pi,\sigma)}{\longleftarrow}& \text{decryption queries}\\ m/\perp\leftarrow\text{Dec}'(sk,c) & \stackrel{m/\perp}{\longrightarrow}\\ \scriptsize \text{if } \text{Vrfy}(vk,(\vec{c},\pi),\sigma)=0\vee V(r,\vec{c},\pi)=0 \\\scriptsize \vee vk=vk^*,\ m:=\perp;\ m\leftarrow \text{Dec}({\color{red}sk_{1,vk_1}},c_1) \\\text{return }b' & \stackrel{b'}{\longleftarrow} & \text{compute }b'\end{matrix} C ( v k ∗ , ss k ∗ ) ← SigGen ( 1 κ ) ; ( p k , s k ) ← Gen ′ ( 1 κ ) r ← { 0 , 1 } poly ( κ ) ; ( p k i 0 , s k i 0 ) ← Gen ( 1 κ ) , i ∈ [ k ] ; ( p k i 1 , s k i 1 ) ← Gen ( 1 κ ) , i ∈ [ k ] ; p k := ( p k 1 : k , 0/1 , r ) ; s k := ( s k 1 , 0/1 ) m / ⊥← Dec ′ ( s k , c ) if Vrfy ( v k , ( c , π ) , σ ) = 0 ∨ V ( r , c , π ) = 0 ∨ v k = v k ∗ , m :=⊥ ; else, m ← Dec ( s k 1 , v k 1 , c 1 ) c ∗ ← Enc ′ ( p k , m 1 ; w ∗ ) w i ∗ ← { 0 , 1 } poly ( κ ) , i ∈ [ k ] ; c i ∗ ← Enc ( p k i , v k i ∗ , m 1 ; w i ∗ ) , i ∈ [ k ] ; π ∗ ← P ( r , c ∗ , ( m 1 , w ∗ )) ; σ ∗ ← Sign ( ss k ∗ , ( c ∗ , π ∗ )) c ∗ := ( v k ∗ , c ∗ , π ∗ , σ ∗ ) m / ⊥← Dec ′ ( s k , c ) if Vrfy ( v k , ( c , π ) , σ ) = 0 ∨ V ( r , c , π ) = 0 ∨ v k = v k ∗ , m :=⊥ ; m ← Dec ( s k 1 , v k 1 , c 1 ) return b ′ ⟶ p k ⟵ c = ( v k , c , π , σ ) ⟶ m / ⊥ ⟵ ( m 0 , m 1 ) ⟶ c ∗ ⟵ c = ( v k , c , π , σ ) ⟶ m / ⊥ ⟵ b ′ A decryption queries choose m 0 , m 1 decryption queries compute b ′ 类似从 Game 1 到 Game 2 的推导,有
∣ Pr [ Game 6 = 1 ] − Pr [ Game 5 = 1 ] ∣ ≤ Adv aNIZK sound ( κ ) \left|\text{Pr}[\textbf{Game 6}=1]-\text{Pr}[\textbf{Game 5}=1]\right|\leq\textbf{Adv}_\text{aNIZK}^\text{sound}(\kappa) ∣ Pr [ Game 6 = 1 ] − Pr [ Game 5 = 1 ] ∣ ≤ Adv aNIZK sound ( κ ) Game 7 . 类似 Game 1 的逆操作,即为 Exp PKE ′ , A CCA2-1 ( κ ) \textbf{Exp}_{\text{PKE}',\mathcal{A}}^\text{CCA2-1}(\kappa) Exp PKE ′ , A CCA2-1 ( κ ) 。
C A ( p k , s k ) ← Gen ′ ( 1 κ ) ⟶ p k r ← { 0 , 1 } poly ( κ ) ; ( p k i 0 , s k i 0 ) ← Gen ( 1 κ ) , i ∈ [ k ] ; ( p k i 1 , s k i 1 ) ← Gen ( 1 κ ) , i ∈ [ k ] ; p k : = ( p k 1 : k , 0 / 1 , r ) ; s k : = ( s k 1 , 0 / 1 ) ⟵ c = ( v k , c ⃗ , π , σ ) decryption queries m / ⊥ ← Dec ′ ( s k , c ) ⟶ m / ⊥ if Vrfy ( v k , ( c ⃗ , π ) , σ ) = 0 ∨ V ( r , c ⃗ , π ) = 0 , m : = ⊥ ; else, m ← Dec ( s k 1 , v k 1 , c 1 ) ⟵ ( m 0 , m 1 ) choose m 0 , m 1 c ∗ ← Enc ′ ( p k , m 1 ; w ⃗ ∗ ) ⟶ c ∗ ( v k ∗ , s s k ∗ ) ← SigGen ( 1 κ ) ; w i ∗ ← { 0 , 1 } poly ( κ ) , i ∈ [ k ] ; c i ∗ ← Enc ( p k i , v k i ∗ , m 1 ; w i ∗ ) , i ∈ [ k ] ; π ∗ ← P ( r , c ⃗ ∗ , ( m 1 , w ⃗ ∗ ) ) ; σ ∗ ← Sign ( s s k ∗ , ( c ⃗ ∗ , π ∗ ) ) c ∗ : = ( v k ∗ , c ⃗ ∗ , π ∗ , σ ∗ ) ⟵ c = ( v k , c ⃗ , π , σ ) decryption queries m / ⊥ ← Dec ′ ( s k , c ) ⟶ m / ⊥ if Vrfy ( v k , ( c ⃗ , π ) , σ ) = 0 ∨ V ( r , c ⃗ , π ) = 0 , m : = ⊥ ; else, m ← Dec ( s k 1 , v k 1 , c 1 ) return b ′ ⟵ b ′ compute b ′ \color{darkblue}\begin{matrix}\mathcal{C}& &\mathcal{A}\\ (pk,sk)\leftarrow\text{Gen}'(1^\kappa) & \stackrel{pk}{\longrightarrow}\\ \scriptsize r \leftarrow \{0,1\}^{\text{poly}(\kappa)};\\ \scriptsize (pk_{i0},sk_{i0})\leftarrow\text{Gen}(1^\kappa),i\in[k];\\ \scriptsize(pk_{i1},sk_{i1})\leftarrow\text{Gen}(1^\kappa),i\in[k];\\ \scriptsize pk:=(pk_{1:k,0/1},r);sk:=(sk_{1,0/1}) \\ & \stackrel{c=(vk,\vec{c},\pi,\sigma)}{\longleftarrow}& \text{decryption queries}\\ m/\perp\leftarrow\text{Dec}'(sk,c) & \stackrel{m/\perp}{\longrightarrow}\\ \scriptsize \text{if } \text{Vrfy}(vk,(\vec{c},\pi),\sigma)=0\vee V(r,\vec{c},\pi)=0, \\\scriptsize m:=\perp;\quad\text{else,}\quad m\leftarrow \text{Dec}(sk_{1,vk_1},c_1) \\ & \stackrel{(m_0,m_1)}{\longleftarrow}& \text{choose }m_0,m_1\\ c^*\leftarrow \text{Enc}'(pk,m_1;\vec{w}^*)& \stackrel{c^*}{\longrightarrow}& \\ \color{red}\scriptsize (vk^*,ssk^*)\leftarrow\text{SigGen}(1^\kappa);\\ \scriptsize w_i^*\leftarrow\{0,1\}^{\text{poly}(\kappa)},i\in[k];\\ \scriptsize c_i^*\leftarrow\text{Enc}(pk_{i,vk^*_i},m_1;w_i^*),i\in[k];\\ \scriptsize \pi^*\leftarrow P(r,\vec{c}^*,(m_1,\vec{w}^*));\\ \scriptsize \sigma^*\leftarrow\text{Sign}(ssk^*,(\vec{c}^*,\pi^*))\\ \scriptsize c^*:=(vk^*,\vec{c}^*,\pi^*,\sigma^*)\\& \stackrel{c=(vk,\vec{c},\pi,\sigma)}{\longleftarrow}& \text{decryption queries}\\ m/\perp\leftarrow\text{Dec}'(sk,c) & \stackrel{m/\perp}{\longrightarrow}\\ \scriptsize \text{if } \text{Vrfy}(vk,(\vec{c},\pi),\sigma)=0\vee V(r,\vec{c},\pi)=0, \\\scriptsize m:=\perp;\quad\text{else,}\quad m\leftarrow \text{Dec}(sk_{1,vk_1},c_1) \\\text{return }b' & \stackrel{b'}{\longleftarrow} & \text{compute }b'\end{matrix} C ( p k , s k ) ← Gen ′ ( 1 κ ) r ← { 0 , 1 } poly ( κ ) ; ( p k i 0 , s k i 0 ) ← Gen ( 1 κ ) , i ∈ [ k ] ; ( p k i 1 , s k i 1 ) ← Gen ( 1 κ ) , i ∈ [ k ] ; p k := ( p k 1 : k , 0/1 , r ) ; s k := ( s k 1 , 0/1 ) m / ⊥← Dec ′ ( s k , c ) if Vrfy ( v k , ( c , π ) , σ ) = 0 ∨ V ( r , c , π ) = 0 , m :=⊥ ; else, m ← Dec ( s k 1 , v k 1 , c 1 ) c ∗ ← Enc ′ ( p k , m 1 ; w ∗ ) ( v k ∗ , ss k ∗ ) ← SigGen ( 1 κ ) ; w i ∗ ← { 0 , 1 } poly ( κ ) , i ∈ [ k ] ; c i ∗ ← Enc ( p k i , v k i ∗ , m 1 ; w i ∗ ) , i ∈ [ k ] ; π ∗ ← P ( r , c ∗ , ( m 1 , w ∗ )) ; σ ∗ ← Sign ( ss k ∗ , ( c ∗ , π ∗ )) c ∗ := ( v k ∗ , c ∗ , π ∗ , σ ∗ ) m / ⊥← Dec ′ ( s k , c ) if Vrfy ( v k , ( c , π ) , σ ) = 0 ∨ V ( r , c , π ) = 0 , m :=⊥ ; else, m ← Dec ( s k 1 , v k 1 , c 1 ) return b ′ ⟶ p k ⟵ c = ( v k , c , π , σ ) ⟶ m / ⊥ ⟵ ( m 0 , m 1 ) ⟶ c ∗ ⟵ c = ( v k , c , π , σ ) ⟶ m / ⊥ ⟵ b ′ A decryption queries choose m 0 , m 1 decryption queries compute b ′ 类似从 Game 0 到 Game 1 的推导,有
∣ Pr [ Game 7 = 1 ] − Pr [ Game 6 = 1 ] ∣ ≤ Adv SIG SOT-UF-CMA ( κ ) \left|\text{Pr}[\textbf{Game 7}=1]-\text{Pr}[\textbf{Game 6}=1]\right|\leq\textbf{Adv}_{\text{SIG}}^\text{SOT-UF-CMA}(\kappa) ∣ Pr [ Game 7 = 1 ] − Pr [ Game 6 = 1 ] ∣ ≤ Adv SIG SOT-UF-CMA ( κ ) 综上,由于 k k k 是常数,
Adv PKE ′ , A CCA-2 ( κ ) = ∣ Pr [ Exp PKE ′ , A CCA2-1 ( κ ) = 1 ] − Pr [ Exp PKE ′ , A CCA2-0 ( κ ) = 1 ] ∣ = ∣ Pr [ Game 7 = 1 ] − Pr [ Game 0 = 1 ] ∣ ≤ ∑ i = 0 6 ∣ Pr [ Game i + 1 = 1 ] − Pr [ Game i = 1 ] ∣ ≤ Adv SIG SOT-UF-CMA ( κ ) + Adv aNIZK sound ( κ ) + Adv aNIZK ZK ( κ ) + k Adv PKE CPA ( κ ) + Adv aNIZK ZK ( κ ) + Adv aNIZK sound ( κ ) + Adv SIG SOT-UF-CMA ( κ ) = k Adv PKE CPA ( κ ) + 2 Adv aNIZK sound ( κ ) + 2 Adv aNIZK ZK ( κ ) + 2 Adv SIG SOT-UF-CMA ( κ ) = ( 6 + k ) negl ( κ ) = negl ( κ ) \begin{aligned}&\textbf{Adv}_{\text{PKE}',\mathcal{A}}^\text{CCA-2}(\kappa)\\=\ &\left|\text{Pr}[\textbf{Exp}_{\text{PKE}',\mathcal{A}}^{\text{CCA2-1}}(\kappa)=1]-\text{Pr}[\textbf{Exp}_{\text{PKE}',\mathcal{A}}^{\text{CCA2-0}}(\kappa)=1]\right| \\ =\ &\left|\text{Pr}[\textbf{Game 7}=1]-\text{Pr}[\textbf{Game 0}=1]\right|\\ \leq\ &\sum_{i=0}^6 \left|\text{Pr}[\textbf{Game }i+1=1]-\text{Pr}[\textbf{Game }i=1]\right|\\ \leq\ &\textbf{Adv}_{\text{SIG}}^\text{SOT-UF-CMA}(\kappa)+\textbf{Adv}_\text{aNIZK}^\text{sound}(\kappa)+\textbf{Adv}_\text{aNIZK}^\text{ZK}(\kappa) \\&+k\textbf{Adv}_\text{PKE}^\text{CPA}(\kappa)+ \textbf{Adv}_\text{aNIZK}^\text{ZK}(\kappa) + \textbf{Adv}_\text{aNIZK}^\text{sound}(\kappa) + \textbf{Adv}_{\text{SIG}}^\text{SOT-UF-CMA}(\kappa)\\ =\ & k\textbf{Adv}_\text{PKE}^\text{CPA}(\kappa)+2\textbf{Adv}_\text{aNIZK}^\text{sound}(\kappa)+2\textbf{Adv}_\text{aNIZK}^\text{ZK}(\kappa)+2\textbf{Adv}_{\text{SIG}}^\text{SOT-UF-CMA}(\kappa)\\=\ & (6+k)\text{negl}(\kappa)\\ =\ &\text{negl}(\kappa)\end{aligned} = = ≤ ≤ = = = Adv PKE ′ , A CCA-2 ( κ ) ∣ ∣ Pr [ Exp PKE ′ , A CCA2-1 ( κ ) = 1 ] − Pr [ Exp PKE ′ , A CCA2-0 ( κ ) = 1 ] ∣ ∣ ∣ Pr [ Game 7 = 1 ] − Pr [ Game 0 = 1 ] ∣ i = 0 ∑ 6 ∣ Pr [ Game i + 1 = 1 ] − Pr [ Game i = 1 ] ∣ Adv SIG SOT-UF-CMA ( κ ) + Adv aNIZK sound ( κ ) + Adv aNIZK ZK ( κ ) + k Adv PKE CPA ( κ ) + Adv aNIZK ZK ( κ ) + Adv aNIZK sound ( κ ) + Adv SIG SOT-UF-CMA ( κ ) k Adv PKE CPA ( κ ) + 2 Adv aNIZK sound ( κ ) + 2 Adv aNIZK ZK ( κ ) + 2 Adv SIG SOT-UF-CMA ( κ ) ( 6 + k ) negl ( κ ) negl ( κ ) 于是,使用 Dolev-Dwork-Naor 构造的 PKE’ 具有 CCA2 安全。