本文整理了 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
这些工具主要用于后续源码编译。gcc 和 make 用于编译 C 语言版本的 PBC,m4、flex、bison 等工具用于处理部分自动生成的编译配置。
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.h 和 libgmp.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
如果终端输出了 g1、g2 和 e(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 版本、GOROOT、GOPATH,并且 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.h、libpbc.so 和 libgmp.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 语言中较方便地进行基于双线性对的密码学原型开发。