PBC
前言
我的环境是Ubantu24
边写边整理,持续更新。
最近做毕设需要用到,就借此机会写一些关于c语言PBC库的教程,一些用法有结合GPT。
说是教程不过是把官方文档说的函数用法翻译了一遍,关于双线性配对的知识我不了解,这里就不将了,我看网上大部分说的有就只是当黑盒调用就行了。
安装和环境配置
安装:
按照官方文档,安装PBC库前需要安装GMP库,下面是上面这篇教程的按照方法,我用了之后没什么问题。
-
安装 GMP库
sudo apt-get install libgmp3-dev
-
安装flex和bison
sudo apt-get install flex, bison
-
安装编译PBC库
wget https://crypto.stanford.edu/pbc/files/pbc-0.5.14.tar.gz tar -zxvf pbc-0.5.14.tar.gz cd pbc-0.5.14 ./configure make sudo make install
环境配置:
- 包含PBC的头文件
#include <pbc/pbc.h>
- 编译时,需要链接GMP库和PBC库,即再gcc时加上,
-lgmp -lpbc
(在tasks.json中的"args"里添加"-lgmp"和"-lpbc"即可)
我遇到的问题:
error while loading shared libraries: libpbc.so.1: cannot open shared object file: No such file or directory
添加编译参数-I/usr/local/include/pbc
(在tasks.json中的"args"里添加"-I/usr/local/include/pbc")
先放一个例子,可以看看能不能运行成功,输出的三个结果应该一样。
#include <pbc/pbc.h>
#include <stdio.h>
#define TYPEA_PARAMS \
"type a\n" \
"q 87807107996633125224377819847540498158068831994142082" \
"1102865339926647563088022295707862517942266222142315585" \
"8769582317459277713367317481324925129998224791\n" \
"h 12016012264891146079388821366740534204802954401251311" \
"822919615131047207289359704531102844802183906537786776\n" \
"r 730750818665451621361119245571504901405976559617\n" \
"exp2 159\n" \
"exp1 107\n" \
"sign1 1\n" \
"sign0 1\n"
int main() {
pairing_t pairing;
pairing_init_set_buf(pairing, TYPEA_PARAMS, strlen(TYPEA_PARAMS));
// 定义群元素
element_t g, h, result1, result2, result3;
element_t a, b;
// 初始化群元素
element_init_G1(g, pairing);
element_init_G1(h, pairing);
element_init_GT(result1, pairing);
element_init_GT(result2, pairing);
element_init_GT(result3, pairing);
element_init_Zr(a, pairing);
element_init_Zr(b, pairing);
// 生成随机元素
element_random(g);
element_random(h);
element_random(a);
element_random(b);
// 计算e(g,h)^(a*b)
pairing_apply(result3, g, h, pairing);
element_pow_zn(result3, result3, a);
element_pow_zn(result3, result3, b);
// 计算g^a和g^b
element_pow_zn(g, g, a);
element_pow_zn(h, h, b);
// 计算e(g^a, h^b)
pairing_apply(result1, g, h, pairing);
pairing_apply(result2, h, g, pairing);
// 输出结果
printf("Result of pairing e(g^a, h^b): ");
element_printf("%B\n", result1);
printf("Result of pairing e(h^b, g^a): ");
element_printf("%B\n", result2);
printf("Result of pairing e(g, h)^(a*b): ");
element_printf("%B\n", result3);
// 清理元素
element_clear(g);
element_clear(h);
element_clear(result1);
element_clear(result2);
element_clear(result3);
element_clear(a);
element_clear(b);
pairing_clear(pairing);
return 0;
}
使用
初始化
双线性配对一般使用的是pbc库中的Type-A
这一部分算是固定的。
#define TYPEA_PARAMS \
"type a\n" \
"q 87807107996633125224377819847540498158068831994142082" \
"1102865339926647563088022295707862517942266222142315585" \
"8769582317459277713367317481324925129998224791\n" \
"h 12016012264891146079388821366740534204802954401251311" \
"822919615131047207289359704531102844802183906537786776\n" \
"r 730750818665451621361119245571504901405976559617\n" \
"exp2 159\n" \
"exp1 107\n" \
"sign1 1\n" \
"sign0 1\n"
pairing_t pairing;
pairing_init_set_buf(pairing, TYPEA_PARAMS, strlen(TYPEA_PARAMS));
标签:pbc,pairing,result3,更新,element,init,PBC,C语言
From: https://www.cnblogs.com/naby/p/18538752