transx/tscipher/aes.go

80 lines
1.5 KiB
Go

package tscipher
import (
"crypto/aes"
"crypto/cipher"
crtrand "crypto/rand"
// "errors"
"io"
"log"
)
type AES struct {
key []byte
}
func (this *AES) aesEncrypt(key, text []byte) (ciphertext []byte) {
ciphertext = make([]byte, aes.BlockSize+len(string(text)))
// iv = initialization vector
iv := ciphertext[:aes.BlockSize]
io.ReadFull(crtrand.Reader, iv)
// var block cipher.Block
block, err := aes.NewCipher(key)
if err != nil {
ciphertext = nil
log.Println("encrypt err", err)
}
cfb := cipher.NewCFBEncrypter(block, iv)
cfb.XORKeyStream(ciphertext[aes.BlockSize:], text)
return
}
func (this *AES) aesDecrypt(key, ciphertext []byte) (plaintext []byte) {
// var block cipher.Block
// if len(ciphertext) < aes.BlockSize {
// err := errors.New("ciphertext too short")
// plaintext = nil
// log.Println("decrypt err", err)
// }
iv := ciphertext[:aes.BlockSize]
ciphertext = ciphertext[aes.BlockSize:]
block, err := aes.NewCipher(key)
if err != nil {
plaintext = nil
log.Println("decrypt err", err)
}
cfb := cipher.NewCFBDecrypter(block, iv)
cfb.XORKeyStream(ciphertext, ciphertext)
plaintext = ciphertext
return
}
func (this *AES) Decrypt(data []byte) (decrypted []byte, err error) {
data = this.aesDecrypt(this.key, data)
decrypted = data
err = nil
return
}
func (this *AES) Encrypt(data []byte) (encryped []byte, err error) {
this.aesEncrypt(this.key, data)
encryped = data
err = nil
return
}
func NewAES() (cipher Cipher) {
key := make([]byte, 32)
io.ReadFull(crtrand.Reader, key)
return &AES{
key: key,
}
}