1. 程式人生 > 其它 >go環境搭建及tjfoc-gm安裝

go環境搭建及tjfoc-gm安裝

go包安裝

下載go安裝包

我預安裝的為64位linux安裝包

隨後進入/usr/local資料夾cd /usr/local

使用以下指令進行下載go安裝包

wget https://dl.google.com/go/go1.19.3.linux-amd64.tar.gz

配置環境變數

vim /etc/profile,開啟profile進行配置環境變數,在檔案末尾加上如下路徑

export GOROOT=/usr/local/go
export GOPATH=$HOME/workspace/go
export PATH=$PATH:${GOPATH//://bin:}/bin

隨後使用source /etc/profile使環境變數生效

這時候就可以使用go env檢驗是否配置成功啦

成功案例如下:

tjfoc-gm實現國密演算法

實現過程

在GOPATH中建立專案資料夾

我設定的專案資料夾就叫tjfoc-gm

在資料夾下建立一個go程式檔案

程式碼如下

package main

import (
	"bytes"
	"crypto/cipher"
	"crypto/rand"
	"fmt"
	"log"

	"github.com/Hyperledger-TWGC/tjfoc-gm/sm2"
	"github.com/Hyperledger-TWGC/tjfoc-gm/sm3"
	"github.com/Hyperledger-TWGC/tjfoc-gm/sm4"
)

func main() {
	SM2()

	SM3()

	SM4()
}

func SM2() {
	priv, err := sm2.GenerateKey(rand.Reader) // 生成金鑰對
	if err != nil {
		log.Fatal(err)
	}
	msg := []byte("20201325xjr")
	pub := &priv.PublicKey
	ciphertxt, err := sm2.Encrypt(pub, msg, rand.Reader)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("SM2加密密文是:", string(msg))
	fmt.Printf("SM2加密結果是:%x\n", ciphertxt)
	
	plaintxt, err := priv.Decrypt(nil, ciphertxt, nil)
	if err != nil {
		log.Fatal(err)
	}
	if !bytes.Equal(msg, plaintxt) {
		log.Fatal("原文不匹配")
	}

	sign, err := priv.Sign(rand.Reader, msg, nil)
	if err != nil {
		log.Fatal(err)
	}

	isok := priv.PublicKey.Verify(msg, sign)
	fmt.Printf("SM2 Verified: %v\n", isok)
}

func SM3() {
	data := "test"
	h := sm3.New()
	h.Write([]byte(data))
	sum := h.Sum(nil)
	fmt.Printf("SM3 digest value is: %x\n", sum)
}

func SM4() {
	// 128位元金鑰
	key := []byte("1234567890abcdef")
	// 128位元iv
	iv := make([]byte, sm4.BlockSize)
	data := []byte("20201325xjr")
	fmt.Println("SM4加密密文是:", string(data))
	ciphertxt, err := sm4Encrypt(key, iv, data)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("SM4加密結果: %x\n", ciphertxt)

	res, err := sm4Decrypt(key, iv, ciphertxt)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("SM4解密結果: %x\n", res)
	fmt.Println("SM4解密密文是:", string(res))
}

func sm4Encrypt(key, iv, plainText []byte) ([]byte, error) {
	block, err := sm4.NewCipher(key)
	if err != nil {
		return nil, err
	}
	blockSize := block.BlockSize()
	origData := pkcs5Padding(plainText, blockSize)
	blockMode := cipher.NewCBCEncrypter(block, iv)
	cryted := make([]byte, len(origData))
	blockMode.CryptBlocks(cryted, origData)
	return cryted, nil
}

func sm4Decrypt(key, iv, cipherText []byte) ([]byte, error) {
	block, err := sm4.NewCipher(key)
	if err != nil {
		return nil, err
	}
	blockMode := cipher.NewCBCDecrypter(block, iv)
	origData := make([]byte, len(cipherText))
	blockMode.CryptBlocks(origData, cipherText)
	origData = pkcs5UnPadding(origData)
	return origData, nil
}

// pkcs5填充
func pkcs5Padding(src []byte, blockSize int) []byte {
	padding := blockSize - len(src)%blockSize
	padtext := bytes.Repeat([]byte{byte(padding)}, padding)
	return append(src, padtext...)
}

func pkcs5UnPadding(src []byte) []byte {
	length := len(src)
	if length == 0 {
		return nil
	}
	unpadding := int(src[length-1])
	return src[:(length - unpadding)]
}

隨後執行go mod init tjfoc-gm

按照正常情況它會生成一個go.mod檔案和go.sum檔案但是我的就只有一個go.mod檔案

但是如果我們細看程式返回的資訊

就會發現程式說要新增sum檔案需要執行go mod tidy

但是這時候遇到了報錯

報錯資訊:
github.com/Hyperledger-TWGC/tjfoc-gm/sm2: module github.com/Hyperledger-TWGC/tjfoc-gm/sm2: Get "https://proxy.golang.org/github.com/!hyperledger-!t!w!g!c/tjfoc-gm/sm2/@v/list

": dial tcp 172.217.160.113:443: connect: connection refused
test imports
github.com/Hyperledger-TWGC/tjfoc-gm/sm3: module github.com/Hyperledger-TWGC/tjfoc-gm/sm3: Get "https://proxy.golang.org/github.com/!hyperledger-!t!w!g!c/tjfoc-gm/sm3/@v/list": dial tcp 172.217.160.113:443: connect: connection refused
test imports
github.com/Hyperledger-TWGC/tjfoc-gm/sm4: module github.com/Hyperledger-TWGC/tjfoc-gm/sm4: Get "https://proxy.golang.org/github.com/!hyperledger-!t!w!g!c/tjfoc-gm/sm4/@v/list": dial tcp 172.217.160.113:443: connect: connection refused

可以看出這時候github網址拒絕了我們的連線,於是我在網上找了一些資料,說是可以使用以下命令進行代理連線

go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.io,direct

這時候就可以直接生成sum檔案咯!!

然後使用go get自動執行嘗試在Github上下載所需要的庫

最後使用go run main.go即可執行檔案啦

所遇問題及解決辦法

由於這個演算法庫我不是第一個配置的所以過程相對來說還是比較容易,通過小組成員的部落格學習也知道了go語言的一些專案架構及執行編譯過程,但是自己也遇到了小組成員未遇到過的問題就比如sum檔案生成和github連線不上這兩個問題,具體原因也沒有找出來是為什麼,一開始發現跟著他們的部落格走得很順利,後面突然報錯讓我有點難以置信,但好在自己也靜下心來認真看了程式返回的錯誤,然後上網去查找了相關資料進行解決。

反思

這個演算法庫的困難性主要在於對go語言的陌生,但在瞭解下來之後其實他可以類比java程式,(go的src資料夾裝源程式,java的src裝包,類)這個庫只是go語言的一個小方面,也還未涉及到專案搭建那一步,未來也希望自己能騰出一些時間能在這方面多學習一點知識吧!!!