首页 > 其他分享 >go环境搭建及tjfoc-gm安装

go环境搭建及tjfoc-gm安装

时间:2022-11-29 18:46:14浏览次数:57  
标签:err nil tjfoc go gm byte

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

标签:err,nil,tjfoc,go,gm,byte
From: https://www.cnblogs.com/1314xhuan/p/16935122.html

相关文章

  • DRF-Django Rest frameWork脉络笔记
    1.Web应用模式在开发Web应用中,有两种应用模式:前后端不分离前后端分离2.api接口为了在团队内部形成共识、防止个人习惯差异引起的混乱,我们需要找到一种大家都觉得很好的接......
  • Python后端开发(主Django)面试题
    最近两个后端同事离职了,帮忙面试了些后端开发的实习生,虽然有过一些后端经验,但我不是主要写后端的,复习了下Django也稍微准备了一些主要是Django相关的面试题,数据库相关部分额......
  • Node.js操作MongoDB根据日期Date查询数据
    背景MongoDB里,日期Date类型数据使用的是ISODate,是GMT(格林尼治标准时)时间,而我们处在东八区(比标准时间多8个小时),所以实际转换的时候程序里的时间应该是GMT+8,转换到MongoDB......
  • Django-6.第三方-笔记
    第三方本次课程中主要介绍一些常用的第三方Django模块,包括:富文本编辑器全文检索发送邮件celery布署当项目开发完成后,需要将代码放到服务器上,这个过程称为布署,服务器上需要有......
  • Django-6.1富文本编辑器-笔记
    富文本编辑器借助富文本编辑器,网站的编辑人员能够像使用offfice一样编写出漂亮的、所见即所得的页面。此处以tinymce为例,其它富文本编辑器的使用也是类似的。在虚拟环境中安......
  • Django-6.2全文检索-笔记
    全文检索全文检索不同于特定字段的模糊查询,使用全文检索的效率更高,并且能够对于中文进行分词处理。haystack:全文检索的框架,支持whoosh、solr、Xapian、Elasticsearc四种全文......
  • Django-6.3-笔记
    发送邮件Django中内置了邮件发送功能,被定义在django.core.mail模块中。发送邮件需要使用SMTP服务器,常用的免费服务器有:​​163​​​、​​126​​​、​​QQ​​,下面以163......
  • Go 语言基本数据类型
    packagemainimport( "fmt" "math" "strings" "unsafe")funcmain(){ /* Golang数据类型分为基本数据类型和复合数据类型 基本数据类型有:整形、浮点型、布......
  • Higress 实战:30 行代码写一个 Wasm Go插件
    作者:澄潭、如葑前言在11月15号的直播《Higress开源背后的发展历程和上手Demo演示》中,为大家演示了Higress的Wasm插件如何面向Ingress资源进行配置生效,本......
  • 一文带你快速入门 Go 语言微服务开发 - Dubbo Go 入门实践总结
    更多详细示例可直接访问Dubbo官网或搜索关注官方微信公众号:ApacheDubbo1.安装Go语言环境建议使用最新版go1.17goversion>=go1.15【Go语言官网下载地址】......