ECDSA高性能硬件實現——算法詳解與模塊划分


  ECDSA全稱橢圓曲線數字簽名算法,它是基於素數域的橢圓曲線對信息進行加簽與驗簽。其核心在於對信息的加簽,及對加簽的信息進行驗簽,那么下面介紹該算法流程。

  假設Alice希望對消息m進行簽名,並將消息傳給Bob。首先Alice要選用一條橢圓曲線,其參數組為D = ( p,S,a,b,G,n,h) ,對應的密鑰對為( k , Q ) ,其中各參數解釋為:

  1. 域的階p;
  2. 種子S,用於參數隨機數;
  3. 兩個橢圓曲線系數a,b∈Fp,定義了Fp上橢圓曲線E的等式; 
  4. 定義橢圓曲線上的一個有窮遠點 ,一般稱其為橢圓曲線基點;
  5. G的階n,為素數域的模數;
  6. 余數因子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 = xmod 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對各模塊進行建模編寫,最后綜合得到下圖:

                                                     

詳細的模塊化設計我會在后續模塊介紹中放出。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM