天天看點

JPBC庫應用之BLS簽名JPBC庫應用之BLS簽名

JPBC庫應用之BLS簽名

視訊位址 https://www.bilibili.com/video/BV1jA41147vt/

BLS簽名簡單介紹

Initialization

  1. 生成pairing參數 < G 1 , G T , Z r , g , e G_1, G_T, Z_r, g, e G1​,GT​,Zr​,g,e>
  2. 選取随機數 x ∈ Z r x \in Z_r x∈Zr​ 作為私鑰
  3. 計算對應的公鑰 g x g^x gx

Singing

簽名者擁有的資料包括消息 m m m,私鑰 x x x,以及公開的pairing參數

簽名者将消息 m m m 的哈希值(雜湊演算法可以自定義,簽名者和驗證者一緻)映射為一個 G 1 G_1 G1​ 上的群元素 h h h,并利用私鑰計算簽名 σ = h x \sigma = h^x σ=hx

Verifying

驗證者擁有的資料包括 m , σ , g x m, \sigma, g^x m,σ,gx,以及公開的pairing參數

驗證者利用公鑰驗證簽名如下

e ( σ , g ) = ? e ( h , g x ) e(\sigma, g) \overset{?}{=} e(h, g^x) e(σ,g)=?e(h,gx) 即 e ( h x , g ) = ? e ( h , g x ) e(h^x, g)\overset{?}{=}e(h, g^x) e(hx,g)=?e(h,gx)

BLS簽名算法實作

import it.unisa.dia.gas.jpbc.Element;
import it.unisa.dia.gas.jpbc.Field;
import it.unisa.dia.gas.jpbc.Pairing;
import it.unisa.dia.gas.plaf.jpbc.pairing.PairingFactory;


public class BLS {

    public static void main(String[] args){
        // Initialization
        Pairing bp = PairingFactory.getPairing("a.properties");
        Field G1 = bp.getG1();
        Field Zr = bp.getZr();
        Element g = G1.newRandomElement();
        Element x = Zr.newRandomElement();
        Element g_x = g.duplicate().powZn(x);

        //Signing
        String m = "message";
        byte[] m_hash = Integer.toString(m.hashCode()).getBytes();
        Element h = G1.newElementFromHash(m_hash, 0, m_hash.length);
        Element sig = h.duplicate().powZn(x);

        //Verification
        Element pl = bp.pairing(g, sig);
        Element pr = bp.pairing(h, g_x);
        if (pl.isEqual(pr))
            System.out.println("Yes");
        else
            System.out.println("No");
    }
}