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