以下是一个基本的 Go 代码示例,用于加密和解密通过 TCP 连接发送的数据:
import (
"crypto/aes"
"crypto/cipher"
"fmt"
"io"
"net"
)
func main() {
// 设置服务器和客户端地址
serverAddr := "localhost:8000"
clientAddr := "localhost:9000"
// 启动服务器和客户端 goroutine
go startServer(serverAddr)
go startClient(clientAddr)
// 等待 goroutine 结束
select {}
}
func startServer(addr string) {
// 创建监听器
listener, err := net.Listen("tcp", addr)
if err != nil {
fmt.Println("Error listening:", err.Error())
return
}
defer listener.Close()
for {
// 接受客户端连接
conn, err := listener.Accept()
if err != nil {
fmt.Println("Error accepting:", err.Error())
continue
}
// 在新 goroutine 中处理客户端请求
go handleRequest(conn)
}
}
func handleRequest(conn net.Conn) {
// 创建 AES 加密块
key := []byte("0123456789abcdef")
block, err := aes.NewCipher(key)
if err != nil {
fmt.Println("Error creating AES cipher:", err.Error())
return
}
// 创建加密器和解密器
iv := make([]byte, aes.BlockSize)
stream := cipher.NewCTR(block, iv)
encrypter := cipher.StreamWriter{S: stream, W: conn}
decrypter := cipher.StreamReader{S: stream, R: conn}
// 复制加密后的数据到客户端
_, err = io.Copy(encrypter, decrypter)
if err != nil {
fmt.Println("Error copying data:", err.Error())
return
}
// 关闭连接
conn.Close()
}
func startClient(addr string) {
// 连接到服务器
conn, err := net.Dial("tcp", addr)
if err != nil {
fmt.Println("Error connecting:", err.Error())
return
}
// 创建 AES 加密块
key := []byte("0123456789abcdef")
block, err := aes.NewCipher(key)
if err != nil {
fmt.Println("Error creating AES cipher:", err.Error())
return
}
// 创建加密器和解密器
iv := make([]byte, aes.BlockSize)
stream := cipher.NewCTR(block, iv)
encrypter := cipher.StreamWriter{S: stream, W: conn}
decrypter := cipher.StreamReader{S: stream, R: conn}
// 从标准输入复制数据并加密后发送给服务器
_, err = io.Copy(encrypter, io.TeeReader(conn, os.Stdout))
if err != nil {
fmt.Println("Error copying data:", err.Error())
return
}
// 关闭连接
conn.Close()
}
该代码使用了 Go 的 crypto/aes
包来实现 AES 加密和解密,以及 net
包来处理网络连接。它使用 CTR 模式进行加密,并在服务器和客户端之间传输加密后的数据。