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