深入學習區塊鏈的隱私保護(二)一大波盲簽名算法

    盲簽名是由David Chaum提出的一種特殊簽名方式,盲簽名允許消息擁有者先將消息盲化後,把盲化後的消息發送給簽名者進行簽名,最後消息的擁有者對簽名進行去盲因子處理,得到原消息的簽名。盲簽名就是接收者在不讓簽名者獲取所簽署消息具體內容的情況下所採取的一種特殊的數字簽名技術,盲簽名需要滿足如下兩個特殊性質:

  1. 簽名者不知道所簽署消息的具體內容
  2. 當簽名消息被公佈後,簽名者無法知道這是他哪次簽署的

    根據不同的公鑰密碼體制構造依賴於不同密碼假設下的盲簽名方案,通常使用的有基於RSA的盲簽名算法、基於Elgamal的盲簽名算法、基於ECC的盲簽名算法以及最近很火的基於格的盲簽名。下面依次介紹(除了基於格的盲簽名,格真是太難了)。

1  基於RSA的盲簽名

    消息m的擁有者選取一個隨機數r,使得gcd(r,N)=1,N爲RSA中的模數,即選擇一個與N互素的數,對消息m的盲化,計算如下:(其中r^{e}\, mod\, N爲盲因子,e爲簽名者的公鑰。)

                                                                                 m^{'}=mr^{e} \, mod\, N

   消息的擁有者發送m^{'}給簽名者,簽名者的私鑰爲d,公鑰爲e,簽名者進行如下計算:                                                                               

                                                                                s^{'}=(m^{'})^{d} \, mod\, N

   簽名者將s'發送給擁有者,擁有者進行去盲因子處理,進行如下計算:                                                                               

                                                                               s=s^{'}\cdot r^{-1} \, mod\, N

   由於RSA中公私鑰對的性質,使得r^{ed}=r \, mod\, N,因此,消息m的簽名是s,正確性如下:

                                                                s=s^{'}\cdot r^{-1}=(m^{'})^{d}\cdot r^{-1}=m^{d}r^{ed}\cdot r^{-1}=m^{d} \, mod\, N

 

2  基於Elgamal的盲簽名

     首先介紹下Elgamal的簽名算法,其中p爲一個大素數,g爲Z_{p}^{*}中的一個生成元,若私鑰爲sk\in Z_{p}^{*},對應的公鑰爲pk=g^{sk}\, mod\, p,過程如下:

  1. 簽名過程:Bob對消息m進行簽名,私鑰爲sk,公鑰爲pk。Bob隨機選取k\in Z_{p}^{*},並計算r=g^{k}\, mod\, p,和s=(m-sk*r)*k^{-1}\, mod\, p,將簽名信息(r,s)以及消息m發送給Alice。
  2. 驗簽過程:Alice檢驗等式g^{m}==pk^{r}r^{s}是否成立,若成立則簽名確實由Bob生成。

    下面我們來介紹基於Elgamal的盲籤,假設Alice和Bob的公私鑰對分別爲(sk_{A},pk_{A})(sk_{B},pk_{B}),Alice需要Bob爲消息m進行盲簽名。過程如下:

  1. Alice盲化消息m: 隨機選取盲因子t\in Z_{p}^{*},需滿足gdc(t,p-1)=1,然後計算盲化後的消息M=mt^{sk_{A}}\, mod\, (p-1)
  2. Bob簽名盲化後的消息:首先,隨機選取k,a\in Z_{p}^{*},計算r=g^{k}\, mod\, pw=k^{-1}*sk_{B}\, mod\, (p-1)。然後計算S=k^{-1}(M-sk_{B}r)\, mod\, (p-1),最後將(r,S,w,a)作爲簽名發送給Alice。
  3. Alice去盲化:去盲化後消息m的簽名爲s=St^{-sk_{A}}+wr(t^{-sk_{A}}-1) \, mod\, (p-1),判斷恢復出的簽名是否正確,g^{m}==pk_{B}^{r}r^{s} \, mod \, p。此時消息m的簽名信息爲(r,s)

Remarks:公式的正確性推導,手算一下就行了,即(r,s)是否爲正確的簽名結構。

 

3 基於ECC的盲簽名

    橢圓曲線算法可以看作是定義在特殊集合下數的運算,滿足一定的規則。橢圓曲線在如下兩個域中定義:

     F_{p}域,素數域,p爲大素數;

    F_{2}^{m}域,特徵爲2的有限域,稱之爲二元域 或者二進制擴展域。在該域中,元素個數爲2^{m}個。

    我們只介紹素數域。一些術語說明如下:

  1. 橢圓曲線的階:橢圓曲線所有點的個數,包含無窮遠點;
  2. 橢圓曲線上點的階:若P爲橢圓曲線上的點,nP=無窮遠點,n取最小整數,即n爲P的階。
  3. 基點:橢圓曲線參數之一,用G表示,是橢圓曲線上的一點;
  4. 餘因子:橢圓曲線的餘因子,用h表示,爲橢圓曲線點的個數/基點的階。
  5. 橢圓曲線參數:素數域:(p,a,b,G,n,h),其中p爲素數,確定F_{p},a和b確定橢圓曲線的方程,G爲基點,n爲G的階,h爲餘因子。

    首先介紹下ECDSA,假設簽名者的公私鑰對爲(sk,pk),其中sk\in Z_{n}^{*}pk=sk\cdot G,G爲基點,爲消息m進行簽名。

    簽名過程如下:

  1. 隨機選取一個整數k\in Z_{n}^{*}
  2. 並計算(x,y)=k\cdot Gr=x\, mod\, n,如果r=0,則返回1重新選擇;
  3. 計算e=H(m)
  4. 計算s=k^{-1}(e+r*sk)\, mod \, n,如果s=0,則返回1重新選擇。

    簽名者將簽名(r,s)和消息m發送給驗證者,驗證者進行驗籤,驗簽過程如下:

  1. 驗證r,s屬於[1,n-1]中的整數;
  2. 計算e=H(m)
  3. 計算u_{1}=e*s^{-1}\, mod \, nu_{2}=r*s^{-1}\, mod \, n
  4. 計算X=u_{1}\cdot G+u_{2}\cdot pk=(x,y),如果X=(0,0)則拒絕,否則計算v=x\, mod\, n,當且僅當v=r時,驗證通過。

Remarks:算法正確性的判斷,計算生成(x,y)的是否是kG即可。

      基於ECC的盲簽名有很多方案,我們介紹最爲經典的一個方案,Schnnor盲簽名。橢圓曲線的參數如上,簽名者Bob的公私鑰對爲(d,Q),其中Q=d\cdot G,並且Bob每次盲簽名都會新生產一對臨時簽名公私鑰對。用戶Alice想讓簽名者對消息m進行盲簽名,流程如下:

  1. Bob生成臨時簽名公私鑰: 隨機選取k\in Z_{n}^{*},計算k\cdot G,並將k\cdot G發送給Alice;
  2. Alice對消息進行盲化:隨機選取r,l\in Z_{n}^{*},計算A=k\cdot G+r\cdot G+l\cdot G=(x,y)。令t=x\, mod\, n,計算c=H(m||t),將c^{'}=c-l發送給Bob;
  3. Bob簽名盲化後的消息:計算s^{'}=k-c^{'}d,併發送給Alice;
  4. Alice去盲化:計算s=s^{'}+r(c,s)即爲消息m的簽名信息。

PS:肯定有小夥伴對Schnnor盲簽名的結果有所疑惑,簽名結果與ECDSA的簽名信息不一致,這是因爲Schnnor盲簽名的結果對應於Schnnor盲簽名,Schnnor盲簽名與ECDSA是兩種不同的基於ECC的簽名方案,欲知後事,請聽下回詳細分解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章