首页 > 其他分享 >C语言PBC库(持续更新)

C语言PBC库(持续更新)

时间:2024-11-10 23:41:09浏览次数:1  
标签:pbc pairing result3 更新 element init PBC C语言

PBC

前言

我的环境是Ubantu24
边写边整理,持续更新。
最近做毕设需要用到,就借此机会写一些关于c语言PBC库的教程,一些用法有结合GPT。
说是教程不过是把官方文档说的函数用法翻译了一遍,关于双线性配对的知识我不了解,这里就不将了,我看网上大部分说的有就只是当黑盒调用就行了。

官方文档函数:https://crypto.stanford.edu/pbc/manual/

安装和环境配置

安装:

参考:https://min.jeza-chen.com/2020/06/04/PBC-Library/

按照官方文档,安装PBC库前需要安装GMP库,下面是上面这篇教程的按照方法,我用了之后没什么问题。

  1. 安装 GMP库 sudo apt-get install libgmp3-dev

  2. 安装flex和bisonsudo apt-get install flex, bison

  3. 安装编译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
    

环境配置:

  1. 包含PBC的头文件#include <pbc/pbc.h>
  2. 编译时,需要链接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

相关文章

  • 用c语言写一个简易版的扫雷游戏
    1、扫雷游戏的功能说明1.1:基本功能     1、使用控制台实现经典的扫雷游戏     2、游戏可以通过菜单实现继续玩或者退出游戏     3、扫雷游戏的棋盘是9*9的格子     4、随机布置10个雷     5、可以排查雷      ......
  • 小北的字节跳动青训营与LangChain实战课:深入探索Chain的奥秘(上)写一篇完美鲜花推文?用Se
     前言    最近,字节跳动的青训营再次扬帆起航,作为第二次参与其中的小北,深感荣幸能借此机会为那些尚未了解青训营的友友们带来一些详细介绍。青训营不仅是一个技术学习与成长的摇篮,更是一个连接未来与梦想的桥梁~小北的青训营XMarsCode技术训练营——AI加码,字节跳......
  • 更新教程:如何以 6 种新方式将视频从 Android 传输到 Mac
    概括我们的生活充满了多媒体内容,在设备之间无缝传输视频的需求变得越来越重要。对于寻求将其珍贵视频转移到Mac生态系统的Android用户,本指南提供了多种方法的全面概述,确保该过程既高效又用户友好。无论是传统的USB连接还是无线替代方案,我们都将探索分步说明,使您能够轻松......
  • 蓝桥杯真题——good-sequence(C语言)
     问题描述一个序列 [b1,b2,...,bm]若对于 2≤i≤m满足 bi≤b1,则称为好序列。现在给定 [a1,a2,...,an],求对于该序列的每一个后缀 [ak,ak+1,...,an](1≤k≤n)最少能划分成多少个好序列。输入格式第一行包含一个整数 n ,表示数组 a 的长度。第二行包含 nn 个......
  • (4)---【位图填充】【C语言】【OpenGL库】【计算机图形学】
     本次实验项目     多边形位图填充图形功能简单介绍    本实验填充特定图案的图形“大裤衩子”。程序中定义了一个位图数组fly,这个数组被用来通过glPolygonStipple函数创建多边形的点模式填充效果。图形由两个绿色的多边形组成,代表“大裤衩”的左右两部分......
  • C语言字符串和十六进制的相互转换方式
    C语言字符串和十六进制的相互转换方式-我就叫宋帅呀-博客园C语言的字符串操作并不像java,Csharp那样提供直接的方法,简单粗暴。所以,在转换的时候往往费力费时,近日做项目正好用到和java程序通讯,java发送过来的数据是十六进制数字组成的字符串,解析的时候颇费心思才算完成,所以......
  • (5)---【DDA画线算法】C语言-OpenGL库-计算机图形学
    本次实验项目         DDA画线算法理解与运用。算法介绍        DDA(DigitalDifferentialAnalyzer)画线算法是一种基于数值微分原理的直线生成算法。它主要用于在光栅系统中绘制直线,即在像素点阵中生成直线。DDA算法的核心思想是从一个端点开始,通过增量,逐......
  • 实验4 C语言数组应用编程
    实验任务1:task1.c源代码:1#include<stdio.h>2#defineN43#defineM245voidtest1(){6intx[N]={1,9,8,4};7inti;89printf("sizeof(x)=%d\n",sizeof(x));1011for(i=0;i<N;++i)......
  • 【C语言】解决error C4996: 'fopen': This function or variable may be unsafe. Cons
    几天编译文件的时候报错,编译出错信息:错误1errorC4996:'fopen':Thisfunctionorvariablemaybeunsafe.Considerusingfopen_sinstead.Todisabledeprecation,use_CRT_SECURE_NO_WARNINGS.Seeonlinehelpfordetails.意思就是fopen不安全,推荐你用fopen_s,这个时......
  • 实验4 c语言数组应用编程
    task1:1#include<stdio.h>2#include<stdlib.h>3#defineN44#defineM2567voidtest1(){8intx[N]={1,9,8,4};9inti;1011printf("sizeof(x)=%d\n",sizeof(x));1213for(i=0;i<N;++i)14......