1
0
mirror of https://github.com/fumiama/aes-rsa-tcp-demo.git synced 2026-06-05 01:20:24 +08:00
Files
aes-rsa-tcp-demo/client/main.go
2025-03-24 23:42:42 +09:00

117 lines
3.0 KiB
Go

package main
import (
"crypto/aes"
"crypto/md5"
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"flag"
"fmt"
"net"
"net/netip"
"time"
"github.com/fumiama/aes-rsa-tcp-demo/utils"
base14 "github.com/fumiama/go-base16384"
)
func main() {
server := flag.String("s", "0.0.0.0:12345", "server host:port")
aespsh := flag.String("aes", "矲晊泞柯碍嘖另蚡蔼帀㴂", "the AES preshard key of base16384 format")
flag.Parse()
if *aespsh == "" {
fmt.Println("must give parameter -aes")
return
}
aescipher, err := aes.NewCipher(base14.DecodeFromString(*aespsh))
if err != nil {
fmt.Println("parse AES preshared key error:", err)
return
}
conn, err := net.DialTCP("tcp", nil, net.TCPAddrFromAddrPort(netip.MustParseAddrPort(*server)))
if err != nil {
fmt.Println("Connect to server error:", err)
return
}
defer conn.Close()
fmt.Println("Ronnected to server", conn.RemoteAddr())
// request rsa pubkey
packet := utils.Packet{}
packet.Typ = utils.PacketTypeInit
packet.Dat, err = utils.NewPacketInit(nil, nil)
if err != nil {
fmt.Println("Wrap init packet err:", err)
return
}
data, err := packet.ToBytes()
if err != nil {
fmt.Println("Wrap packet err:", err)
return
}
_, err = conn.Write(data)
if err != nil {
fmt.Println("Write to server", conn.RemoteAddr(), "error:", err)
return
}
packet, err = utils.ReadPacket(conn)
if err != nil {
fmt.Println("Read packet from server", conn.RemoteAddr(), "error:", err)
return
}
if packet.Typ != utils.PacketTypeInit {
fmt.Println("Unexpected packet type from server")
return
}
x509rsapubkey, err := utils.ParsePacketInit(aescipher, packet.Dat)
if err != nil {
fmt.Println("Parse init packet error:", err)
return
}
rsapubk, err := x509.ParsePKCS1PublicKey(x509rsapubkey)
if err != nil {
fmt.Println("Parse x509rsapubkey error:", err)
return
}
fmt.Println("Get x509rsapubkey successfully")
t := time.NewTicker(time.Second)
defer t.Stop()
count := 0
for range t.C {
count++
packet.Typ = utils.PacketTypeComm
data, err = rsa.EncryptOAEP(
md5.New(), rand.Reader, rsapubk,
base14.StringToBytes(fmt.Sprintf("Hello! This is my No.%d communication.", count)),
nil,
)
if err != nil {
fmt.Println("EncryptOAEP err:", err)
return
}
packet.Dat = data
data, err := packet.ToBytes()
if err != nil {
fmt.Println("Wrap packet err:", err)
return
}
_, err = conn.Write(data)
if err != nil {
fmt.Println("Write to server", conn.RemoteAddr(), "error:", err)
return
}
packet, err = utils.ReadPacket(conn)
if err != nil {
fmt.Println("Read packet from server", conn.RemoteAddr(), "error:", err)
return
}
data, err = utils.RSAPublicKeyDecrypt(rsapubk, packet.Dat)
if err != nil {
fmt.Println("RSAPublicKeyDecrypt from server", conn.RemoteAddr(), "error:", err)
continue
}
fmt.Println("Receive from server", conn.RemoteAddr(), ":", base14.BytesToString(data))
}
}