121 lines
2.5 KiB
Go
121 lines
2.5 KiB
Go
|
package aes
|
||
|
|
||
|
import (
|
||
|
cryptoAes "crypto/aes"
|
||
|
"crypto/cipher"
|
||
|
"encoding/base64"
|
||
|
)
|
||
|
|
||
|
var _ Aes = (*aes)(nil)
|
||
|
|
||
|
type Aes interface {
|
||
|
i()
|
||
|
|
||
|
EncryptCBC(encryptStr string, urlEncode bool) (string, error)
|
||
|
DecryptCBC(decryptStr string, urlEncode bool) (string, error)
|
||
|
|
||
|
EncryptCFB(plain string, urlEncode bool) (string, error)
|
||
|
DecryptCFB(encrypted string, urlEncode bool) (string, error)
|
||
|
}
|
||
|
|
||
|
type aes struct {
|
||
|
key string
|
||
|
iv string
|
||
|
}
|
||
|
|
||
|
func New(key, iv string) Aes {
|
||
|
return &aes{
|
||
|
key: key,
|
||
|
iv: iv,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (a *aes) i() {}
|
||
|
|
||
|
func (a *aes) EncryptCBC(encryptStr string, urlEncode bool) (string, error) {
|
||
|
encoder := base64.StdEncoding
|
||
|
if urlEncode {
|
||
|
encoder = base64.URLEncoding
|
||
|
}
|
||
|
|
||
|
encryptBytes := []byte(encryptStr)
|
||
|
block, err := cryptoAes.NewCipher([]byte(a.key))
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
|
||
|
blockSize := block.BlockSize()
|
||
|
encryptBytes = pkcsPadding(encryptBytes, blockSize)
|
||
|
blockMode := cipher.NewCBCEncrypter(block, []byte(a.iv))
|
||
|
encrypted := make([]byte, len(encryptBytes))
|
||
|
blockMode.CryptBlocks(encrypted, encryptBytes)
|
||
|
|
||
|
return encoder.EncodeToString(encrypted), nil
|
||
|
}
|
||
|
|
||
|
func (a *aes) DecryptCBC(decryptStr string, urlEncode bool) (string, error) {
|
||
|
encoder := base64.StdEncoding
|
||
|
if urlEncode {
|
||
|
encoder = base64.URLEncoding
|
||
|
}
|
||
|
|
||
|
decryptBytes, err := encoder.DecodeString(decryptStr)
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
|
||
|
block, err := cryptoAes.NewCipher([]byte(a.key))
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
|
||
|
blockMode := cipher.NewCBCDecrypter(block, []byte(a.iv))
|
||
|
decrypted := make([]byte, len(decryptBytes))
|
||
|
blockMode.CryptBlocks(decrypted, decryptBytes)
|
||
|
decrypted = pkcsUnPadding(decrypted)
|
||
|
|
||
|
return string(decrypted), nil
|
||
|
}
|
||
|
|
||
|
func (a *aes) EncryptCFB(plain string, urlEncode bool) (string, error) {
|
||
|
encoder := base64.StdEncoding
|
||
|
if urlEncode {
|
||
|
encoder = base64.URLEncoding
|
||
|
}
|
||
|
|
||
|
block, err := cryptoAes.NewCipher([]byte(a.key))
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
|
||
|
encrypted := make([]byte, len(plain))
|
||
|
stream := cipher.NewCFBEncrypter(block, []byte(a.iv))
|
||
|
stream.XORKeyStream(encrypted, []byte(plain))
|
||
|
|
||
|
return encoder.EncodeToString(encrypted), nil
|
||
|
|
||
|
}
|
||
|
|
||
|
func (a *aes) DecryptCFB(encrypted string, urlEncode bool) (string, error) {
|
||
|
encoder := base64.StdEncoding
|
||
|
if urlEncode {
|
||
|
encoder = base64.URLEncoding
|
||
|
}
|
||
|
|
||
|
decryptBytes, err := encoder.DecodeString(encrypted)
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
|
||
|
block, err := cryptoAes.NewCipher([]byte(a.key))
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
|
||
|
plain := make([]byte, len(decryptBytes))
|
||
|
stream := cipher.NewCFBDecrypter(block, []byte(a.iv))
|
||
|
stream.XORKeyStream(plain, decryptBytes)
|
||
|
|
||
|
return string(plain), nil
|
||
|
}
|