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+u2G=(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對各模組進行建模編寫,最後綜合得到下圖:
詳細的模組化設計我會在後續模組介紹中放出。