80 lines
1.5 KiB
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,
|
|
}
|
|
}
|