Skip to content

Instantly share code, notes, and snippets.

@ykm11
Last active December 8, 2018 12:45
Show Gist options
  • Save ykm11/a1e26400179b59465013f7b95aa52dbb to your computer and use it in GitHub Desktop.
Save ykm11/a1e26400179b59465013f7b95aa52dbb to your computer and use it in GitHub Desktop.
Golangによるsocket通信(1)
package main
import (
"fmt"
"net"
"os"
"time"
"./utils"
"./encryption"
"math/big"
)
func main() {
service := ":55555"
tcpAddr, err := net.ResolveTCPAddr("tcp", service)
checkError(err)
listener, err := net.ListenTCP("tcp", tcpAddr)
checkError(err)
fmt.Printf("[*] Server up, port %s\n", service[1:])
for {
conn, err := listener.Accept()
if err != nil {
continue
}
go handleClient(conn)
}
}
func handleClient(conn net.Conn) {
defer conn.Close()
conn.SetReadDeadline(time.Now().Add(10 * time.Second))
fmt.Println("[*] Client accept!")
messageBuf := make([]byte, 1024)
messageLen, err := conn.Read(messageBuf)
checkError(err)
message := messageBuf[:messageLen]
peerPub := new(big.Int).SetBytes(message)
base, myExp, modulus := encryption.FFDHE_key_gen("2048")
myPub := encryption.FFDHE(base, myExp, modulus)
myPri := encryption.FFDHE(peerPub, myExp, modulus)
fmt.Println("[+] DH Public Key :", myPub)
fmt.Println("[+] DH Private Key :", myPri)
conn.SetWriteDeadline(time.Now().Add(10 * time.Second))
conn.Write(myPub.Bytes())
bytesPriKey := myPri.Bytes()
//secret := []byte("secret key")
key, nonce := utils.Gen_key_and_iv(bytesPriKey, 32, 12, "sha256")
plaintext := []byte("Hello, World!!")
c := encryption.Chacha20_encrypt(key, 1, nonce, plaintext)
fmt.Printf("[+] Cipher text : % x\n", c)
conn.SetWriteDeadline(time.Now().Add(10 * time.Second))
conn.Write(c)
}
func checkError(err error) {
if err != nil {
fmt.Fprintf(os.Stderr, "fatal: error: %s", err.Error())
os.Exit(1)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment