深入學習區塊鏈的隱私保護(三)Schnorr簽名

Schnorr簽名算法是由Claus Schnorr提出,是一個橢圓曲線上的簽名算法,我們回顧下素數域上一些術語:

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

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

  1. 隨機選取一個整數k\in Z_{n}^{*}
  2. 計算R=k\cdot G
  3. 計算s=k+H(m||R||pk)*sk\, mod \, n,如果s=0,則返回1重新選擇。

簽名者將簽名(R,s)和消息m發送給驗證者,驗證者進行驗籤,驗證如下等式是否成立:
  s\cdot G==R+H(m||R||P)\cdot P
  若成立,則驗籤成功。

Schnorr簽名算法相較於ECDSA存在一個有趣的屬性,可以將多個簽名組合在一起,然後使用相對應的多個公鑰共同對組合後的簽名進行驗證。

我們假設現在有兩個分別使用不同私鑰sk_{1},sk_{2}生成的簽名(R_{1},s_{1})(R_{2},s_{2}),簽名的消息分別爲m_{1}m_{2}。我們可以得到:
s_{1}+s_{2}=k_{1}+H(m_{1}||R_{1}||pk_{1})*sk_{1}+k_{2}+H(m_{2}||R_{2}||pk_{2})*sk_{2}

驗籤時,進行如下判斷即可:
s_{1}\cdot G+s_{2}\cdot==R_{1}+H(m_{1}||R_{1}||P_{1})+R_{2}+H(m_{2}||R_{2}||P_{2})
 

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