Ubuntu 22.04 环境下 PBC 与 Golang 的安装、配置与测试

本文整理了 Ubuntu 22.04 环境下 PBC、GMP、Golang 以及 Go 语言 PBC Wrapper 的安装与测试流程。内容参考了:Ubuntu22.04环境下PBC与Golang的安装与测试,并在原有步骤基础上补充了更完整的环境检查、动态库配置、Go Module 使用方式和常见问题排查。

1. 背景说明

PBC 的全称是 Pairing-Based Cryptography Library,是一个面向双线性对密码学的 C 语言库,常用于身份基加密、属性基加密、短签名、广播加密等密码学方案的实验实现。Go 语言中的 github.com/Nik-U/pbc 并不是完全独立的纯 Go 实现,而是通过 CGO 对底层 PBC C 库进行封装。因此,在 Ubuntu 中使用 GoPBC 之前,必须先安装好 GMP 和原生 PBC 库。

推荐安装顺序如下:

text 复制代码
系统依赖 → GMP → PBC C Library → Golang → GoPBC Wrapper → 测试程序

其中 GMP 是 PBC 的底层大整数运算依赖,PBC C Library 提供双线性对核心能力,GoPBC Wrapper 则负责在 Go 语言中调用这些能力。

2. 环境准备

本文实验环境如下:

text 复制代码
操作系统:Ubuntu 22.04
编译器:gcc、g++
构建工具:make、autoconf、automake、libtool
依赖库:GMP、PBC
Go 环境:Go 1.x

先更新系统软件源,并安装基本编译工具:

bash 复制代码
sudo apt update
sudo apt install -y build-essential wget curl git make gcc g++ m4 flex bison autoconf automake libtool pkg-config

这些工具主要用于后续源码编译。gccmake 用于编译 C 语言版本的 PBC,m4flexbison 等工具用于处理部分自动生成的编译配置。

3. 安装 GMP

PBC 依赖 GMP 完成大整数和有限域相关运算。在 Ubuntu 22.04 中,可以直接通过 apt 安装 GMP 开发包:

bash 复制代码
sudo apt install -y libgmp-dev

安装完成后,可以检查 GMP 头文件和动态库是否存在:

bash 复制代码
ls /usr/include/gmp.h
ldconfig -p | grep gmp

如果能够看到 gmp.hlibgmp.so,说明 GMP 已经安装成功。

4. 编译安装 PBC C Library

GoPBC 依赖原生 PBC 库,因此需要先安装 PBC C Library。这里使用 PBC 0.5.14 版本作为示例。

bash 复制代码
cd ~
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

执行配置、编译和安装:

bash 复制代码
./configure
make -j$(nproc)
sudo make install

安装完成后,默认会将头文件和库文件安装到 /usr/local 目录下,例如:

text 复制代码
/usr/local/include/pbc/pbc.h
/usr/local/lib/libpbc.so
/usr/local/lib/libpbc.a

为了让系统能够正确找到 PBC 动态库,需要刷新动态库缓存:

bash 复制代码
sudo ldconfig

如果仍然无法识别 /usr/local/lib 下的动态库,可以手动加入动态库搜索路径:

bash 复制代码
echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/pbc.conf
sudo ldconfig

检查 PBC 是否已经被系统识别:

bash 复制代码
ldconfig -p | grep pbc

如果输出中能够看到 libpbc.so,说明 PBC 动态库已经配置成功。

5. 测试 PBC C 环境

在安装 GoPBC 之前,建议先测试原生 PBC C 环境是否可用。新建测试文件:

bash 复制代码
mkdir -p ~/pbc-c-test
cd ~/pbc-c-test
nano pbc_test.c

写入以下测试代码:

c 复制代码
#include <stdio.h>
#include <pbc/pbc.h>

int main(void) {
    pbc_param_t param;
    pairing_t pairing;
    element_t g1, g2, gt;

    pbc_param_init_a_gen(param, 160, 512);
    pairing_init_pbc_param(pairing, param);

    element_init_G1(g1, pairing);
    element_init_G2(g2, pairing);
    element_init_GT(gt, pairing);

    element_random(g1);
    element_random(g2);

    pairing_apply(gt, g1, g2, pairing);

    element_printf("g1 = %B\n", g1);
    element_printf("g2 = %B\n", g2);
    element_printf("e(g1, g2) = %B\n", gt);

    element_clear(g1);
    element_clear(g2);
    element_clear(gt);
    pairing_clear(pairing);
    pbc_param_clear(param);

    return 0;
}

