Skip to main content

🔑Ubuntu系统下PBC库的安装

·254 words
Linux Linux
Yalois
Author
Yalois
freedom
Table of Contents

开学网络安全实验课程的老师要教椭圆曲线,首先就是配置PBC库,Linux作为我的主系统,必须是要配上的。

Ubuntu系统下PBC库的安装
#

0.编译前环境安装
#

sudo apt-get install m4
sudo apt-get install flex
sudo apt-get install bison
sudo apt-get install make

1.下载gmp和pbc并解压源码
#

pbc是依赖于gmp的,所以需要先安装gmp

下载gmp源码

官网:https://gmplib.org/

image-20240904154749656

wget https://gmplib.org/download/gmp/gmp-6.3.0.tar.xz

下载gmp-6.3.0.tar.xz,并解压

tar -xf gmp-6.3.0.tar.xz

下载pbc源码wget https://crypto.stanford.edu/pbc/files/pbc-0.5.14.tar.gz

https://crypto.stanford.edu/pbc/download.html

image-20240904155436476

继续解压

tar -zxvf pbc-0.5.14.tar.gz

image-20240904155645649

2.编译安装gmp
#

!!!可能会遇到gmp编译失败的问题,如果实在无法编译可以使用 sudo apt install libgmp-dev 来安装gmp,然后直接跳过这一步去编译安装PBC

依次执行列面的命令,如果没有出现error代表安装成功

cd gmp-6.3.0
./configure
make
sudo make install

image-20240904155727983

./configure最终结果如下

image-20240904234546013

make最终结果如下

image-20240904234722433

sudo make install最终结果如下

image-20240904234830296

3.编译安装PBC
#

cd ..
cd pbc-0.5.14
./configure
make
sudo make install

image-20240904160105585

./configure结果如下

image-20240904235131837

make结果如下

image-20240904235215875

sudo make install的结果

image-20240904235246785

4.gcc编译代码测试
#

写入下面的代码到test.c

测试代码由GPT4o提供。

#include <stdio.h>
#include <string.h>
#include <pbc/pbc.h>

int main() {
    // 初始化 PBC 参数
    pairing_t pairing;
    const char *params = "type a\n"
                         "q 109\n"
                         "r 101\n"
                         "h 1\n"        // 添加 h 参数
                         "exp1 1\n"     // 添加 exp1 参数
                         "exp2 1\n"     // 添加 exp2 参数
                         "sign0 1\n"    // 添加 sign0 参数
                         "sign1 1\n";   // 添加 sign1 参数
    pairing_init_set_buf(pairing, params, strlen(params));

    // 生成密钥对
    element_t g, sk, pk;
    element_init_G1(g, pairing);
    element_init_Zr(sk, pairing);
    element_init_G1(pk, pairing);

    // 生成生成元 g
    element_random(g);
    // 随机选择私钥 sk
    element_random(sk);
    // 计算公钥 pk = g^sk
    element_pow_zn(pk, g, sk);

    // 打印公钥和私钥
    printf("Public Key (pk): ");
    element_printf("%B\n", pk);
    printf("Secret Key (sk): ");
    element_printf("%B\n", sk);

    // 验证:pk 应该等于 g^sk
    element_t pk_verify;
    element_init_G1(pk_verify, pairing);
    element_pow_zn(pk_verify, g, sk);

    if (element_cmp(pk, pk_verify) == 0) {
        printf("Verification successful: pk == g^sk\n");
    } else {
        printf("Verification failed: pk != g^sk\n");
    }

    // 清理
    element_clear(g);
    element_clear(sk);
    element_clear(pk);
    element_clear(pk_verify);
    pairing_clear(pairing);

    return 0;
}

在test.c同目录下使用gcc编译

gcc test.c -I/usr/local/include -L/usr/local/lib -lpbc -lgmp

运行a.out

如果显示下面内容则代表正常运行。

image-20241109193102430

5.额外问题
#

问题1:编译完之后运行程序报错
#

./a.out: error while loading shared libraries: libpbc.so.1: cannot open shared object file: No such file or directory

执行下面命令之后再运行

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH