【源碼閱讀】用Go語言實現(xiàn)環(huán)簽名的簽名和驗證(一)_第1頁
【源碼閱讀】用Go語言實現(xiàn)環(huán)簽名的簽名和驗證(一)_第2頁
【源碼閱讀】用Go語言實現(xiàn)環(huán)簽名的簽名和驗證(一)_第3頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

【源碼閱讀】?Go語?實現(xiàn)環(huán)簽名的簽名和驗證(?)環(huán)簽名是區(qū)塊鏈中保護(hù)?戶隱私的?法之?,今天起更新環(huán)簽名的實現(xiàn),順帶講?下原理。源碼是MIT的開源代碼,?go語?編寫,由于我也是go語???,所以?邊讀?邊學(xué)語法。import("bytes""crypto/elliptic""crypto/sha256""fmt""io""math/big""sync")?些包,bytes是?進(jìn)制處理數(shù)組(對于哈希函數(shù)就很有效了),crypto是密碼學(xué)庫,這?我們?的是橢圓曲線密碼學(xué),??到了SHA256哈希函數(shù)。math/big是?整數(shù)包,因為密碼通常都是很長的,超出了整數(shù)范圍。sync是并發(fā),具體的后?解釋。?先我們來看看源碼庫elliptic.curve的內(nèi)容typeCurveinterface{//Paramsreturnstheparametersforthecurve.Params()*CurveParams//IsOnCurvereportswhetherthegiven(x,y)liesonthecurve.IsOnCurve(x,y*big.Int)bool//Addreturnsthesumof(x1,y1)and(x2,y2)Add(x1,y1,x2,y2*big.Int)(x,y*big.Int)//Doublereturns2*(x,y)Double(x1,y1*big.Int)(x,y*big.Int)//ScalarMultreturnsk*(Bx,By)wherekisanumberinbig-endianform.ScalarMult(x1,y1*big.Int,k[]byte)(x,y*big.Int)//ScalarBaseMultreturnsk*G,whereGisthebasepointofthegroup//andkisanintegerinbig-endianform.ScalarBaseMult(k[]byte)(x,y*big.Int)}typeCurveParamsstruct{PNB*big.Int//theorderoftheunderlyingfield*big.Int//theorderofthebasepoint*big.Int//theconstantofthecurveequationGx,Gy*big.Int//(x,y)ofthebasepointBitSizeint//thesizeoftheunderlyingfieldstring//thecanonicalnameofthecurveName}注釋很詳細(xì),解釋?下,先看曲線參數(shù),P是橢圓曲線的階,N是基點的階,它?定是P的?個質(zhì)因?,GX,GY是基點坐標(biāo),Bitsize是基點階的字節(jié)??。再看曲線函數(shù),Add是曲線上點的加法,?何上為連線求另?點,公式可以?韋達(dá)定理推導(dǎo),需要注意,我們?橢圓曲線代?到離散對數(shù)時,點的加法就是數(shù)的乘法,橢圓曲線密碼的安全性?就是因為沒有多項式復(fù)雜度?法求倍數(shù)。Double函數(shù)是?加,?何上為切線求另?交點。ScalarMult是點的數(shù)乘,注意就是離散對數(shù)??的冪。ScalarBaseMult是基點的數(shù)乘,供?便?。下?看密鑰結(jié)構(gòu)體:typePublicKeystruct{elliptic.CurveX,Y*big.Int}typePrivateKeystruct{PublicKeyD*big.Int}定義公鑰和私鑰,公鑰?的X,Y就是公鑰坐標(biāo),公鑰的產(chǎn)?公式為,其中x是私鑰,也就是PrivateKey結(jié)構(gòu)體中的D。typePublicKeyRingstruct{Ring[]PublicKey}定義環(huán),環(huán)就是公鑰集合。funcNewPublicKeyRing(capuint)*PublicKeyRing{return&PublicKeyRing{make([]PublicKey,0,cap)}}?成指定長度的環(huán),0表?初始元素個數(shù)為0,預(yù)留cap個元素的空間。make是開數(shù)組的函數(shù)。func(r*PublicKeyRing)Add(pubPublicKey){r.Ring=append(r.Ring,pub)}func(r*PublicKeyRing)Len()int{returnlen(r.Ring)}func(r*PublicKeyRing)Bytes()(b[]byte){for_,pub:=ranger.Ring{b=append(b,pub.X.Bytes()...)b=append(b,pub.Y.Bytes()...)}return}varone=new(big.Int).SetInt64(1)?些常?操作,append是追加元素,range是遍歷關(guān)鍵詞。funcrandFieldElement(celliptic.Curve,randio.Reader)(k*big.Int,errerror){params:=c.Params()b:=make([]byte,params.BitSize/8+8)_,err=io.ReadFull(rand,b)iferr!=nil{return}k=new(big.Int).SetBytes(b)n:=new(big.Int).Sub(params.N,one)k.Mod(k,n)k.Add(k,one)return}隨機數(shù)產(chǎn)?,下半段是避免出現(xiàn)0的處理,因為橢圓曲線的?群是循環(huán)群,所以出現(xiàn)零點是可能的。funcGenerateKey(celliptic.Curve,randio.Reader)(priv*PrivateKey,errerror){k,err:=randFieldElement(c,rand)iferr!=nil{return}priv=new(PrivateKey)priv.PublicKey.Curve=cpriv.D=kpriv.PublicKey.X,priv.PublicKey.Y=c.ScalarBaseMult(k.Bytes())return}產(chǎn)?私鑰、公鑰。注意,是先有私鑰,后有公

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論