Schnorr簽名算法是由Claus Schnorr提出,是一個橢圓曲線上的簽名算法,我們回顧下素數域上一些術語:
- 橢圓曲線的階:橢圓曲線所有點的個數,包含無窮遠點;
- 橢圓曲線上點的階:若P爲橢圓曲線上的點,nP=無窮遠點,n取最小整數,即n爲P的階。
- 基點:橢圓曲線參數之一,用G表示,是橢圓曲線上的一點;
- 餘因子:橢圓曲線的餘因子,用h表示,爲橢圓曲線點的個數/基點的階。
- 橢圓曲線參數:素數域:,其中p爲素數,確定,a和b確定橢圓曲線的方程,G爲基點,n爲G的階,h爲餘因子。
首先介紹下Schnorr簽名算法,假設簽名者的公私鑰對爲$(sk,pk)$,其中$sk\in Z_{n}^{*}$,$pk=sk\cdot G$,G爲基點,爲消息m進行簽名,簽名過程如下:
- 隨機選取一個整數;
- 計算;
- 計算,如果s=0,則返回1重新選擇。
簽名者將簽名和消息m發送給驗證者,驗證者進行驗籤,驗證如下等式是否成立:
若成立,則驗籤成功。
Schnorr簽名算法相較於ECDSA存在一個有趣的屬性,可以將多個簽名組合在一起,然後使用相對應的多個公鑰共同對組合後的簽名進行驗證。
我們假設現在有兩個分別使用不同私鑰生成的簽名和,簽名的消息分別爲和。我們可以得到:
驗籤時,進行如下判斷即可: