一種基於gf(2的製作方法
2023-10-06 16:48:29 1
專利名稱:一種基於gf(2的製作方法
技術領域:
本發明屬於公鑰密碼系統技術領域,具體涉及到橢圓曲線加密系統中實現GF(2n)上乘和加運算的ECC加速器電路,主要解決橢圓曲線加密/解密運算過程所必須的基於GF(2n)上的橢圓曲線離散對數運算問題,即GF(2n)上的乘和加運算問題。
背景技術:
橢圓曲線密碼(ECC)是1985年由N.Koblitz和V.Miller提出的。橢圓曲線密碼屬於公鑰密碼體制,由於其優越性能被稱為「二十一世紀的加密算法」。
在有限域GF(2n)上,橢圓曲線點集所構成的阿貝爾群上定義的離散對數系統,可以構造出基於有限域上離散對數的一些雙鑰體制。經過對橢圓曲線離散對數密碼體制長期的研究,發現其安全性優於RSA等其它公鑰密碼體制,並可以以更小的軟、硬體規模獲得相同的安全性。同時,在實現相同的安全性下,ECC所需的密鑰量比RSA少得多,ECC安全性高、運算速度快和所需軟硬體資源少的特點使它廣泛應用於無線通信、計算機網絡和IC卡等領域。
橢圓曲線加密算法簡述橢圓加密/解密運算過程基於GF(2n)上的橢圓曲線離散對數問題,其基本過程如下a)密鑰的生成使用者執行下列運算生成密鑰[1]在區間[1,n-1]中隨機選取一個整數d;[2]計算點Q=dP(d個P相,這是定義在GF(2n)橢圓曲線上的加法,它由GF(2n)上的乘、加和乘逆運算實現,這裡略去具體計算公式);[3]公開自己的公開密鑰——(E(GF(2n)),P,n,Q);[4]私鑰為整數d。
b)加密過程假定有消息m要發送給使用者,發送方執行加密操作 查找使用者的公鑰(E(GF(2n)),p,n,Q);[2]將m表示成一個域元素m∈GF(2n);[3]在區間[1,n-1]內選取一個隨機數k;[4]依據使用者的公鑰計算(x1,y1)=kP(k個P相,同樣可由GF2n上的乘、加和乘逆運算實現);[5]計算點(x2,y2)=kQ,如果x2=0,則回到第[3]步;[6]計算C=m·x2;[7]傳送加密數據(x1,y1,C)給使用者。
c)解密過程使用者收到密文(x1,y1,C)後,執行如下解密操作[1]使用私鑰d,計算點(x2,y2)=d(x1,y1),再計算GF(2n)中x2-1;[2]通過計算m=C·x2-1,恢復出明文數據m。
綜上所述,密鑰的生成、加密和解密過程其基本運算都可分解為GF(2n)上的乘、加和乘逆運算。因此橢圓曲線密碼(ECC)加速器應支持定義在GF(2n),n≤256上的乘和加運算,乘逆運算用乘運算來表示,所以對於GF(2n)上的乘、加運算的高效實現是關鍵。而GF(2n)上的乘運算通常按照從低位到高位的順序、採用移位和加法來實現,要求乘數的位數是確定的,且電路規模較大。
發明內容
本發明的目的是提供一種ECC加速器電路,作為CPU的協處理器,實現GF(2n)上的乘和加運算,通過使用精巧的體系結構來降低電路規模、解決乘數不定長問題、並提高系統運算速度。
本發明的基本功能是解決橢圓曲線加密/解密運算過程所必須的基於GF(2n)上的橢圓曲線離散對數運算問題,即GF(2n)上的乘和加運算問題。本橢圓曲線密碼(ECC)加速器支持定義在GF(2n),n≤256上的乘和加運算,運算速度為256bit×1bit/拍,也就是說在乘數及時寫入的情況下,完成256位的GF(2n)乘運算僅需要256個時鐘周期。
本發明技術解決方案一種基於GF(2n)全串行的ECC加速器電路,包括總線控制邏輯電路、ECC控制邏輯電路和ECC運算邏輯電路三個電路單元,輸入信號datain[7:0]包含數據和控制信息,連接到總線控制邏輯電路;地址信號addr[7:0]連接到總線控制邏輯電路;總線控制邏輯電路的輸出包含按字節傳輸的被乘數md[255:0]、乘數mr[7:0]以及控制信息ecc_ctrl[7:0],其中被乘數md[255:0]按字節傳輸到ECC運算邏輯電路,乘數mr[7:0]連接到ECC運算邏輯電路,控制信息ecc_ctrl[7:0]連接到ECC控制邏輯電路;ECC控制邏輯電路根據輸入控制信號進行處理後生成的ECC狀態信號ecc_state[7:0]輸出到ECC運算邏輯電路;ECC運算邏輯電路根據輸入的狀態信號對輸入數據進行處理生成的結果信號rs[255:0]連接到總線控制邏輯電路;總線控制邏輯電路輸出信號dataout[7:0];時鐘信號clk、寫信號wr_n、讀信號rd_n、片選信號cs_n、復位信號reset_n是電路的共用輸入信號。
本發明通過一個ECC加速器電路來專門實現GF(2n)上的乘、加運算,ECC加密系統的用戶密鑰長度可以根據安全性的要求進行選擇,最高支持256位。本發明採用二進位乘法從高位到低位逐位相乘的思想設計實現了ECC加速器電路。在乘運算中採用從高位到低位逐位乘並取模的方法,使乘數寄存器由256位減少到8位,並且在一個時鐘周期內完成256bit×1bit的GF(2n)乘運算(包括取模),這樣既減小了電路規模,又提高了運算速度,同時解決了乘數不定長的問題。
附圖是本發明結構框圖。
具體實施例方式
本發明採用一種新穎的算法實現了基於GF(2n)的ECC加速器電路,在電路描述上採用硬體描述語言Verilog HDL來完成。
1.電路埠說明表1電路埠信號說明
2.電路的verilog硬體描述語言<![CDATA[module ecc_top(reset_n,clk,cs_n,rd_n,wr_n,addr,datain,dataout);input reset_n;//system reset signal,active lowinput clk; //system clock,active in posedgeinput cs_n; //chip selection singal,active lowinput rd_n; //read enable singal,active lowinput wr_n; //write enable singal,active low and data issampled in its posedgeinput[2:0]addr; //address signalinput[7:0]datain;output[7:0]dataout; //data signalreg[7:0]data_out;//define internal signal herereg [7:0]ecc_state,ecc_ctrl;//external registersreg [255:0]md,rs; //multiplicand and result registersreg [7:0]mr; //multiplier registerreg [263:0]ipol; //irreducible ploynomial registerreg [4:0]current_position;//register for indication currentposition of mdreg [3:0]multiply_counter; //the counter for multiply times(<8)//-----------------------------------generate reset singal here----------------------//wire reset_all;assign reset_all=reset n ~ecc ctrl[1];]]><![CDATA[rd_after2<=1'b1; elserd_after2<=rd_after1;end//----------------------------------writing extern register here----------------------//always @(posedge clk)//writing ecc_ctrlbegin if(~reset_n) ecc_ctrl<=8'b0; else if(~cs_n addr==3'b100 ~wr_n_syn) ecc_ctrl<=datain;end//----------------------------------reading internal register here----------------------//assign dataout=(rd_n|cs_n) 8'bz:(addr==3'b100) ecc_ctrl:(addr==3'b000) ecc_state: (addr==3'b010) data_out:8'bz;//----------------------------------operating here----------------------//reg start;//a mark for start multiplicationalways@(posedge clk)begin if(~reset_all) begin ecc_state<=8'b0000_0010; md<=256'b0; ipol<=200'b0; rs<=256'b0;]]><![CDATA[ mr<=8'b0; current_position<=5'b10111; multiply_counter<=4'b0; start<=1'b0; data_out<=8'b0;endelse if(~ecc_ctrl
~ecc_state[5])begin case(ecc_ctrl[7:2]) 6'b100100://command 90H begin if(start==1'b1)start<=1'b0; md<=256'b0; current_position<=5'b10111; ecc_state<=8'b0000_0000; end 6'b100000://command 80H begin if(start==1'b1)start<=1'b0; if(current_position!=5'b10111) begin md<={md[247:0],8'b0}; current_position<=current_position+1'b1; if(current_position!=5'b10110) ecc_state<=8'b0000_0101; else ecc_state<=8'b0000_0000; end end]]><![CDATA[6'b001000://command 20Hbegin if(start==1'b1)start<=1'b0; if(~ecc_state[3]) ecc_state[7:1]<=7'b0000_100; else if(~cs_n ~rd_n_syn addr==3'b010) begin data_out<=rs[255:248]^md[255:248]; rs<={rs[247:0],8'b0}; md<={md[247:0],md[255:248]}; if(current_position==5'b10111) current_position<=5'b0; else current_position<=current_position+1'b1; if(current_position!=5'b10110) ecc_state<=8'b0000_1001; else ecc_state<=8'b0000_1000; endend6'b001001: //command 24Hbegin if(start==1'b1)start<=1'b0; if(~ecc_state[3]) ecc_state[7:1]<=7'b0000_100; else if(~cs_n ~rd_n_syn addr==3'b010) begin data_out<=rs[255:248]; rs<={rs[247:0],8'b0};]]><![CDATA[ ecc_state[7:1]<=7'b0000_100; endend6'b010000://command 40Hbegin if(~start) begin ecc_state[7:1]<=7'b0001_000; rs<=256'b0; start<=1'b1; end else if(~cs_n ~wr_n_syn addr==3'b010 ecc_state[4]) begin mr<=datain^md[255:248]; multiply_counter<=4'b0; ecc_state[7:1]<=7'b0000_010; end else if(ecc_state[2]) begin if(mr[7]) begin if((md[255:248]{ipol[263:257],1'b0})) beginif((rs[255:248]ipol[263:256]))rs<=md^ipol[255:0]^{rs[254:0],1'b0}^ipol[255:0];elsers<=md^ipol[255:0]^{rs[254:0],1'b0}; end]]><![CDATA[ else if((rs[255:248]ipol[263:256])) rs<={rs[254:0],1'b0}^ipol[255:0]^md; else rs<={rs[254:0],1'b0}^md; end else if((rs[255:248]ipol[263:256])) rs<={rs[254:0],1'b0}^ipol[255:0]; else rs<={rs[254:0],1'b0}; mr<={mr[6:0],1'b0}; multiply_counter<=multiply_counter+1'b1; if(multiply_counter!=4'b0111) ecc_state[7:1]<=7'b0000_010; else ecc_state[7:1]<=7'b0001_000; endend6'b010001://command 44Hbegin if(~start) begin ecc_state[7:1]<=7'b0001_000; rs<=256'b0; start<=1'b1; end else if(~cs_n ~wr_n_syn addr==3'b010 ecc_state[4]) begin mr<=datain; multiply_counter<=4'b0;]]><![CDATA[ ecc_state[7:1]<=7'b0000_010; end else if(ecc_state[2]) begin if(mr[7]) begin if((md[255:248]{ipol[262:256],1'b0})) begin if((rs[255:248]ipol[263:256])) rs<=md^ipol[255:0]^{rs[254:0],1'b0}^ipol[255:0]; else rs<=md^ipol[255:0]^{rs[254:0],1'b0}; end else if((rs[255:248]ipol[263:256])) rs<={rs[254:0],1'b0}^ipol[255:0]^md; else rs<={rs[254:0],1'b0}^md; end else if((rs[255:248]ipol[263:256])) rs<={rs[254:0],1'b0}^ipol[255:0]; else rs<={rs[254:0],1'b0}; mr<={mr[6:0],1'b0}; multiply_counter<=multiply_counter+1'b1; if(multiply_counter!=4'b0111) ecc_state[7:1]<=7'b0000_010; else ecc_state[7:1]<=7'b0001_000;]]><![CDATA[ endend6'b010010://command 48Hbegin if(start==1'b1)start<=1'b0; if(~ecc_state[4]) ecc_state[7:1]<=7'b0001_000; else if(~cs_n ~wr_n_syn addr==3'b010) begin ipol<={ipol[255:0],datain^md[255:248]}; md<={md[247:0],md[255:248]}; if(current_position==5'b10111) current_position<=5'b0; else current_position<=current_position+1'b1; if(current_position!=5'b10110) ecc_state<=8'b0001_0001; else ecc_state<=8'b0001_0000; endend6'b010011://command 4cHbegin if(start==1'b1)start<=1'b0; if(~ecc_state[4]) ecc_state[7:1]<=7'b0001_000; else if(~cs_n ~wr_n_syn addr==3'b010) begin ipol<={ipol[255:0],datain};]]><![CDATA[ endend6'b010100://command 50Hbegin if(start==1'b1)start<=1'b0; if(~ecc_state[4]) ecc_state[7:1]<=7'b0001_000; else if(~cs_n ~wr_n_syn addr==3'b010) begin md<={md[247:0],datain^md[255:248]}; if(current_position==5'b10111) current_position<=5'b0; else current_position<=current_position+1'b1; if(current_position!=5'b10110) ecc_state<=8'b0001_0001; else ecc_state<=8'b0001_0000; endend6'b010101://command 54Hbegin if(start==1'b1)start<=1'b0; if(~ecc_state[4]) ecc_state[7:1]<=7'b0001_000; else if(~cs_n ~wr_n_syn addr==3'b010) begin md<={md[247:0],datain}; if(current_position==5'b10111)]]>3.電路工作原理說明ECC加速器電路包含總線控制邏輯電路、ECC控制邏輯電路和ECC運算邏輯電路三個電路單元。總線控制邏輯電路控制CPU對三個專門功能寄存器(ECC控制寄存器、ECC狀態寄存器和ECC數據寄存器)的直接讀寫操作;同時根據ECC控制寄存器的命令通過ECC數據寄存器完成對四個ECC內部寄存器(被乘數寄存器、乘數寄存器、不可規約多項式寄存器和結果寄存器)的間接讀寫操作。ECC控制邏輯電路根據CPU寫入ECC控制寄存器的指令(共12條),控制ECC完成各種相應操作;ECC運算邏輯電路根據CPU寫入ECC控制寄存器的指令,通過精巧的體系結構設計使其在一個時鐘周期內完成256bit×1bit的GF2n乘運算(包括取摸),也就是說在乘數及時寫入的情況下在256個時鐘周期內完成256位的GF(2n)乘運算。
(1)在總線控制邏輯電路中主處理器和ECC加速器之間是通過8位的數據總線來進行數據交換的。主處理器可以將命令和數據以同步方式直接寫入ECC控制寄存器和ECC數據寄存器,並通過讀出ECC狀態寄存器來監測加速器的工作狀態。
(2)被乘數寄存器是一個32位元組的可讀可寫間接訪問寄存器。通過「寫被乘數寄存器」指令連續32個時鐘節拍將8位的ECC數據寄存器的內容左移入被乘數寄存器。執行「寫被乘數寄存器同時實現加運算」指令時,待寫入ECC數據寄存器的8位數據先和原被乘數寄存器的相應位進行GF(2n)上的加運算(異或)再間接寫入被乘數寄存器。「復位被乘數寄存器」將左移過的被乘數寄存器移位到復位後的原始位置。「擦除被乘數寄存器」指令在一個時鐘周期內將被乘數寄存器的32個字節復位為全0(3)不可規約多項式寄存器是一個33位元組的只寫間接訪問寄存器。通過「寫不可規約多項式」指令連續33個時鐘節拍將8位的ECC數據寄存器的內容左移入不可規約多項式寄存器。不可規約多項式寄存器的最高字節有效地指示了不可規約多項式,非0最高位的位置,這樣大大提高了計算效率。需要特別說明的是,ECC加速器中GF(2n)上的乘運算是左對齊進行的。
(4)乘數寄存器是一個8位的只寫間接訪問寄存器。通過「寫乘數寄存器並啟動乘運算」指令可以將ECC數據寄存器的內容一次寫入乘數寄存器,並在後續的8個時鐘周期內每拍完成一個256bit×1bit的GF(2n)乘運算(包括取模)。本設計採用全串行結構來完成GF(2n)上的乘運算,一方面電路結構簡單,晶片面積小;另一方面可以適應乘數不定長的情況,使用靈活。每8位運算之間還可以插入「空操作」指令,來對抗功耗分析。乘運算可以通過「結束乘運算」或除「寫乘數寄存器並啟動乘運算」指令外的其它任何指令來結束。
(5)結果寄存器是一個32位元組的只讀間接訪問寄存器。通過「讀結果寄存器」指令可以連續32個時鐘節拍將8位的運算結果寫入ECC數據寄存器。「讀結果寄存器同時實現加運算」指令將運算結果和被乘數寄存器的相應位進行GF(2n)上的加運算(異或)再間接讀出。為了豐富處理手段,ECC加速器還提供了「將結果寄存器的內容拷貝到被乘數寄存器」指令,方便了編程。
4.電路應用效果本發明實際應用在「西安市科技計劃項目信息技術專項高強度非對稱加密智能安全晶片技術研究」項目的電路設計中。此項目通過採用本發明電路代替傳統的GF(2n)上的乘、加電路,明顯簡化了電路的結構、提高了運算速度,同時又解決了乘數不定長的問題,取得了很好效果。實際應用測試結果表明該設計電路的功能完全正確,各項性能指標均符合要求。
權利要求
1.一種基於GF(2n)全串行的ECC加速器電路,其特徵在於包括總線控制邏輯電路、ECC控制邏輯電路和ECC運算邏輯電路三個電路單元,輸入信號datain[7:0]包含數據和控制信息,連接到總線控制邏輯電路;地址信號addr[7:0]連接到總線控制邏輯電路;總線控制邏輯電路的輸出包含按字節傳輸的被乘數md[255:0]、乘數mr[7:0]以及控制信息ecc_ctrl[7:0],其中被乘數md[255:0]按字節傳輸到ECC運算邏輯電路,乘數mr[7:0]連接到ECC運算邏輯電路,控制信息ecc_ctrl[7:0]連接到ECC控制邏輯電路;ECC控制邏輯電路根據輸入控制信號進行處理後生成的ECC狀態信號ecc_state[7:0]輸出到ECC運算邏輯電路;ECC運算邏輯電路根據輸入的狀態信號對輸入數據進行處理生成的結果信號rs[255:0]連接到總線控制邏輯電路;總線控制邏輯電路輸出信號dataout[7:0];時鐘信號clk、寫信號wr_n、讀信號rd_n、片選信號cs_n、復位信號reset_n是電路的共用輸入信號。
全文摘要
ECC加速器電路涉及到橢圓曲線加密系統中實現GF(文檔編號H04L9/30GK101051262SQ20071001788
公開日2007年10月10日 申請日期2007年5月18日 優先權日2007年5月18日
發明者蔣林, 謝曉燕, 孫家澤 申請人:西安郵電學院