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  ```