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