1. 程式人生 > >go雙線性對數字簽名

go雙線性對數字簽名

設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

x,即簽名是由擁有私鑰x的人產生的,驗證者計算e(g, hx)與e(gx,sig’),並判斷是否相等,相等則簽名得到驗證。
證明:若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)      
   }

雙線性對github