/
desUtils.go
150 lines (135 loc) · 4.23 KB
/
desUtils.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
package security
import (
"bytes"
"crypto/cipher"
"crypto/des"
"encoding/base64"
"mygolib/defs"
"mygolib/gerror"
)
var IV = []byte{0, 0, 0, 0, 0, 0, 0, 0}
//var IV = []byte("01234567")
func DesEncrypt(origData, key []byte) ([]byte, gerror.IError) {
block, err := des.NewCipher(key)
if err != nil {
return nil, gerror.New(10000, defs.TRN_SYS_ERROR, err, "des加密失败")
}
//origData = ZeroPadding(origData, block.BlockSize())
origData = PKCS5Padding(origData, block.BlockSize())
blockMode := cipher.NewCBCEncrypter(block, IV)
crypted := make([]byte, len(origData))
// 根据CryptBlocks方法的说明,如下方式初始化crypted也可以
// crypted := origData
blockMode.CryptBlocks(crypted, origData)
return crypted, nil
}
// 3DES加密
func TripleDesEncrypt(origData, key []byte) ([]byte, gerror.IError) {
block, err := des.NewTripleDESCipher(key)
if err != nil {
return nil, gerror.New(10010, defs.TRN_SYS_ERROR, err, "3des加密失败")
}
origData = ZeroPadding(origData, block.BlockSize())
blockMode := cipher.NewCBCEncrypter(block, IV)
crypted := make([]byte, len(origData))
blockMode.CryptBlocks(crypted, origData)
return crypted, nil
}
//
func DesDecrypt(crypted, key []byte) ([]byte, gerror.IError) {
block, err := des.NewCipher(key)
if err != nil {
return nil, gerror.New(10020, defs.TRN_SYS_ERROR, err, "des解密失败")
}
blockMode := cipher.NewCBCDecrypter(block, IV)
//origData := make([]byte, len(crypted))
origData := crypted
blockMode.CryptBlocks(origData, crypted)
//origData = PKCS5UnPadding(origData)
//origData = ZeroUnPadding(origData)
return origData, nil
}
// 3DES解密
func TripleDesDecrypt(crypted, key []byte) ([]byte, gerror.IError) {
block, err := des.NewTripleDESCipher(key)
if err != nil {
return nil, gerror.New(10030, defs.TRN_SYS_ERROR, err, "3des解密失败")
}
blockMode := cipher.NewCBCDecrypter(block, IV)
origData := make([]byte, len(crypted))
// origData := crypted
blockMode.CryptBlocks(origData, crypted)
origData = ZeroUnPadding(origData)
return origData, nil
}
// 2des加密
func DoubleDesEncrypt(origData, key []byte) ([]byte, gerror.IError) {
a1, err := DesEncrypt(origData, key[:8])
if err != nil {
return nil, gerror.New(10040, defs.TRN_SYS_ERROR, err, "2des加密失败")
}
a2, err := DesDecrypt(a1, key[8:])
if err != nil {
return nil, err
}
return DesEncrypt(a2, key[:8])
}
func DoubleCBCDesEncrypt(origData, key []byte) (ciphertext []byte, err gerror.IError) {
for i := 0; i <= len(origData)-8; i += 8 {
res, err := DoubleDesEncrypt(origData[i:i+8], key)
if err != nil {
return nil, gerror.New(10050, defs.TRN_SYS_ERROR, err, "2des解密失败")
}
ciphertext = append(ciphertext, res...)
}
return ciphertext, nil
}
func DoubleDesEncryptBase64(origData, key []byte) (string, gerror.IError) {
res, err := DoubleDesEncrypt(origData, key)
if err != nil {
return "", gerror.New(10060, defs.TRN_SYS_ERROR, err, "DoubleDesEncryptBase64 error[%s]", origData)
}
return base64.StdEncoding.EncodeToString(res), nil
}
// 2des解密
func DoubleDesDecrypt(crypted, key []byte) ([]byte, gerror.IError) {
a1, err := DesDecrypt(crypted, key[:8])
if err != nil {
return nil, err
}
a2, err := DesEncrypt(a1, key[8:])
if err != nil {
return nil, err
}
return DesDecrypt(a2, key[:8])
}
func DoubleCBCDesDecrypt(ciphertext, key []byte) (origData []byte, err gerror.IError) {
for i := 0; i <= len(ciphertext)-8; i += 8 {
res, err := DoubleDesDecrypt(ciphertext[i:i+8], key)
if err != nil {
return nil, err
}
origData = append(origData, res...)
}
return origData, nil
}
func DoubleCBCDesDecryptBase64(crypted string, key []byte) ([]byte, gerror.IError) {
cipher, err := base64.StdEncoding.DecodeString(crypted)
if err != nil {
return nil, gerror.New(10070, defs.TRN_SYS_ERROR, err, "base64.StdEncoding.DecodeString error[%s]", crypted)
}
return DoubleCBCDesDecrypt(cipher, key)
}
func ZeroPadding(ciphertext []byte, blockSize int) []byte {
if len(ciphertext)%blockSize == 0 {
return ciphertext
}
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)
})
}