tkcashgame_v4/pkg/xcrypto/tkcrypto/tkaes.go

78 lines
1.7 KiB
Go

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:]
}