...
1# 国密GM/T Go API使用说明
2
3## Go包安装
4
5```bash
6go get -u github.com/tjfoc/gmsm
7```
8## SM2椭圆曲线公钥密码算法 - Public key cryptographic algorithm SM2 based on elliptic curves
9
10- 遵循的SM2标准号为: GM/T 0003.1-2012、GM/T 0003.2-2012、GM/T 0003.3-2012、GM/T 0003.4-2012、GM/T 0003.5-2012、GM/T 0009-2012、GM/T 0010-2012
11- go package: `github.com/tjfoc/gmsm/sm2`
12
13### 代码示例
14
15```Go
16 priv, err := sm2.GenerateKey(rand.Reader) // 生成密钥对
17 if err != nil {
18 log.Fatal(err)
19 }
20 msg := []byte("Tongji Fintech Research Institute")
21 pub := &priv.PublicKey
22 ciphertxt, err := pub.EncryptAsn1(msg,rand.Reader) //sm2加密
23 if err != nil {
24 log.Fatal(err)
25 }
26 fmt.Printf("加密结果:%x\n",ciphertxt)
27 plaintxt,err := priv.DecryptAsn1(ciphertxt) //sm2解密
28 if err != nil {
29 log.Fatal(err)
30 }
31 if !bytes.Equal(msg,plaintxt){
32 log.Fatal("原文不匹配")
33 }
34
35 sign,err := priv.Sign(rand.Reader, msg, nil) //sm2签名
36 if err != nil {
37 log.Fatal(err)
38 }
39 isok := pub.Verify(msg, sign) //sm2验签
40 fmt.Printf("Verified: %v\n", isok)
41```
42## SM3密码杂凑算法 - SM3 cryptographic hash algorithm
43- 遵循的SM3标准号为: GM/T 0004-2012
44- g package:`github.com/tjfoc/gmsm/sm3`
45- `type SM3 struct` 是原生接口hash.Hash的一个实现
46
47### 代码示例
48
49```Go
50 data := "test"
51 h := sm3.New()
52 h.Write([]byte(data))
53 sum := h.Sum(nil)
54 fmt.Printf("digest value is: %x\n",sum)
55```
56
57## SM4分组密码算法 - SM4 block cipher algorithm
58
59- 遵循的SM4标准号为: GM/T 0002-2012
60- go package:`github.com/tjfoc/gmsm/sm4`
61
62### 代码示例
63
64```Go
65 import "crypto/cipher"
66 import "github.com/tjfoc/gmsm/sm4"
67 import "fmt"
68
69 func main(){
70 key := []byte("1234567890abcdef")
71 fmt.Printf("key = %v\n", key)
72 data := []byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10}
73 fmt.Printf("key = %v\n", key)
74 fmt.Printf("data = %x\n", data)
75 iv := []byte("0000000000000000")
76 err = SetIV(iv)//设置SM4算法实现的IV值,不设置则使用默认值
77 ecbMsg, err :=sm4.Sm4Ecb(key, data, true) //sm4Ecb模式pksc7填充加密
78 if err != nil {
79 t.Errorf("sm4 enc error:%s", err)
80 return
81 }
82 fmt.Printf("ecbMsg = %x\n", ecbMsg)
83 ecbDec, err := sm4.Sm4Ecb(key, ecbMsg, false) //sm4Ecb模式pksc7填充解密
84 if err != nil {
85 t.Errorf("sm4 dec error:%s", err)
86 return
87 }
88 fmt.Printf("ecbDec = %x\n", ecbDec)
89 }
90```
91
92
93
94
95
96### 具体功能测试代码参考
97```Go
98github.com/tjfoc/gmsm/sm2/sm2_test.go //sm2算法
99github.com/tjfoc/gmsm/sm3/sm3_test.go //sm3算法
100github.com/tjfoc/gmsm/sm4/sm4_test.go //sm4算法
101github.com/tjfoc/gmsm/x509/x509_test.go //x509国密证书
102github.com/tjfoc/gmsm/gmtls/gmcredentials/credentials_test.go //国密tls
103github.com/tjfoc/gmsm/gmtls/gmcredentials/websvr/websvr.go //国密tls与非国密TLS自适应
104```
View as plain text