package spiderutil import ( "bytes" "crypto/aes" "crypto/cipher" ) //aes ecb加密 func AesECBEncrypt(data, key []byte) []byte { cipher, _ := aes.NewCipher(generateKey([]byte(key))) length := (len(data) + aes.BlockSize) / aes.BlockSize plain := make([]byte, length*aes.BlockSize) copy(plain, data) pad := byte(len(plain) - len(data)) for i := len(data); i < len(plain); i++ { plain[i] = pad } encrypted := make([]byte, len(plain)) // 分组分块加密 for bs, be := 0, cipher.BlockSize(); bs <= len(data); bs, be = bs+cipher.BlockSize(), be+cipher.BlockSize() { cipher.Encrypt(encrypted[bs:be], plain[bs:be]) } return encrypted } //aes ecb解密 func AesECBDecrypter(data, key []byte) []byte { cipher, _ := aes.NewCipher(generateKey(key)) decrypted := make([]byte, len(data)) for bs, be := 0, cipher.BlockSize(); bs < len(data); bs, be = bs+cipher.BlockSize(), be+cipher.BlockSize() { cipher.Decrypt(decrypted[bs:be], data[bs:be]) } trim := 0 if len(decrypted) > 0 { trim = len(decrypted) - int(decrypted[len(decrypted)-1]) } return decrypted[:trim] } //aes cbc加密 func AesCBCEncrypt(data, key, iv []byte) []byte { // 创建一个AES块,使用提供的密钥 block, _ := aes.NewCipher(key) // 使用CBC模式创建一个加密器 mode := cipher.NewCBCEncrypter(block, iv) // 对数据进行填充 padding := aes.BlockSize - len(data)%aes.BlockSize padtext := append(data, bytes.Repeat([]byte{byte(padding)}, padding)...) // 加密数据 encrypted := make([]byte, len(padtext)) mode.CryptBlocks(encrypted, padtext) return encrypted } //aes cbc解密 func AesCBCDecrypter(data, key, iv []byte) []byte { block, _ := aes.NewCipher(key) decrypter := cipher.NewCBCDecrypter(block, iv) // 解密数据 decrypted := make([]byte, len(data)) decrypter.CryptBlocks(decrypted, data) // 去除填充 unpadding := int(decrypted[len(decrypted)-1]) return decrypted[:len(decrypted)-unpadding] } func generateKey(key []byte) (genKey []byte) { genKey = make([]byte, 16) copy(genKey, key) for i := 16; i < len(key); { for j := 0; j < 16 && i < len(key); j, i = j+1, i+1 { genKey[j] ^= key[i] } } return genKey }