在golang中使用PBC密码库

2023-10-31 02:10
文章标签 golang 使用 密码 pbc

本文主要是介绍在golang中使用PBC密码库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 安装系统

    使用Ubuntu或Mint操作系统

  
    (1) GIT 和Go安装
    安装git    sudo apt-get install git
    安装golang

     从https://www.golangtc.com/download 下载go
     sudo tar -zxf go1.9.linux-amd64.tar.gz  -C  /usr/local

     vim ~/.profile
     在尾部增加以下行:
     export GOROOT=/usr/local/go
     export GOPATH=/home/xxx/go
     export GOBIN=/home/xxx/gobin
     export PATH=$PATH:$GOROOT/bin:$GOBIN:$GOPATH

     执行下面命令,使其当下生效
    source ~/.profile
    echo $PATH  验证

    注:上面的xxx表示用户名

    (2) 下载PBC密码库并编译

    步骤:

    sudo apt-get install libgmp-dev

    sudo apt-get install build-essential flex bison

    到https://crypto.stanford.edu/pbc/download.html 下载 PBC Go Wrapper软件包

    把下载的软件包解压到某个目录,然后编译,步骤如下:

    ./configure
    make
    sudo make install

    安装好后,重新建立搜索库路径

    sudo ldconfig

    (3) Liteide安装
    安装liteide方法
     $ git clone https://github.com/visualfc/liteide.git
     $ sudo apt-get update
     $ sudo apt-get install qt4-dev-tools libqt4-dev libqtcore4 libqtgui4 libqtwebkit-dev g++
     $ cd liteide/build
     $ ./update_pkg.sh
     $ QTDIR=/usr ./build_linux.sh

     ## Run it: ##
     $ cd ~/liteide/build/liteide/bin
     $ ./liteide

     安装完成。

2. 演示

    例1:


package main

import (   
    "fmt"
    "github.com/Nik-U/pbc"
)

func main() {
 // In a real application, generate this once and publish it
 params := pbc.GenerateA(160, 512)

 pairing := params.NewPairing()

 // Initialize group elements. pbc automatically handles garbage collection.
 g := pairing.NewG1()
 h := pairing.NewG2()
 x := pairing.NewGT()

 // Generate random group elements and pair them
 g.Rand()
 h.Rand()
 fmt.Printf("g = %s\n", g)
 fmt.Printf("h = %s\n", h)
 x.Pair(g, h)
 fmt.Printf("e(g,h) = %s\n", x)
}

输出结果


例2:

// This example computes and verifies a Boneh-Lynn-Shacham signature
// in a simulated conversation between Alice and Bob.

package main

import (
    "crypto/sha256"
    "fmt"

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

// messageData represents a signed message sent over the network
type messageData struct {
    message   string
    signature []byte
}

// This example computes and verifies a Boneh-Lynn-Shacham signature in a
// simulated conversation between Alice and Bob.
func main() {
    // The authority generates system parameters
 // In a real application, generate this once and publish it
    params := pbc.GenerateA(160, 512)
 fmt.Println(params)
 
    pairing := params.NewPairing()// instantiates a  pairing
 

    g := pairing.NewG2().Rand()

   // The authority distributes params and g to Alice and Bob
    sharedParams := params.String()

   sharedG := g.Bytes()
   // Channel for messages. Normally this would be a network connection.
    messageChannel := make(chan *messageData)

    // Channel for public key distribution. This might be a secure out-of-band
    // channel or something like a web of trust. The public key only needs to
    // be transmitted and verified once. The best way to do this is beyond the
    // scope of this example.
    keyChannel := make(chan []byte)

    // Channel to wait until both simulations are done
    finished := make(chan bool)

    // Simulate the conversation participants
    go alice(sharedParams, sharedG, messageChannel, keyChannel, finished)
    go bob(sharedParams, sharedG, messageChannel, keyChannel, finished)

    // Wait for the communication to finish
    <-finished
    <-finished

}

// Alice generates a keypair and signs a message
func alice(sharedParams string, sharedG []byte, messageChannel chan *messageData, keyChannel chan []byte, finished chan bool) {
    // Alice loads the system parameters
    pairing, _ := pbc.NewPairingFromString(sharedParams) // loads pairing parameters from a string and instantiates a pairing
    g := pairing.NewG2().SetBytes(sharedG)

    // Generate keypair (x, g^x)
    privKey := pairing.NewZr().Rand()
    pubKey := pairing.NewG2().PowZn(g, privKey)

    // Send public key to Bob
    keyChannel <- pubKey.Bytes()

    // Some time later, sign a message, hashed to h, as h^x
    message := "some text to sign"
    h := pairing.NewG1().SetFromStringHash(message, sha256.New())
    signature := pairing.NewG2().PowZn(h, privKey)

    // Send the message and signature to Bob
    messageChannel <- &messageData{message: message, signature: signature.Bytes()}

    finished <- true
}

// Bob verifies a message received from Alice
func bob(sharedParams string, sharedG []byte, messageChannel chan *messageData, keyChannel chan []byte, finished chan bool) {
    // Bob loads the system parameters
    pairing, _ := pbc.NewPairingFromString(sharedParams)
    g := pairing.NewG2().SetBytes(sharedG)

    // Bob receives Alice's public key (and presumably verifies it manually)
    pubKey := pairing.NewG2().SetBytes(<-keyChannel)

    // Some time later, Bob receives a message to verify
    data := <-messageChannel
    signature := pairing.NewG1().SetBytes(data.signature)

    // To verify, Bob checks that e(h,g^x)=e(sig,g)
    h := pairing.NewG1().SetFromStringHash(data.message, sha256.New())
    temp1 := pairing.NewGT().Pair(h, pubKey)
    temp2 := pairing.NewGT().Pair(signature, g)
    if !temp1.Equals(temp2) {
        fmt.Println("*BUG* Signature check failed *BUG*")
    } else {
        fmt.Println("Signature verified correctly")
    }
    finished <- true
}




这篇关于在golang中使用PBC密码库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/312089

相关文章

python使用库爬取m3u8文件的示例

《python使用库爬取m3u8文件的示例》本文主要介绍了python使用库爬取m3u8文件的示例,可以使用requests、m3u8、ffmpeg等库,实现获取、解析、下载视频片段并合并等步骤,具有... 目录一、准备工作二、获取m3u8文件内容三、解析m3u8文件四、下载视频片段五、合并视频片段六、错误

gitlab安装及邮箱配置和常用使用方式

《gitlab安装及邮箱配置和常用使用方式》:本文主要介绍gitlab安装及邮箱配置和常用使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装GitLab2.配置GitLab邮件服务3.GitLab的账号注册邮箱验证及其分组4.gitlab分支和标签的

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(