Skip to content

Instantly share code, notes, and snippets.

@ykm11
Last active December 8, 2018 12:45
Show Gist options
  • Save ykm11/c4ad4ceb19a5894011f4ce5099809fa7 to your computer and use it in GitHub Desktop.
Save ykm11/c4ad4ceb19a5894011f4ce5099809fa7 to your computer and use it in GitHub Desktop.
Golangによるsocket通信(2)
package main
import (
"fmt"
"net"
"os"
"time"
"./utils"
"./encryption"
"math/big"
)
func main() {
serverIP := "localhost"
serverPort := "55555"
myIP := "localhost"
myPort := 55556
base, myExp, modulus := encryption.FFDHE_key_gen("2048")
myPub := encryption.FFDHE(base, myExp, modulus)
tcpAddr, err := net.ResolveTCPAddr("tcp", serverIP + ":" + serverPort)
checkError(err)
myAddr := new(net.TCPAddr)
myAddr.IP = net.ParseIP(myIP)
myAddr.Port = myPort
conn, err := net.DialTCP("tcp", myAddr, tcpAddr)
checkError(err)
defer conn.Close()
conn.Write(myPub.Bytes())
readBuf := make([]byte, 1024)
conn.SetReadDeadline(time.Now().Add(10 * time.Second))
readlen, err := conn.Read(readBuf)
peerPub := new(big.Int).SetBytes(readBuf[:readlen])
checkError(err)
myPri := encryption.FFDHE(peerPub, myExp, modulus)
fmt.Println("[+] DH Public Key :", myPub)
fmt.Println("[+] DH Private Key :", myPri)
conn.SetReadDeadline(time.Now().Add(10 * time.Second))
readlen, err = conn.Read(readBuf)
encrypted_message := readBuf[:readlen]
checkError(err)
fmt.Printf("[+] Received Message : % x\n", encrypted_message)
bytesPriKey := myPri.Bytes() // 本来のHKDFを飛ばして, いきなりDH-Keyをつかう
//secret := []byte("secret key")
key, nonce := utils.Gen_key_and_iv(bytesPriKey, 32, 12, "sha256")
message := encryption.Chacha20_encrypt(key, 1, nonce, encrypted_message)
fmt.Printf("[+] Received Message : %s\n", message)
}
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