package tkcrypto import ( "crypto/aes" "crypto/md5" "encoding/hex" "errors" "strings" ) // key字节长度16 type Aes struct { key []byte } // NewAes func NewAes(key string) *Aes { return &Aes{key: generateKey(key)} } func (a Aes) EncryptECB(src string) string { origData := []byte(src) cipher, _ := aes.NewCipher(a.key) length := (len(origData) + aes.BlockSize) / aes.BlockSize plain := make([]byte, length*aes.BlockSize) copy(plain, origData) pad := byte(len(plain) - len(origData)) for i := len(origData); i < len(plain); i++ { plain[i] = pad } encrypted := make([]byte, len(plain)) for bs, be := 0, cipher.BlockSize(); bs <= len(origData); bs, be = bs+cipher.BlockSize(), be+cipher.BlockSize() { cipher.Encrypt(encrypted[bs:be], plain[bs:be]) } return hex.EncodeToString(encrypted) } func (a Aes) DecryptECB(src string) (string, error) { encrypted, err := hex.DecodeString(src) if err != nil { return "", err } cipher, _ := aes.NewCipher(a.key) decrypted := make([]byte, len(encrypted)) for bs, be := 0, cipher.BlockSize(); bs < len(encrypted); bs, be = bs+cipher.BlockSize(), be+cipher.BlockSize() { cipher.Decrypt(decrypted[bs:be], encrypted[bs:be]) } trim := 0 if len(decrypted) > 0 { trim = len(decrypted) - int(decrypted[len(decrypted)-1]) } if trim < 0 { return "", errors.New("decrypt error") } return string(decrypted[:trim]), nil } func generateKey(key string) (genKey []byte) { hash := md5.New() hash.Write([]byte(key)) md5Hash := hex.EncodeToString(hash.Sum(nil)) fileName := strings.ToUpper(md5Hash) //需要兼容Nodejs return generateMd5Key(fileName) } func generateMd5Key(str string) []byte { checksum := md5.Sum([]byte(str)) return checksum[0:] }