-
Notifications
You must be signed in to change notification settings - Fork 0
/
crypt_opt.go
101 lines (89 loc) · 2.29 KB
/
crypt_opt.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
99
100
101
package crypt
import (
"bytes"
)
// WithIV 偏移, 注意 ECB/OFB 模式不需要IV
func WithIV(iv []byte) CryptOption {
return func(c *crypt) {
c.iv = iv
}
}
// WithAlgorithmName 使用的加密算法, 支持 SM4/AES/RSA/DSA
func WithAlgorithmName(name algorithmName) CryptOption {
return func(c *crypt) {
c.algorithmName = name
}
}
// WithAlgorithmMode 使用算法模式, 支持 CBC
func WithAlgorithmMode(mode algorithmMode) CryptOption {
return func(c *crypt) {
c.algorithmMode = mode
}
}
// WithPKCS7Padding 使用 pkcs7 填充, 注意: pkcs5 和 pkcs7 算法是一致的
// PKCS#5只是对于8字节(BlockSize=8)进行填充,填充内容为0x01-0x08
// PKCS#7不仅仅是对8字节填充,其BlockSize范围是1-255字节
func WithPKCS7Padding(blockSize int) CryptOption {
return func(c *crypt) {
c.padding = func(src []byte) []byte {
padding := blockSize - len(src)%blockSize
padText := bytes.Repeat([]byte{byte(padding)}, padding)
return append(src, padText...)
}
}
}
// WithPKCS7UnPadding 取消填充
func WithPKCS7UnPadding() CryptOption {
return func(c *crypt) {
c.unPadding = func(src []byte) []byte {
length := len(src)
unPadding := int(src[length-1])
return src[:(length - unPadding)]
}
}
}
// WithZeroPadding 使用 0 填充
func WithZeroPadding(blockSize int) CryptOption {
return func(c *crypt) {
c.padding = func(src []byte) []byte {
padding := blockSize - len(src)%blockSize
padText := bytes.Repeat([]byte{0}, padding)
return append(src, padText...)
}
}
}
// WithZeroUnPadding 使用 0 取消填充
func WithZeroUnPadding() CryptOption {
return func(c *crypt) {
c.unPadding = func(src []byte) []byte {
length, index := len(src), 0
for i := length - 1; i >= 0; i-- {
if src[i] != 0 {
index = i
break
}
}
return src[:index+1]
}
}
}
// WithPadding 使用自定义 padding 算法
func WithPadding(fn func(src []byte) []byte) CryptOption {
return func(c *crypt) {
c.padding = fn
}
}
// WithUnPadding 使用自定义 unPadding 算法
func WithUnPadding(fn func(src []byte) []byte) CryptOption {
return func(c *crypt) {
c.unPadding = fn
}
}
// NonePadding 不填充
func NonePadding(src []byte) []byte {
return src
}
// NoneUnPadding 不取消填充
func NoneUnPadding(src []byte) []byte {
return src
}