编译测试程序:

bash 复制代码
gcc pbc_test.c -o pbc_test -I/usr/local/include -L/usr/local/lib -lpbc -lgmp

运行测试程序:

bash 复制代码
./pbc_test

如果终端输出了 g1g2e(g1, g2) 等随机群元素,说明 PBC C 环境已经安装成功。

如果运行时报错:

text 复制代码
error while loading shared libraries: libpbc.so.1: cannot open shared object file

通常是动态库路径没有生效,可以执行:

bash 复制代码
echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/pbc.conf
sudo ldconfig

然后重新运行:

bash 复制代码
./pbc_test

6. 安装 Golang

Ubuntu 自带软件源中的 Go 版本可能偏旧。如果只是做简单测试,可以直接使用 apt 安装:

bash 复制代码
sudo apt install -y golang

如果希望使用较新的 Go 版本,建议从 Go 官方下载压缩包安装。下面以 go1.x.x 为例,实际使用时可以替换为 Go 官网提供的稳定版本。

bash 复制代码
cd ~
wget https://go.dev/dl/go1.x.x.linux-amd64.tar.gz
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go1.x.x.linux-amd64.tar.gz

配置 Go 环境变量:

bash 复制代码
nano ~/.bashrc

在文件末尾加入:

bash 复制代码
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
export CGO_ENABLED=1

使配置生效:

bash 复制代码
source ~/.bashrc

检查 Go 是否安装成功:

bash 复制代码
go version
go env GOROOT
go env GOPATH
go env CGO_ENABLED

如果能够正确输出 Go 版本、GOROOTGOPATH,并且 CGO_ENABLED=1,说明 Go 环境配置成功。

对于国内网络环境,可以配置 Go 代理:

bash 复制代码
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct

7. 安装 GoPBC Wrapper

Go 语言中的 PBC Wrapper 地址为:

text 复制代码
https://github.com/Nik-U/pbc

建议使用 Go Module 管理项目,而不是直接在 GOPATH 中手动创建目录。

新建测试项目:

bash 复制代码
mkdir -p ~/go-pbc-test
cd ~/go-pbc-test
go mod init go-pbc-test

安装 GoPBC:

bash 复制代码
go get github.com/Nik-U/pbc

如果这一步报错,优先检查以下几点:

bash 复制代码
go env CGO_ENABLED
ldconfig -p | grep pbc
ldconfig -p | grep gmp
ls /usr/local/include/pbc/pbc.h

GoPBC 是 CGO 封装,因此必须能找到 pbc.hlibpbc.solibgmp.so

8. 编写 GoPBC 测试程序

~/go-pbc-test 目录下创建 main.go

bash 复制代码
nano main.go

写入以下代码:

go 复制代码
package main

import (
	"fmt"

	"github.com/Nik-U/pbc"
)

func main() {
	params := pbc.GenerateA(160, 512)
	pairing := params.NewPairing()

	g := pairing.NewG1()
	h := pairing.NewG2()

	g.Rand()
	h.Rand()

	result := pairing.NewGT().Pair(g, h)

	fmt.Println("PBC Go Wrapper test success.")
	fmt.Println("Is symmetric pairing:", pairing.IsSymmetric())
	fmt.Println("g =", g)
	fmt.Println("h =", h)
	fmt.Println("e(g, h) =", result)
}

运行测试程序:

bash 复制代码
go run main.go

如果能够输出随机群元素和双线性对结果,说明 GoPBC 安装成功。

9. 常见问题与解决方案

9.1 找不到 pbc.h

如果出现以下错误:

text 复制代码
fatal error: pbc/pbc.h: No such file or directory

说明 GoPBC 编译时找不到 PBC 头文件。先检查头文件是否存在:

bash 复制代码
ls /usr/local/include/pbc/pbc.h

如果文件存在,可以临时指定 CGO 编译参数:

