// Package cryptox 提供 AES/DES 加解密工具(base64 输出), // 基于 gaes 与 gdes 构建。 // // 密钥:接受任意长度密钥,内部会归一化为精确密钥尺寸, // 调用方无需关心密钥长度。 package cryptox import ( "crypto/md5" "encoding/base64" "github.com/gogf/gf/v2/crypto/gaes" "github.com/gogf/gf/v2/crypto/gdes" "github.com/gogf/gf/v2/errors/gerror" ) const ( aesKeySize = 16 // AES-128 key size in bytes desKeySize = 8 // DES key size in bytes ) // normalizeKey 从任意长度密钥派生出固定尺寸密钥。 func normalizeKey(secret string, size int) []byte { key := []byte(secret) if len(key) == size { return key } sum := md5.Sum([]byte(secret)) out := make([]byte, size) for i := 0; i < size; i++ { out[i] = sum[i%len(sum)] } return out } // AesEncrypt 使用由 secret 派生的密钥对 plainText 做 AES-128-CBC 加密, // 返回 base64 编码的密文。 func AesEncrypt(plainText, secret string) (string, error) { out, err := gaes.Encrypt([]byte(plainText), normalizeKey(secret, aesKeySize)) if err != nil { return "", gerror.Wrap(err, `AesEncrypt failed`) } return base64.StdEncoding.EncodeToString(out), nil } // AesDecrypt 解密 AesEncrypt 产生的 base64 密文。 func AesDecrypt(cipherText, secret string) (string, error) { data, err := base64.StdEncoding.DecodeString(cipherText) if err != nil { return "", gerror.Wrap(err, `base64 decode failed`) } out, err := gaes.Decrypt(data, normalizeKey(secret, aesKeySize)) if err != nil { return "", gerror.Wrap(err, `AesDecrypt failed`) } return string(out), nil } // DesEncrypt 使用由 secret 派生的密钥对 plainText 做 DES-ECB(PKCS5 填充)加密, // 返回 base64 编码的密文。 func DesEncrypt(plainText, secret string) (string, error) { out, err := gdes.EncryptECB([]byte(plainText), normalizeKey(secret, desKeySize), gdes.PKCS5PADDING) if err != nil { return "", gerror.Wrap(err, `DesEncrypt failed`) } return base64.StdEncoding.EncodeToString(out), nil } // DesDecrypt 解密 DesEncrypt 产生的 base64 密文。 func DesDecrypt(cipherText, secret string) (string, error) { data, err := base64.StdEncoding.DecodeString(cipherText) if err != nil { return "", gerror.Wrap(err, `base64 decode failed`) } out, err := gdes.DecryptECB(data, normalizeKey(secret, desKeySize), gdes.PKCS5PADDING) if err != nil { return "", gerror.Wrap(err, `DesDecrypt failed`) } return string(out), nil }