《2022年pbc_library实现的bls签名源码分析 .pdf》由会员分享,可在线阅读,更多相关《2022年pbc_library实现的bls签名源码分析 .pdf(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、bls 签名方案( A 签名, B 验证) :A: 生成一个随机数 x 作为私钥,生成随机的群生成元g,公钥 y=gx;被签名的消息 m,计算 m 的哈希值 h:h=hash (m) ;对 h 进行签名: sig=hx; B: B 收到的签名消息为sig; 验证双线性映射 e(sig,g)与 e(h,y)是否相等;其中 e(h,y)=e(h,gx)=e(h,g)x; 若 e(sig,g)=e(sig,g)=e(hx,g)=e(h,g)x=e(h,y),则说明 B 收到的签名是 A 的真实签名; */ #include #include int main(int argc, char *argv
2、) /定义需要用到的变量;pairing_t pairing; element_t g, h; element_t public_key, sig; element_t secret_key; element_t temp1, temp2; /初始化群 G1,G2,GT;pbc_demo_pairing_init(pairing, argc, argv); element_init_G2(g, pairing); element_init_G2(public_key, pairing); element_init_G1(h, pairing); element_init_G1(sig, pai
3、ring); element_init_GT(temp1, pairing); element_init_GT(temp2, pairing); element_init_Zr(secret_key, pairing); printf(Short signature testn); /generate system parameters element_random(g); /生成一个随机数作为生成元element_printf(system parameter g = %Bn, g); /generate private key element_random(secret_key); /生成
4、一个随机数作为私钥名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 5 页 - - - - - - - - - element_printf(private key = %Bn, secret_key); /compute corresponding public key element_pow_zn(public_key, g, secret_key); /计算公钥 =g(私钥);element_printf(public key = %Bn, public_key);
5、/generate element from a hash /for toy pairings, should check that pairing(g, h) != 1 element_from_hash(h, hashofmessage, 13); /计算消息的 hash值element_printf(message hash = %Bn, h); /hsecret_key is the signature /in real life: only output the first coordinate element_pow_zn(sig, h, secret_key); /对消息哈希值
6、h 签名 sig=h(私钥);element_printf(signature = %Bn, sig); int n = pairing_length_in_bytes_compressed_G1(pairing); /int n = element_length_in_bytes_compressed(sig); int i; unsigned char *data = pbc_malloc(n); element_to_bytes_compressed(data, sig); printf(compressed = ); for (i = 0; i n; i+) printf(%02X,
7、datai); printf(n); element_from_bytes_compressed(sig, data); element_printf(decompressed = %Bn, sig); pbc_free(data); /verification part 1 element_pairing(temp1, sig, g); /计算双线性映射temp1=e(h(私钥 ),g); element_printf(f(sig, g) = %Bn, temp1); /verification part 2 /should match above element_pairing(temp2
8、, h, public_key); /计算双线性映射temp2=e(h,g(私钥); element_printf(f(message hash, public_key) = %Bn, temp2); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 5 页 - - - - - - - - - if (!element_cmp(temp1, temp2) /如果 temp1=temp2,则说明私钥和公钥是配对的,签名验证通过,如果不相等,则公私钥不配对,签名验证失败prin
9、tf(signature verifiesn); else printf(*BUG* signature does not verify *BUG*n); int n = pairing_length_in_bytes_x_only_G1(pairing); /int n = element_length_in_bytes_x_only(sig); int i; unsigned char *data = pbc_malloc(n); element_to_bytes_x_only(data, sig); printf(x-coord = ); for (i = 0; i GT = out-f
10、ield, pairing output mismatch); PBC_ASSERT(pairing-G1 = in1-field, pairing 1st input mismatch); PBC_ASSERT(pairing-G2 = in2-field, pairing 2nd input mismatch); if (element_is0(in1) element_set0(out); return; if (element_is0(in2) element_set0(out); return; / TODO: out is an element of a multiplicativ
11、e subgroup, but the / pairing routine expects it to be an element of the full group, hence / the out-data. I should make this clearer. pairing-map(element_ptr) out-data, in1, in2, pairing); /*manual pairing_apply Computes a pairing: out = e(in1, in2), where in1, in2, out must be in the groups G1, G2
12、, GT. */ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 5 页 - - - - - - - - - /计算双线性映射 out=e(in1,in2) ;static inline void element_pairing(element_t out, element_t in1, element_t in2) pairing_ptr pairing = out-field-pairing; PBC_ASSERT(pairing != NULL, pairing output mismatch); pairing_apply(out, in1, in2, pairing); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 5 页 - - - - - - - - -