70 lines
1.6 KiB
Go
70 lines
1.6 KiB
Go
package crypto
|
|
|
|
import (
|
|
"bytes"
|
|
"crypto/aes"
|
|
"crypto/cipher"
|
|
"encoding/base64"
|
|
)
|
|
|
|
var (
|
|
seckey = []byte("Q1A2Z3X!D^R$T&G*B(N)U088") //24Byte
|
|
base64Tables = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
|
|
iv = []byte{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}
|
|
)
|
|
|
|
func base64Decode(src string) ([]byte, error) {
|
|
coder := base64.NewEncoding(base64Tables)
|
|
return coder.DecodeString(src)
|
|
}
|
|
|
|
func aesPadding(src []byte, blockSize int) []byte {
|
|
padding := blockSize - len(src)%blockSize
|
|
padtext := bytes.Repeat([]byte{byte(padding)}, padding)
|
|
return append(src, padtext...)
|
|
}
|
|
|
|
func aesUnPadding(src []byte) []byte {
|
|
length := len(src)
|
|
unpadding := int(src[length-1])
|
|
return src[:(length - unpadding)]
|
|
}
|
|
func Encrypt(src string) (string, error) {
|
|
block, err := aes.NewCipher(seckey)
|
|
if err != nil {
|
|
return "", nil
|
|
}
|
|
|
|
arr := aesPadding([]byte(src), aes.BlockSize)
|
|
mode := cipher.NewCBCEncrypter(block, iv)
|
|
mode.CryptBlocks(arr, arr)
|
|
return string(arr), nil
|
|
}
|
|
func Decrypt(src string) (string, error) {
|
|
block, err := aes.NewCipher(seckey)
|
|
if err != nil {
|
|
return "", nil
|
|
}
|
|
arr := []byte(src)
|
|
mode := cipher.NewCBCDecrypter(block, iv)
|
|
mode.CryptBlocks(arr, arr)
|
|
arr = aesUnPadding(arr)
|
|
return string(arr), nil
|
|
|
|
}
|
|
|
|
func Base64AndDecrypt(src string) (string, error) {
|
|
block, err := aes.NewCipher(seckey)
|
|
if err != nil {
|
|
return "", nil
|
|
}
|
|
arr, err := base64Decode(src)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
mode := cipher.NewCBCDecrypter(block, iv)
|
|
mode.CryptBlocks(arr, arr)
|
|
arr = aesUnPadding(arr)
|
|
return string(arr), nil
|
|
}
|