ECDSA全稱橢圓曲線數字簽名算法,它是基於素數域的橢圓曲線對信息進行加簽與驗簽。其核心在於對信息的加簽,及對加簽的信息進行驗簽,那么下面介紹該算法流程。
假設Alice希望對消息m進行簽名,並將消息傳給Bob。首先Alice要選用一條橢圓曲線,其參數組為D = ( p,S,a,b,G,n,h) ,對應的密鑰對為( k , Q ) ,其中各參數解釋為:
- 域的階p;
- 種子S,用於參數隨機數;
- 兩個橢圓曲線系數a,b∈Fp,定義了Fp上橢圓曲線E的等式;
- 定義橢圓曲線上的一個有窮遠點 ,一般稱其為橢圓曲線基點;
- G的階n,為素數域的模數;
- 余數因子h。
密鑰中記k為私鑰,Q為公鑰。其中Q=kG;
Alice將按如下步驟進行簽名:
1.利用種子S產生一個隨機數d,d∈(0,n);
2.計算dG=(x1,y1);
3.計算r=x1 mod n,若r=0,則返回第一步;
4.計算d-1 mod n;
5.計算哈希值e = H(m), //此步驟可在信息到來時便開始進行;
6.計算s=d-1(e+kr)mod n。 若s = 0,則返回步驟1;
7.(r,s)即為對消息m的簽名,最后Alice將(D,r,s,m,Q)傳輸給Bob。
Bob收到(D,r,s,m,Q)后,要對消息進行驗簽,檢驗消息m是否被篡改。
Bob將按以下步驟進行驗簽:
1.計算哈希值e = H(m);
2.計算w = s-1 mod n;
3.計算u1=ew mod n 及u2=rw mod n;
4.計算X=u1G+u2Q=(x2,y2);
5.若X = 0,則驗簽失敗,輸出invalid_verify;否則計算v = x2 mod n;
6.若v = r,則驗簽成功,輸出valid_verfy。
注:上述計算都是基於整數,因為是基於數字橢圓曲線加密,曲線的點選取也是整數,所有一系列計算都是整數,如果出現小數。
下面來將上述算法模塊化,具體化:
注意到我們使用過的模塊,
加簽步驟1:隨機數產生模塊,要求輸出一個隨機數種子S,輸出一個(0,n)的隨機數d。
加簽步驟2:點乘模塊,也成為標量乘模塊,隨機數d為一個標量,G為橢圓曲線上的一個點。標量乘表示多個點相加,比如5G = 2G+2G+G;為啥不能是4G+G或者直接5G,算法不允許呀,因為這不是最簡的點運算形式。
2G及2G+G才是最簡的點運算形式,其中2G稱為倍點,2G+G稱為點加(注意2G運算后為一個新的點P,也落在橢圓曲線上)。
加簽步驟3:模乘模塊,兩個標量相乘並取模。
加簽步驟4:模逆模塊,定義d*d-1=1(mod n),即d*d-1 = kn(k=1,2,3...)。素數域上的取逆元操作。
加簽步驟5:哈希模塊,輸入消息m,輸出哈希值H;
加簽步驟6:其中kr和d-1(e+kr)都是模乘模塊,e+kr 為模加模塊。
驗簽部分也是依靠上述幾個算法模塊,那么得到下面這張圖:
標量乘調用點加和倍點,但是如果標量為1,2這種情況就直接調用點加和倍點模塊,而點加和倍點根據橢圓曲線規則,需要調用模運算模塊,這個我單獨出一篇文章來講各個模塊的具體實現,這里就不詳細介紹。
因為要在硬件上實現ECDSA算法,所以博主采用了verilog對各模塊進行建模編寫,最后綜合得到下圖:
詳細的模塊化設計我會在后續模塊介紹中放出。