aes.go raw

   1  package base
   2  
   3  import (
   4  	"bytes"
   5  	"crypto/aes"
   6  	"crypto/cipher"
   7  	"encoding/base64"
   8  	"errors"
   9  	"fmt"
  10  )
  11  
  12  // AES CBC
  13  func aesEncryptCBC(origData, key []byte) (crypted []byte, err error) {
  14  	defer func() {
  15  		if r := recover(); r != nil {
  16  			crypted = nil
  17  			err = errors.New(fmt.Sprintf("%v", r))
  18  		}
  19  	}()
  20  	block, err := aes.NewCipher(key)
  21  	if err != nil {
  22  		return
  23  	}
  24  
  25  	blockSize := block.BlockSize()
  26  	origData = zeroPadding(origData, blockSize)
  27  	blockMode := cipher.NewCBCEncrypter(block, key[:blockSize])
  28  	crypted = make([]byte, len(origData))
  29  	blockMode.CryptBlocks(crypted, origData)
  30  	return
  31  }
  32  
  33  // AES CBC Do a Base64 encryption after encryption
  34  func aesEncryptCBCWithBase64(origData, key []byte) (string, error) {
  35  	cbc, err := aesEncryptCBC(origData, key)
  36  	if err != nil {
  37  		return "", err
  38  	}
  39  
  40  	return base64.StdEncoding.EncodeToString(cbc), nil
  41  }
  42  
  43  func zeroPadding(ciphertext []byte, blockSize int) []byte {
  44  	padding := blockSize - len(ciphertext)%blockSize
  45  	if padding == 0 {
  46  		return ciphertext
  47  	}
  48  
  49  	padtext := bytes.Repeat([]byte{byte(0)}, padding)
  50  	return append(ciphertext, padtext...)
  51  }
  52