package encrypt import ( "crypto/aes" "crypto/cipher" "crypto/md5" "encoding/base64" "encoding/hex" "math/rand" "strings" "time" ) var random *rand.Rand var interPwd = "24a1d6ff39d8" func init() { random = rand.New(rand.NewSource(time.Now().UnixNano())) } //func PKCS7UnPadding(origData []byte) []byte { // length := len(origData) // unpadding := int(origData[length-1]) // return origData[:(length - unpadding)] //} // //func PKCS7Padding(ciphertext []byte, blockSize int) []byte { // padding := blockSize - len(ciphertext)%blockSize // padtext := bytes.Repeat([]byte{byte(padding)}, padding) // return append(ciphertext, padtext...) //} func AesEncryptTS(origData, key []byte, iv []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } blockSize := block.BlockSize() origData = PKCS7Padding(origData, blockSize) blockMode := cipher.NewCBCEncrypter(block, iv[:blockSize]) crypted := make([]byte, len(origData)) blockMode.CryptBlocks(crypted, origData) return crypted, nil } //aes cbc pkcs7 func AesEncrypt(origData, key []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } blockSize := block.BlockSize() origData = PKCS7Padding(origData, blockSize) blockMode := cipher.NewCBCEncrypter(block, key[:blockSize]) crypted := make([]byte, len(origData)) blockMode.CryptBlocks(crypted, origData) return crypted, nil } func AesECBPKCS5Encrypt(origData, key []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } blockMode := NewECBEncrypter(block) origData = PKCS5Padding(origData, block.BlockSize()) crypted := make([]byte, len(origData)) blockMode.CryptBlocks(crypted, origData) return crypted, nil } func AesDecryptTS(crypted, key []byte, iv []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } blockSize := block.BlockSize() blockMode := cipher.NewCBCDecrypter(block, iv[:blockSize]) origData := make([]byte, len(crypted)) blockMode.CryptBlocks(origData, crypted) origData = PKCS7UnPadding(origData) return origData, nil } func AesDecryptPKCS5(crypted, key []byte, iv []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } //blockSize := block.BlockSize() blockMode := cipher.NewCBCDecrypter(block, iv) origData := make([]byte, len(crypted)) blockMode.CryptBlocks(origData, crypted) origData = PKCS5UnPadding(origData) return origData, nil } func AesDecrypt(crypted, key []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } blockSize := block.BlockSize() blockMode := cipher.NewCBCDecrypter(block, key[:blockSize]) origData := make([]byte, len(crypted)) blockMode.CryptBlocks(origData, crypted) origData = PKCS7UnPadding(origData) return origData, nil } func AesECBPKCS5Decrypt(crypted, key []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } //blockSize := block.BlockSize() blockMode := NewECBDecrypter(block) origData := make([]byte, len(crypted)) blockMode.CryptBlocks(origData, crypted) origData = PKCS5UnPadding(origData) return origData, nil } func RandSeq(n int) string { letters := []rune("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz") b := make([]rune, n) for i := range b { b[i] = letters[rand.Intn(len(letters))] } return string(b) } func EncryptKey(oriKey []byte) (string, error) { txtStream := base64.StdEncoding.EncodeToString(oriKey) return encData(txtStream, interPwd) } func EncryptKeySimple(oriKey []byte) (string, error) { oriKey = []byte(string(oriKey) + "123456") txtStream := base64.StdEncoding.EncodeToString(oriKey) return txtStream, nil } func encData(txtStream string, secretKey string) (string, error) { password := secretKey lockstream := "GHI9+JKLxyz012MNOPYbcRSTUVW8/ABCw3DEZaFXefghijklm7=nopqrsdQtuv456" //随机找一个数字,并从密锁串中找到一个密锁值 lockLen := len(lockstream) lockCount := random.Int31n(int32(lockLen)) randomLock := string([]rune(lockstream)[lockCount]) password = getMD5Hash(password + randomLock) txtStream = base64.StdEncoding.EncodeToString([]byte(txtStream)) tmpStream := "" j := 0 k := 0 for i := 0; i < len(txtStream); i++ { if k == len(password) { k = 0 } findChar := string([]rune(txtStream)[i]) j = (strings.Index(lockstream, findChar) + int(lockCount) + int(password[k])) % lockLen tmpStream += string([]rune(lockstream)[j]) k++ } return tmpStream + randomLock, nil } func getMD5Hash(text string) string { hash := md5.Sum([]byte(text)) return hex.EncodeToString(hash[:]) }