-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbuilder.go
98 lines (86 loc) · 1.83 KB
/
builder.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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package encoder
import (
"errors"
"fmt"
)
// 支持的加解密方式
const (
MODE_BASE64 = "base64"
MODE_MD5 = "md5"
MODE_SHA1 = "sha1"
MODE_SHA256 = "sha256"
MODE_HMACSHA256 = "hmac-sha256"
MODE_AESCBC = "aes-cbc"
)
// Builder 构造加解密工具
type Builder struct {
typ string
salt string
key []byte
iv []byte
blockPadding int
}
// NewBuilder 生成构造器
func NewBuilder(typ string) *Builder {
return &Builder{
typ: typ,
key: make([]byte, 0),
iv: make([]byte, 0),
blockPadding: 32,
}
}
// Salt 加盐
func (b *Builder) Salt(salt string) *Builder {
b.salt = salt
return b
}
// Key 设置 key
func (b *Builder) Key(key []byte) *Builder {
b.key = key
return b
}
// IV 向量
func (b *Builder) IV(iv []byte) *Builder {
b.iv = iv
return b
}
// BlockPadding 块大小
func (b *Builder) BlockPadding(size int) *Builder {
b.blockPadding = size
return b
}
// Encrypt 加密
func (b *Builder) Encrypt(plaintext string) (string, error) {
text := []byte(plaintext)
switch b.typ {
case MODE_BASE64:
return Base64(text), nil
case MODE_MD5:
return MD5(text, b.salt), nil
case MODE_SHA1:
return SHA1(text), nil
case MODE_SHA256:
return SHA256(text), nil
case MODE_HMACSHA256:
return HmacSHA256(text, b.key), nil
case MODE_AESCBC:
result, err := AESCBCEncrypt(text, b.key, b.iv, b.blockPadding)
if err != nil {
return "", err
}
return fmt.Sprintf("%x", result), nil
default:
return "", errors.New("encrypt type not support")
}
}
// Decrypt 解密
func (b *Builder) Decrypt(ciphertext string) ([]byte, error) {
switch b.typ {
case MODE_BASE64:
return DeBase64(ciphertext)
case MODE_AESCBC:
return AESCBCDecrypt([]byte(ciphertext), b.key, b.iv)
default:
return nil, errors.New("decrypt type not support")
}
}