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