forked from sunmi-OS/gocore
-
Notifications
You must be signed in to change notification settings - Fork 0
/
des.go
154 lines (133 loc) · 3.79 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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
package des
import (
"bytes"
"crypto/cipher"
"crypto/des"
)
func DesEncrypt(msg string, key string, iv string) (string, error) {
origData := []byte(msg)
block, err := des.NewCipher([]byte(key))
if err != nil {
return "", err
}
origData = PKCS5Padding(origData, block.BlockSize())
// origData = ZeroPadding(origData, block.BlockSize())
blockMode := cipher.NewCBCEncrypter(block, []byte(iv))
crypted := make([]byte, len(origData))
// 根据CryptBlocks方法的说明,如下方式初始化crypted也可以
// crypted := origData
blockMode.CryptBlocks(crypted, origData)
return string(crypted), nil
}
func DesDecrypt(msg string, key string, iv string) (string, error) {
crypted := []byte(msg)
block, err := des.NewCipher([]byte(key))
if err != nil {
return "", err
}
blockMode := cipher.NewCBCDecrypter(block, []byte(iv))
origData := make([]byte, len(crypted))
// origData := crypted
blockMode.CryptBlocks(origData, crypted)
origData = PKCS5UnPadding(origData)
// origData = ZeroUnPadding(origData)
return string(origData), nil
}
/*
DES/ECB/PKCS5Padding 加密
*/
func DesEncryptECB(msg string, key string) (string, error) {
origData := []byte(msg)
block, err := des.NewCipher([]byte(key))
if err != nil {
return "", err
}
bs := block.BlockSize()
origData = PKCS5Padding(origData, bs)
if len(origData)%bs != 0 {
return "", err
}
crypted := make([]byte, len(origData))
dst := crypted
for len(origData) > 0 {
block.Encrypt(dst, origData[:bs])
origData = origData[bs:]
dst = dst[bs:]
}
return string(crypted), nil
}
/*
DES/ECB/PKCS5Padding 解密
*/
func DesDecryptECB(msg string, key string) (string, error) {
crypted := []byte(msg)
block, err := des.NewCipher([]byte(key))
if err != nil {
return "", err
}
bs := block.BlockSize()
if len(crypted)%bs != 0 {
return "", err
}
origData := make([]byte, len(crypted))
dst := origData
for len(crypted) > 0 {
block.Decrypt(dst, crypted[:bs])
crypted = crypted[bs:]
dst = dst[bs:]
}
origData = PKCS5UnPadding(origData)
return string(origData), nil
}
func ZeroPadding(ciphertext []byte, blockSize int) []byte {
padding := blockSize - len(ciphertext)%blockSize
padtext := bytes.Repeat([]byte{0}, padding)
return append(ciphertext, padtext...)
}
func ZeroUnPadding(origData []byte) []byte {
return bytes.TrimRightFunc(origData, func(r rune) bool {
return r == rune(0)
})
}
// 3DES加密
func TripleDesEncrypt(msg string, key string, iv string) (string, error) {
origData := []byte(msg)
block, err := des.NewTripleDESCipher([]byte(key))
if err != nil {
return "", err
}
origData = PKCS5Padding(origData, block.BlockSize())
// origData = ZeroPadding(origData, block.BlockSize())
//blockMode := cipher.NewCBCEncrypter(block, key[:8])
blockMode := cipher.NewCBCEncrypter(block, []byte(iv))
crypted := make([]byte, len(origData))
blockMode.CryptBlocks(crypted, origData)
return string(crypted), nil
}
// 3DES解密
func TripleDesDecrypt(msg string, key string, iv string) (string, error) {
crypted := []byte(msg)
block, err := des.NewTripleDESCipher([]byte(key))
if err != nil {
return "", err
}
//blockMode := cipher.NewCBCDecrypter(block, key[:8])
blockMode := cipher.NewCBCDecrypter(block, []byte(iv))
origData := make([]byte, len(crypted))
// origData := crypted
blockMode.CryptBlocks(origData, crypted)
origData = PKCS5UnPadding(origData)
// origData = ZeroUnPadding(origData)
return string(origData), nil
}
func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
padding := blockSize - len(ciphertext)%blockSize
padtext := bytes.Repeat([]byte{byte(padding)}, padding)
return append(ciphertext, padtext...)
}
func PKCS5UnPadding(origData []byte) []byte {
length := len(origData)
// 去掉最后一个字节 unpadding 次
unpadding := int(origData[length-1])
return origData[:(length - unpadding)]
}