-
Notifications
You must be signed in to change notification settings - Fork 42
/
des.go
126 lines (107 loc) · 2.61 KB
/
des.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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package codec
import (
"crypto/cipher"
"crypto/des"
"fmt"
"github.com/pkg/errors"
)
func desEnc(key []byte, data []byte, iv []byte, mode func(cipher.Block, []byte) cipher.BlockMode) ([]byte, error) {
if iv == nil {
iv = make([]byte, 8)
} else {
if len(iv)%8 != 0 {
iv = ZeroPadding(iv, 8)
}
}
if len(key)%8 != 0 {
key = ZeroPadding(key, 8)
if len(key) > 8 {
key = key[:8]
}
}
block, err := des.NewCipher(key)
if err != nil {
return nil, errors.Errorf("create cipher failed: %s", err)
}
if len(data)%8 != 0 {
data = ZeroPadding(data, 8)
}
cbcMode := mode(block, iv)
result := make([]byte, len(data))
cbcMode.CryptBlocks(result, data)
return result, nil
}
func desDec(key []byte, data []byte, iv []byte, mode func(cipher.Block, []byte) cipher.BlockMode) ([]byte, error) {
if iv == nil {
iv = make([]byte, 8)
} else {
if len(iv)%8 != 0 {
iv = ZeroPadding(iv, 8)
}
}
if len(key)%8 != 0 {
key = ZeroPadding(key, 8)
if len(key) > 8 {
key = key[:8]
}
}
block, err := des.NewCipher(key)
if err != nil {
return nil, errors.Errorf("create cipher failed: %s", err)
}
if len(data)%8 != 0 {
data = ZeroPadding(data, 8)
}
cbcMode := mode(block, iv)
result := make([]byte, len(data))
cbcMode.CryptBlocks(result, data)
return result, nil
}
func DESCBCEnc(key []byte, data []byte, iv []byte) ([]byte, error) {
return desEnc(key, data, iv, cipher.NewCBCEncrypter)
}
func DESCBCDec(key, data, iv []byte) ([]byte, error) {
return desDec(key, data, iv, cipher.NewCBCDecrypter)
}
func DESECBEnc(key []byte, data []byte) ([]byte, error) {
blockSize := 8
if len(key)%blockSize != 0 {
key = ZeroPadding(key, blockSize)
if len(key) > 8 {
key = key[:8]
}
}
block, err := des.NewCipher(key)
if err != nil {
return nil, fmt.Errorf("DES ECB Error: %s", err)
}
if len(data)%blockSize != 0 {
data = ZeroPadding(data, blockSize)
}
encrypted := make([]byte, len(data))
for bs, be := 0, blockSize; bs < len(data); bs, be = bs+blockSize, be+blockSize {
block.Encrypt(encrypted[bs:be], data[bs:be])
}
return encrypted, nil
}
func DESECBDec(key []byte, data []byte) ([]byte, error) {
blockSize := 8
if len(key)%blockSize != 0 {
key = ZeroPadding(key, blockSize)
if len(key) > 8 {
key = key[:8]
}
}
block, err := des.NewCipher(key)
if err != nil {
return nil, fmt.Errorf("DES ECB Error: %s", err)
}
if len(data)%blockSize != 0 {
data = ZeroPadding(data, blockSize)
}
decrypted := make([]byte, len(data))
for bs, be := 0, blockSize; bs < len(data); bs, be = bs+blockSize, be+blockSize {
block.Decrypt(decrypted[bs:be], data[bs:be])
}
return decrypted, nil
}