A vector can be generated from a key, for example, if you do not want to store it separately.
package main import ( "net" "bufio" "fmt" "encoding/hex" "crypto/aes" "crypto/cipher" "bytes" "errors" "time" ) //Общие переменные для сервера и клиента var ( //Порт сервера PORT = ":10010" //Ключ для де/шифрования KEY, _ = hex.DecodeString("421A69BC2B99BEB97AA4BF13BE39D0344C9E31B853E646812F123DFE909F3D63") //Терминирующий байт TERM_BYTE = byte(0) ) func main() { //Запускаем сервер в отдельном потоке, чтоб проемулировать удаленную работу go server() //Ждем 3 секунды пока запустится сервер time.Sleep(3 * time.Second) //Запускаем клиента client() } //Сервер. func server() { //Слушаем порт ln, _ := net.Listen("tcp", PORT) conn, _ := ln.Accept() for { //Получаем сообщение в HEX формате hexRequest, _ := bufio.NewReader(conn).ReadString(TERM_BYTE) //Преобразовываем строку в зашифрованный массив байт encRequest, _ := hex.DecodeString(hexRequest[:len(hexRequest)-1]) //Расшифровываем сообщение message, _ := decrypt(KEY, encRequest) fmt.Println("Сервер получил:", string(message)) //Формируем ответ response := append(message, " -> 'Ответ'"...) //Шифруем ответ encResponse, _ := encrypt(KEY, response) //Преобразовываем в строку hexResponse := hex.EncodeToString(encResponse) fmt.Printf("Сервер отправляет: %s\n", hexResponse) //Отправляем ответ обратно клиенту conn.Write(append([]byte(hexResponse), TERM_BYTE)) } } //Клиент func client() { //Подключаемся к серверу conn, _ := net.Dial("tcp", "127.0.0.1"+PORT) message := " 'Запрос' " //Шифруем сообщение encRequest, _ := encrypt(KEY, []byte(message)) //Преобразовываем в строку hexRequest := hex.EncodeToString(encRequest) fmt.Printf("Клиент отправляет: %s\n", hexRequest) //Отправляем запрос на сервер conn.Write(append([]byte(hexRequest), TERM_BYTE)) //Получаем ответ от сервера hexResponse, _ := bufio.NewReader(conn).ReadString(TERM_BYTE) //Преобразовываем строку в зашифрованный массив байт encResponse, _ := hex.DecodeString(hexResponse[:len(hexResponse)-1]) //Расшифровываем сообщение messageBytes, _ := decrypt(KEY, []byte(encResponse)) fmt.Println("Клиент получил: " + string(messageBytes)) } func encrypt(key []byte, message []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } b := message b = PKCS5Padding(b, aes.BlockSize) encMessage := make([]byte, len(b)) iv := key[:aes.BlockSize] mode := cipher.NewCBCEncrypter(block, iv) mode.CryptBlocks(encMessage, b) return encMessage, nil } func decrypt(key []byte, encMessage []byte) ([]byte, error) { iv := key[:aes.BlockSize] block, err := aes.NewCipher(key) if err != nil { return nil, err } if len(encMessage) < aes.BlockSize { return nil, errors.New("encMessage слишком короткий") } decrypted := make([]byte, len(encMessage)) mode := cipher.NewCBCDecrypter(block, iv) mode.CryptBlocks(decrypted, encMessage) return PKCS5UnPadding(decrypted), nil } func PKCS5Padding(cipher []byte, blockSize int) []byte { padding := blockSize - len(cipher)%blockSize padText := bytes.Repeat([]byte{byte(padding)}, padding) return append(cipher, padText...) } func PKCS5UnPadding(src []byte) []byte { length := len(src) unPadding := int(src[length-1]) return src[:(length - unPadding)] }
Demo https://play.golang.org/p/0sS2uWjx8Us