go雙線性對數字簽名
阿新 • • 發佈:2018-11-08
設e: GG->G’,為一個非退化的雙線性對映,G和G’為素數r階的乘法群,G的生成元為g,H:{0,1} ->G。根據雙線性對映的性質,e(g^x, gy)=e(g,g)(x*y)。要求在G上,CDH problem是困難的。
BLS簽名的三個函式
1、KeyGen:選取[0, r-1]內的一個隨機整數x,作為私鑰sk;g^x作為公鑰pk。由於CDH問題是困難的,我們相信DL問題也是困難的(雖然這一點還沒有證明),從pk無法計算得到x。
2、Signing:訊息m,H(m)->h,簽名為sig=h^x
3、Verification:驗證者已知G、gx(即pk)、h、sig’。為了驗證sig’=h
證明:若e(gx,h)=e(g,sig’),由於G是素數階的,h也是生成元,設sig’=hy,由於e(gx,h)=e(g,h)x,且e(g,sig’)=e(g,hy)=e(g,h)y,則有e(g,h)x=e(g,h)y。由於G’群也是素數r階群,故有x=y,即sig’=h^x=sig,簽名是由擁有私鑰x的人產生的。
實現
首先安裝 GMP
sudo apt-get install libgmp-dev
然後安裝PBC
./configure make sudo make install go get github.com/Nik-U/pbc
安裝golang的庫
BLS signature golang lib
go get go get github.com/yunfeiyangbuaa/bls_golang_lib/BLS
示例:
func main() { BLS.BLS_start() privKey,pubKey:=BLS.Generate_bls_keypair() signature :=BLS.Bls_signature([]byte("hello") ,privKey) sibyte:=BLS.SetSIGIntoByte(signature) sign:=BLS.SetPubKeyFromByte(sibyte) BLS.Bls_verify([]byte("hello") ,pubKey,sign) }