package encrypt import ( "bytes" "crypto/aes" "crypto/cipher" ) type AES256CFBMethod struct { block cipher.Block iv []byte } func (m *AES256CFBMethod) Init(key, iv []byte) error { keyLen := len(key) if keyLen > 32 { key = key[:32] } else if keyLen < 32 { key = append(key, bytes.Repeat([]byte{' '}, 32-keyLen)...) } block, err := aes.NewCipher(key) if err != nil { return err } m.block = block ivLen := len(iv) if ivLen > aes.BlockSize { iv = iv[:aes.BlockSize] } else if ivLen < aes.BlockSize { iv = append(iv, bytes.Repeat([]byte{' '}, aes.BlockSize-ivLen)...) } m.iv = iv return nil } func (m *AES256CFBMethod) Encrypt(src []byte) (dst []byte, err error) { if len(src) == 0 { return } defer func() { err = RecoverMethodPanic(recover()) }() dst = make([]byte, len(src)) cipher.NewCFBEncrypter(m.block, m.iv).XORKeyStream(dst, src) return } func (m *AES256CFBMethod) Decrypt(dst []byte) (src []byte, err error) { if len(dst) == 0 { return } defer func() { err = RecoverMethodPanic(recover()) }() src = make([]byte, len(dst)) cipher.NewCFBDecrypter(m.block, m.iv).XORKeyStream(src, dst) return }