79 lines
1.6 KiB
Go
79 lines
1.6 KiB
Go
package cryptoutil
|
|
|
|
import (
|
|
"crypto/aes"
|
|
"crypto/cipher"
|
|
"encoding/base64"
|
|
)
|
|
|
|
const (
|
|
scAESKey = "m1xp9slgfa|su@m2"
|
|
scAESIV = "pa!st17m@04h5u#0"
|
|
)
|
|
|
|
// EncryptSC AES-CBC加密,使用固定的key和iv
|
|
func EncryptSC(plaintext string) string {
|
|
key := []byte(scAESKey)
|
|
iv := []byte(scAESIV)
|
|
|
|
block, err := aes.NewCipher(key)
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
|
|
// PKCS7填充
|
|
blockSize := block.BlockSize()
|
|
padding := blockSize - len(plaintext)%blockSize
|
|
padText := make([]byte, padding)
|
|
for i := range padText {
|
|
padText[i] = byte(padding)
|
|
}
|
|
plaintextBytes := append([]byte(plaintext), padText...)
|
|
|
|
// CBC加密
|
|
ciphertext := make([]byte, len(plaintextBytes))
|
|
mode := cipher.NewCBCEncrypter(block, iv)
|
|
mode.CryptBlocks(ciphertext, plaintextBytes)
|
|
|
|
// Base64编码
|
|
return base64.StdEncoding.EncodeToString(ciphertext)
|
|
}
|
|
|
|
// DecryptSC AES-CBC解密,使用固定的key和iv
|
|
func DecryptSC(ciphertext string) string {
|
|
key := []byte(scAESKey)
|
|
iv := []byte(scAESIV)
|
|
|
|
// Base64解码
|
|
ciphertextBytes, err := base64.StdEncoding.DecodeString(ciphertext)
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
|
|
block, err := aes.NewCipher(key)
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
|
|
// CBC解密
|
|
blockSize := block.BlockSize()
|
|
if len(ciphertextBytes)%blockSize != 0 {
|
|
return ""
|
|
}
|
|
|
|
plaintext := make([]byte, len(ciphertextBytes))
|
|
mode := cipher.NewCBCDecrypter(block, iv)
|
|
mode.CryptBlocks(plaintext, ciphertextBytes)
|
|
|
|
// 去除PKCS7填充
|
|
if len(plaintext) == 0 {
|
|
return ""
|
|
}
|
|
padding := int(plaintext[len(plaintext)-1])
|
|
if padding <= 0 || padding > blockSize || padding > len(plaintext) {
|
|
return ""
|
|
}
|
|
|
|
return string(plaintext[:len(plaintext)-padding])
|
|
}
|