主要符號表
符號 |
含義 |
x←X |
從集合X中隨機挑選一個元素,將其值賦予x |
x:=y |
將元素y的值賦予x |
x=y |
表示元素x的值與元素y的值相等 |
其餘符號,請參考Jonathan Katz,Yehuda Lindell編著的《Introduction to Modern Cryptography》一書。
El Gamal加密方案構造
令算法G表示Schnorr羣生成算法,El Gamal加密方案構造具體如下:
- Gen(1λ)→(sk,pk):輸入安全參數1λ,運行(G,q,g)←G(1λ),隨機挑選x←Zq,計算h:=gx,設置sk:=⟨G,q,g,x⟩和pk:=⟨G,q,g,h⟩,輸出密鑰對(sk,pk)。
- Enc(pk,m)→c:輸入公鑰pk=⟨G,q,g,h⟩和消息m∈G,隨機挑選y←Zq,計算c1:=gy和c2:=hy⋅m,設置c:=⟨c1,c2⟩,輸出密文c。
- Dec(sk,c)→m:輸入私鑰sk=⟨G,q,g,x⟩和密文c=⟨c1,c2⟩,計算m:=c2/c1x,輸出消息m。
困難性問題假設
若對於任意概率多項式時間算法D,如下不等式恆成立,則稱與算法G相關的DDH問題是困難的,
∣∣∣Pr[D(G,q,g,gx,gy,gz)=1]−Pr[D(G,q,g,gx,gy,gxy)=1]∣∣∣≤negl(λ),
其中x,y,z←Zq,而判別器算法D的描述是:給它一堆參數(G,q,g,g1=gx,g2=gy,g3),讓它判斷最後一個參數g3是gz還是gxy,若它猜測最後一個參數是gz則輸出1,否則輸出0。
(擴展) 上述式子還有一種等價寫法,
Pr[D wins]≤21+negl(λ),
表示敵手D贏得DDH挑戰遊戲的優勢爲可忽略函數,即與瞎猜無異(敵手D瞎猜以0.5概率猜中挑戰比特b的值,具體參考入門書籍《Introduction to Modern Cryptography》)。
安全性證明
(定理) 若與算法G相關的DDH問題是困難的,那麼El Gamal加密滿足CPA不可區分性。
證明. (主要證明思路:反證法,若El Gamal加密不安全,那麼DDH困難問題假設不成立)
記El Gamal加密方案爲Π,若Π不滿足CPA不可區分性,那麼存在一個概率多項式時間算法A,它自身有一套編碼規則,對於Π環境下的(pk,⟨c1,c2⟩),以可觀的概率ε(λ)贏得挑戰遊戲,而對於亂碼輸入(pk,⟨c1,c2⟩),該編碼規則會失效(這一點類似機器學習裏的特定領域算法,參考No Free Lunch定理),有
Pr[PubKA,Πeva(λ)=1]=ε(λ)。
現引入一個證明用的加密方案Π,它構造如下:
- Gen(1λ)→(sk,pk):輸入安全參數1λ,運行(G,q,g)←G(1λ),隨機挑選x←Zq,計算h:=gx,設置sk:=⟨G,q,g,x⟩和pk:=⟨G,q,g,h⟩,輸出密鑰對(sk,pk)。
- Enc(pk,m)→c:輸入公鑰pk=⟨G,q,g,h⟩和消息m∈G,隨機挑選y←Zq和z←Zq,計算c1:=gy和c2:=gz⋅m,設置c:=⟨c1,c2⟩,輸出密文c。
- Dec(sk,c)→m:無解密算法。
假設A是專門針對Π的敵手,現在分析它在Π對應的CPA挑戰遊戲中的優勢。留意到Π中的密文c無異於是完全隨機挑選的,跟m一點關聯都沒有,即使是持有私鑰sk的人也無法解密密文c,那麼A贏得Π對應的CPA挑戰遊戲的優勢爲0,即
Pr[PubKA,Πeva(λ)=1]=21。
從以上分析可進一步得知,任意概率多項式時間算法(包括A)贏得Π對應的CPA挑戰遊戲的概率也爲0.5。注意,其它算法贏得挑戰遊戲的優勢小於或等於A,這一點類似機器學習的特定領域,敵手訪問諭言機的過程可以看成是一種參數訓練。那麼,有如下式子成立
Pr[PubKA,Πeva(λ)=1]=21。
前面假設A以可觀概率ε(λ)贏得Π對應的CPA挑戰遊戲,留意到ε(λ)與21的不同,我們可以編碼出一個判別器D用於解決DDH問題,即:若ε(λ)與21明顯不同,則DDH問題失效。
算法D工作如下:
輸入(G,q,g,g1,g2,g3),設置pk:=⟨G,q,g,g1⟩,運行A(pk)得到兩個消息m0,m1,隨機挑選一個比特b←{0,1},設置c1:=g2和c2:=g3⋅mb,將c=⟨c1,c2⟩交給A以得到一個比特b′,若b=b′,則D輸出1,否則,輸出0。
對於D得到的參數,分爲以下兩種情況:
情況1. 此時g1=gx,g2=gy,g3=gz,此時A的視圖爲Π,算法D輸出1的概率爲A贏得Π的CPA挑戰遊戲的概率,即
Pr[D(G,q,g,gx,gy,gz)=1]=Pr[PubKA,Πeva(λ)=1]=21。
情況2. 此時g1=gx,g2=gy,g3=gxy,此時A的視圖爲Π,算法D輸出1的概率爲A贏得Π的CPA挑戰遊戲的概率,即
Pr[D(G,q,g,gx,gy,gxy)=1]=Pr[PubKA,Πeva(λ)=1]=ε(λ)。
有
∣∣∣Pr[D(G,q,g,gx,gy,gz)=1]−Pr[D(G,q,g,gx,gy,gxy)=1]∣∣∣=∣∣∣21−ε(λ)∣∣∣,
若A以可觀概率贏得Π對應的CPA挑戰遊戲,意味着
ε(λ)>21+negl(λ),
這使得
∣∣∣Pr[D(G,q,g,gx,gy,gz)=1]−Pr[D(G,q,g,gx,gy,gxy)=1]∣∣∣>negl(λ),
與DDH困難問題假設相矛盾,故ε(λ)≤21+negl(λ)。
上述證明過程中還存在一個問題,A是針對Π的算法,那麼在情況1中它有沒有可能意識到挑戰密文的不同之處,從而拒絕輸出b′呢?這樣D輸出的就是無效符號⊥。我們知道,安全性規約證明過程中必須給A正確地模擬出方案的真實環境,這樣A纔會老老實實地工作。接下來證明情況1中的挑戰密文和情況2中的挑戰密文,對於敵手來說不可區分。
假設情況1中A能夠意識到密文的不同之處從而拒絕輸出,即D最終收到的是一個無效符號⊥,那麼D接下來直接輸出1,表示它判斷g3是gz,此時
∣∣∣Pr[D(G,q,g,gx,gy,gz)=1]−Pr[D(G,q,g,gx,gy,gxy)=1]∣∣∣>negl(λ),
與定理矛盾,故A在情況1中依舊會照常輸出比特b′。
El Gamal加密的實現
具體參考Python密碼庫:charm-crypto