/
ecb.go
82 lines (72 loc) · 2.01 KB
/
ecb.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package aes
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"encoding/base64"
"strings"
"github.com/juju/errors"
)
func byteKey(key string) []byte {
for i := 16; i < 33; i += 8 {
key += strings.Repeat("\x00", i-len(key))
if len(key) == i {
break
}
}
return []byte(key)
}
// Encrypt aes 加密.
func Encrypt(encodeStr string, key string) (string, error) {
encodeBytes := []byte(encodeStr)
encodeKey := byteKey(key)
block, err := aes.NewCipher(encodeKey)
if err != nil {
return "", errors.Trace(err)
}
blockSize := block.BlockSize()
encodeBytes = pkcs5Padding(encodeBytes, blockSize)
blockMode := cipher.NewCBCEncrypter(block, encodeKey[:blockSize])
crypted := make([]byte, len(encodeBytes))
blockMode.CryptBlocks(crypted, encodeBytes)
return base64.RawURLEncoding.EncodeToString(crypted), nil
}
// Decrypt aes 解密.
func Decrypt(decodeStr string, key string) (string, error) {
decodeKey := byteKey(key)
decodeBytes, err := base64.RawURLEncoding.DecodeString(decodeStr)
if err != nil {
return "", errors.Trace(err)
}
block, err := aes.NewCipher(decodeKey)
if err != nil {
return "", errors.Trace(err)
}
blockSize := block.BlockSize()
blockMode := cipher.NewCBCDecrypter(block, decodeKey[:blockSize])
origData := make([]byte, len(decodeBytes))
blockMode.CryptBlocks(origData, decodeBytes)
origData, err = pkcs5UnPadding(origData)
if err != nil {
return "", errors.Trace(err)
}
return string(origData), nil
}
// pkcs5Padding pkcs5 添加数据.
func pkcs5Padding(ciphertext []byte, blockSize int) []byte {
padding := blockSize - len(ciphertext)%blockSize
padtext := bytes.Repeat([]byte{byte(padding)}, padding)
return append(ciphertext, padtext...)
}
// pkcs5UnPadding pkcs5 删除数据.
func pkcs5UnPadding(origData []byte) ([]byte, error) {
length := len(origData)
if length < 1 {
return nil, errors.New("origData is empty")
}
unpadding := int(origData[length-1])
if unpadding > length {
return nil, errors.New("invalid origData")
}
return origData[:(length - unpadding)], nil
}