github.com/Hyperledger-TWGC/tjfoc-gm@v1.4.0/API使用说明.md (about) 1 # 国密GM/T Go API使用说明 2 3 ## Go包安装 4 5 ```bash 6 go get -u github.com/Hyperledger-TWGC/tjfoc-gm 7 ``` 8 9 ## SM3密码杂凑算法 - SM3 cryptographic hash algorithm 10 - 遵循的SM3标准号为: GM/T 0004-2012 11 - g package:`github.com/Hyperledger-TWGC/tjfoc-gm/sm3` 12 - `type SM3 struct` 是原生接口hash.Hash的一个实现 13 14 ### 代码示例 15 16 ```Go 17 data := "test" 18 h := sm3.New() 19 h.Write([]byte(data)) 20 sum := h.Sum(nil) 21 fmt.Printf("digest value is: %x\n",sum) 22 ``` 23 24 ## SM4分组密码算法 - SM4 block cipher algorithm 25 26 - 遵循的SM4标准号为: GM/T 0002-2012 27 - go package:`github.com/Hyperledger-TWGC/tjfoc-gm/sm4` 28 29 ### 代码示例 30 31 ```Go 32 import "crypto/cipher" 33 import "github.com/Hyperledger-TWGC/tjfoc-gm/sm4" 34 35 func main(){ 36 // 128比特密钥 37 key := []byte("1234567890abcdef") 38 // 128比特iv 39 iv := make([]byte, sm4.BlockSize) 40 data := []byte("Tongji Fintech Research Institute") 41 ciphertxt,err := sm4Encrypt(key,iv, data) 42 if err != nil{ 43 log.Fatal(err) 44 } 45 fmt.Printf("加密结果: %x\n", ciphertxt) 46 } 47 48 func sm4Encrypt(key, iv, plainText []byte) ([]byte, error) { 49 block, err := sm4.NewCipher(key) 50 if err != nil { 51 return nil, err 52 } 53 blockSize := block.BlockSize() 54 origData := pkcs5Padding(plainText, blockSize) 55 blockMode := cipher.NewCBCEncrypter(block, iv) 56 cryted := make([]byte, len(origData)) 57 blockMode.CryptBlocks(cryted, origData) 58 return cryted, nil 59 } 60 61 func sm4Decrypt(key, iv, cipherText []byte) ([]byte, error) { 62 block, err := sm4.NewCipher(key) 63 if err != nil { 64 return nil, err 65 } 66 blockMode := cipher.NewCBCDecrypter(block, iv) 67 origData := make([]byte, len(cipherText)) 68 blockMode.CryptBlocks(origData, cipherText) 69 origData = pkcs5UnPadding(origData) 70 return origData, nil 71 } 72 // pkcs5填充 73 func pkcs5Padding(src []byte, blockSize int) []byte { 74 padding := blockSize - len(src)%blockSize 75 padtext := bytes.Repeat([]byte{byte(padding)}, padding) 76 return append(src, padtext...) 77 } 78 79 func pkcs5UnPadding(src []byte) []byte { 80 length := len(src) 81 if(length==0){ 82 return nil 83 } 84 unpadding := int(src[length-1]) 85 return src[:(length - unpadding)] 86 } 87 ``` 88 89 ### 方法列表 90 91 #### NewCipher 92 创建SM4密码分组算法模型,参数key长度只支持128比特。 93 ```Go 94 func NewCipher(key []byte) (cipher.Block, error) 95 ``` 96 97 ## SM2椭圆曲线公钥密码算法 - Public key cryptographic algorithm SM2 based on elliptic curves 98 99 - 遵循的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 100 - go package: `github.com/Hyperledger-TWGC/tjfoc-gm/sm2` 101 102 ### 代码示例 103 104 ```Go 105 priv, err := sm2.GenerateKey(rand.Reader) // 生成密钥对 106 if err != nil { 107 log.Fatal(err) 108 } 109 msg := []byte("Tongji Fintech Research Institute") 110 pub := &priv.PublicKey 111 ciphertxt, err := pub.Encrypt(msg,rand.Reader) 112 if err != nil { 113 log.Fatal(err) 114 } 115 fmt.Printf("加密结果:%x\n",ciphertxt) 116 plaintxt,err := priv.Decrypt(ciphertxt) 117 if err != nil { 118 log.Fatal(err) 119 } 120 if !bytes.Equal(msg,plaintxt){ 121 log.Fatal("原文不匹配") 122 } 123 124 sign,err := priv.Sign(rand.Reader, msg, nil) 125 if err != nil { 126 log.Fatal(err) 127 } 128 isok := pubKey.Verify(msg, sign) 129 fmt.Printf("Verified: %v\n", isok) 130 ``` 131 132 ### 方法列表 133 134 #### GenerateKey 135 生成随机秘钥。 136 ```Go 137 func GenerateKey(rand.Reader) (*PrivateKey, error) 138 ``` 139 140 #### Sign 141 用私钥签名数据,成功返回以两个大数表示的签名结果,否则返回错误。 142 ```Go 143 func SignSign(random io.Reader, msg []byte, signer crypto.SignerOpts) (signature[]byte, err error) 144 ``` 145 146 #### Verify 147 用公钥验证数据签名, 验证成功返回True,否则返回False。 148 ```Go 149 func Verify(pub *PublicKey, msg []byte, sign []byte)) bool 150 ``` 151 152 #### Encrypt 153 用公钥加密数据,成功返回密文错误,否则返回错误。 154 ```Go 155 func Encrypt(pub *PublicKey, data []byte, random io.Reader) ([]byte, error) 156 ``` 157 158 #### Decrypt 159 用私钥解密数据,成功返回原始明文数据,否则返回错误。 160 ```Go 161 func Decrypt(priv *PrivateKey, data []byte) ([]byte, error) 162 ```