enhance(spiral):螺旋加密算法增加兼容旧式设计算法功能。

This commit is contained in:
徐涛 2023-07-18 16:07:35 +08:00
parent 1f99378655
commit 811e056bb8

View File

@ -13,6 +13,13 @@ import (
"archgrid.xyz/ag/toolsbox/serialize/base64" "archgrid.xyz/ag/toolsbox/serialize/base64"
) )
type Strength int
const (
Compatible Strength = iota
Enhanced
)
// 根据给定的密钥字符串生成加解密使用的密钥。 // 根据给定的密钥字符串生成加解密使用的密钥。
func generateKey(key string) []byte { func generateKey(key string) []byte {
keyBytes := sha512.Sha512([]byte(key)) keyBytes := sha512.Sha512([]byte(key))
@ -20,10 +27,16 @@ func generateKey(key string) []byte {
} }
// 对给定的数据进行加密。 // 对给定的数据进行加密。
func Encrypt(data string) (string, error) { func Encrypt(data string, strength ...Strength) (string, error) {
var ivGen aes.IVGenerator
if append(strength, Compatible)[0] == Compatible {
ivGen = aes.PrefixIVGenerator
} else {
ivGen = aes.XorIVGenerator
}
key := verifyCode.RandStr(20) key := verifyCode.RandStr(20)
keyBytes := generateKey(key) keyBytes := generateKey(key)
cipherData, err := aes.Encrypt([]byte(data), keyBytes, encryption.PKCS7Padding) cipherData, err := aes.Encrypt([]byte(data), keyBytes, encryption.PKCS7Padding, ivGen)
if err != nil { if err != nil {
return "", fmt.Errorf("加密计算失败,%w", err) return "", fmt.Errorf("加密计算失败,%w", err)
} }
@ -35,7 +48,13 @@ func Encrypt(data string) (string, error) {
} }
// 对给定的数据进行解密。 // 对给定的数据进行解密。
func Decrypt(data string) (string, error) { func Decrypt(data string, strength ...Strength) (string, error) {
var ivGen aes.IVGenerator
if append(strength, Compatible)[0] == Compatible {
ivGen = aes.PrefixIVGenerator
} else {
ivGen = aes.XorIVGenerator
}
if message, found := strings.CutPrefix(data, "["); found { if message, found := strings.CutPrefix(data, "["); found {
if len(message) > 20 { if len(message) > 20 {
keySeed := message[:20] keySeed := message[:20]
@ -44,7 +63,7 @@ func Decrypt(data string) (string, error) {
if err != nil { if err != nil {
return "", fmt.Errorf("密文损坏无法解析,%w", err) return "", fmt.Errorf("密文损坏无法解析,%w", err)
} }
plainText, err := aes.Decrypt(cipherData, key, encryption.PKCS7Padding) plainText, err := aes.Decrypt(cipherData, key, encryption.PKCS7Padding, ivGen)
if err != nil { if err != nil {
return "", fmt.Errorf("密文解密计算失败,%w", err) return "", fmt.Errorf("密文解密计算失败,%w", err)
} }