package aes import ( "crypto/aes" "crypto/cipher" "errors" ) // AES-ECB 加密数据 func ECBEncrypt(originData, key []byte) ([]byte, error) { return ecbEncrypt(originData, key) } // AES-ECB 解密数据 func ECBDecrypt(secretData, key []byte) ([]byte, error) { return ecbDecrypt(secretData, key) } func ecbEncrypt(originData, key []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } originData = PKCS7Padding(originData, block.BlockSize()) secretData := make([]byte, len(originData)) blockMode := newECBEncrypter(block) blockMode.CryptBlocks(secretData, originData) return secretData, nil } func ecbDecrypt(secretData, key []byte) (originByte []byte, err error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } blockMode := newECBDecrypter(block) originByte = make([]byte, len(secretData)) blockMode.CryptBlocks(originByte, secretData) if len(originByte) == 0 { return nil, errors.New("blockMode.CryptBlocks error") } return PKCS7UnPadding(originByte), nil } // =========== type ecb struct { b cipher.Block blockSize int } func newECB(b cipher.Block) *ecb { return &ecb{ b: b, blockSize: b.BlockSize(), } } type ecbEncrypter ecb // newECBEncrypter returns a BlockMode which encrypts in electronic code book // mode, using the given Block. func newECBEncrypter(b cipher.Block) cipher.BlockMode { return (*ecbEncrypter)(newECB(b)) } func (x *ecbEncrypter) BlockSize() int { return x.blockSize } func (x *ecbEncrypter) CryptBlocks(dst, src []byte) { if len(src)%x.blockSize != 0 { panic("crypto/cipher: input not full blocks") } if len(dst) < len(src) { panic("crypto/cipher: output smaller than input") } for len(src) > 0 { x.b.Encrypt(dst, src[:x.blockSize]) src = src[x.blockSize:] dst = dst[x.blockSize:] } } type ecbDecrypter ecb // newECBDecrypter returns a BlockMode which decrypts in electronic code book // mode, using the given Block. func newECBDecrypter(b cipher.Block) cipher.BlockMode { return (*ecbDecrypter)(newECB(b)) } func (x *ecbDecrypter) BlockSize() int { return x.blockSize } func (x *ecbDecrypter) CryptBlocks(dst, src []byte) { if len(src)%x.blockSize != 0 { panic("crypto/cipher: input not full blocks") } if len(dst) < len(src) { panic("crypto/cipher: output smaller than input") } for len(src) > 0 { x.b.Decrypt(dst, src[:x.blockSize]) src = src[x.blockSize:] dst = dst[x.blockSize:] } }