在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
}



评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lhw---9999

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值