package tscipher import ( "net" ) type Cipher interface { Decrypt(data []byte) (decrypted []byte, err error) Encrypt(data []byte) (encryped []byte, err error) } type Carrier struct { Conn net.Conn Cipher Cipher Cache []byte } func NewCipher(cipherName string) (cipher Cipher) { if cipherName == "default" { return NewChaCha() } if cipherName == "AES" { return NewAES() } if cipherName == "XOR" { return NewXOR([]byte("fasdfasdf!3297!jfsl12*&!HHHFds")) } return nil //TODO:临时这样处理 } func SendData(carrier *Carrier, nByte int) (n int, err error) { if carrier.Cipher == nil { n, err = carrier.Conn.Write(carrier.Cache[:nByte]) return } encrypedByte, err := carrier.Cipher.Encrypt(carrier.Cache[:nByte]) if err != nil { n = 0 return } n, err = carrier.Conn.Write(encrypedByte[:nByte]) copy(carrier.Cache, encrypedByte[:nByte]) // in case of debugging return } func ReceiveData(carrier *Carrier) (n int, err error) { n, err = carrier.Conn.Read(carrier.Cache) if err != nil { n = 0 return } if carrier.Cipher == nil { return } decrypted, err := carrier.Cipher.Decrypt(carrier.Cache[:n]) copy(carrier.Cache, decrypted[:n]) if err != nil { n = 0 return } return }