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语言的一个小方面,也还未涉及到项目搭建那一步,未来也希望自己能腾出一些时间能在这方面多学习一点知识吧!!!

posted @ 2022-11-29 18:33  20201325my  阅读(224)  评论(1编辑  收藏  举报