bash 复制代码
export CGO_CFLAGS="-I/usr/local/include"
export CGO_LDFLAGS="-L/usr/local/lib -lpbc -lgmp"
go run main.go

如果希望长期生效,可以写入 ~/.bashrc

bash 复制代码
export CGO_CFLAGS="-I/usr/local/include"
export CGO_LDFLAGS="-L/usr/local/lib -lpbc -lgmp"

然后执行:

bash 复制代码
source ~/.bashrc

9.2 找不到 libpbc.so

如果出现以下错误:

text 复制代码
cannot find -lpbc

或者:

text 复制代码
error while loading shared libraries: libpbc.so.1

说明系统没有正确加载 PBC 动态库。执行:

bash 复制代码
echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/pbc.conf
sudo ldconfig
ldconfig -p | grep pbc

然后重新运行:

bash 复制代码
go run main.go

9.3 go get 权限不足

如果在 GOPATH 下安装依赖时报权限错误,不建议使用 sudo go get。更推荐使用 Go Module:

bash 复制代码
mkdir -p ~/go-pbc-test
cd ~/go-pbc-test
go mod init go-pbc-test
go get github.com/Nik-U/pbc

这样依赖会由 Go Module 统一管理,不需要手动修改 GOPATH 目录权限。

9.4 CGO 没有开启

GoPBC 依赖 CGO。如果 CGO_ENABLED=0,会导致编译失败。检查命令如下:

bash 复制代码
go env CGO_ENABLED

如果输出为 0,可以临时开启:

bash 复制代码
export CGO_ENABLED=1
go run main.go

也可以写入 ~/.bashrc

bash 复制代码
export CGO_ENABLED=1

然后执行:

bash 复制代码
source ~/.bashrc

10. 最终检查清单

完成全部安装后,建议依次检查以下内容:

bash 复制代码
gcc --version
go version
go env CGO_ENABLED
ls /usr/local/include/pbc/pbc.h
ldconfig -p | grep gmp
ldconfig -p | grep pbc

如果以上命令均能正常输出,则说明当前环境已经具备以下能力:

text 复制代码
1. 可以编译和运行 PBC C 程序;
2. 可以在 Go 项目中引入 github.com/Nik-U/pbc;
3. 可以通过 GoPBC 调用双线性对运算;
4. 可以继续实现 BLS 签名、属性基加密、广播加密等密码学实验。

11. 总结

Ubuntu 22.04 下安装 PBC 与 Golang 的关键点不在于 Go 代码本身,而在于底层依赖链必须完整。GoPBC 是对 PBC C Library 的封装,因此 GMP、PBC、动态库路径、CGO 配置缺一不可。

推荐实践流程是:先安装并测试 PBC C 环境,再配置 Go 环境,最后通过 Go Module 引入 github.com/Nik-U/pbc。这样可以将问题定位得更清晰:如果 C 测试失败,优先检查 GMP 和 PBC;如果 C 测试成功而 Go 测试失败,优先检查 CGO、头文件路径和动态库路径。

这套环境配置完成后,就可以在 Go 语言中较方便地进行基于双线性对的密码学原型开发。

相关推荐
提伯斯6461 小时前
Linux minicom 串口工具超详细使用教程
linux·运维·服务器
codeejun1 小时前
每日一 Go-72、分布式事务 & 一致性:本地消息表、事务消息、SAGA、TCC怎么选?
开发语言·分布式·golang
Benszen1 小时前
Linux容器简介
linux·运维·服务器
剑神一笑1 小时前
Linux iptables 深度解析:从规则匹配到 NAT 转发实战
linux·运维·服务器
keyipatience1 小时前
23(半)24磁盘和EXT2文件系统
linux·运维
实心儿儿1 小时前
Linux —— 线程互斥和同步
linux
minji...1 小时前
Linux 高级IO(七)多进程、多线程的Reactor反应堆模式扩展、OTOL
linux·运维·c++·多路转接·epoll·reactor反应堆模型
handler011 小时前
【Linux 网络】:poll/epoll 底层机制与 Reactor 并发模型
linux·运维·服务器·网络·c++·多路转接·多路复用
kebidaixu1 小时前
深入解析 Linux GPIO 采集与控制程序(DI/DO 篇)
linux