65 lines
1.1 KiB
Go
65 lines
1.1 KiB
Go
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
|
|
}
|