рднрд╛рд╖рд╛ рдЬрд╛рдУред рдЫреЛрдЯреЗ рдЧреНрд░рд╛рд╣рдХ-рд╕рд░реНрд╡рд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ

рдпрд╣ рдХреЛрдб рд╕реНрд╡-рдЕрдзреНрдпрдпрди рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рд╕рд╛рдордЧреНрд░реА рдХреЛ рдордЬрдмреВрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдХрд┐рдП рдЧрдП рдХрд╛рдо рдкрд░ рдереЛрдбрд╝реА рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рдореБрдЭреЗ рддреБрд░рдВрдд рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП: рдореИрдВрдиреЗ рд╕рдВрдХрд▓рд┐рдд рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ред

рдЖрд╡реЗрджрди рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ


[k] - рдХреНрд▓рд╛рдЗрдВрдЯ
[рдЧ] - рд╕рд░реНрд╡рд░
1. рд╕реНрдерд╛рдкрд┐рдд рдЯреАрд╕реАрдкреА рдХрдиреЗрдХреНрд╢рди рдкрд░, [k] рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА rsa рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
2. рд╕реНрд╡реАрдХрд╛рд░ рдХреА рдЧрдИ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, [c] рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИ [рдХреЛ]
3. [рдХреЗ] рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдФрд░ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рдпрд╣ рд╕рд╛рдВрддреНрд╡рдирд╛ рдореЗрдВ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
рдЫрд╡рд┐


рд╕рд░реНрд╡рд░


package main 

рд╣рдо рдЖрд╡рд╢реНрдпрдХ рдкреИрдХреЗрдЬ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ
 import( //   / .      "fmt" //      Unix networks sockets, including TCP/IP, UDP . //      TCP . "net" //        "os" //   / "bufio" //           "crypto/rsa" //       "crypto/rand" //     sha1 "crypto/sha1" //           "strconv" //      "big" ) 
рдкреИрдХреЗрдЬ рддрдХ рдЖрдЧреЗ рдкрд╣реБрдВрдЪ рдбреЙрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕рдХреЗ рдирд╛рдо рд╕реЗ рд╣реЛрдЧреАред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: fmt ред Println() , os ред Exit() рдЖрджрд┐
рдпрджрд┐ рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕ рдкреИрдХреЗрдЬ рдХреЗ рдирд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдХреЛрдб рдХреЗ рд╢реАрд░реНрд╖ рд░реЗрдЦрд╛ рдкрд░ рдкреИрдХреЗрдЬ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрд░рд┐рдкреНрдЯреЛ / rsa рдХреЗ рд▓рд┐рдП рдЫрдареА рдкрдВрдХреНрддрд┐ rsa.go
рдЧреЛрдЗрд╕реНрдЯ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде , рдЖрдк рдЕрдиреНрдп рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕реЗ рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдк рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЖрдпрд╛рдд рдХрд░реЗрдВрдЧреЗ "bitbucket.org/user/project", "github.com/user/project" рдпрд╛ "project.googlecode.com/hg"

рд╣рдореЗрдВ рдЬрд┐рди рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрдирдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВ
 const( //  tcp  tcpProtocol = "tcp4" //   rsa  keySize = 1024 //       readWriterSize = keySize/8 ) 


рдХрдиреЗрдХреНрд╢рди "c" рдФрд░ рдЗрд╕ рдХрдиреЗрдХреНрд╢рди рдХреА рдХреБрдВрдЬреА "pubK" рдХреЛ рдПрдХ рд╕рд╛рде рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд░рд┐рдореЛрдЯ рдХрдВрдЯреНрд░реЛрд▓ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ:
 type remoteConn struct { c *net.TCPConn pubK *rsa.PublicKey } 
рдЪрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдкрд╣рд▓реЗ рддрд╛рд░рд╛рдВрдХрди "*" рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЪрд░ рдШреЛрд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рд╕рдВрджрд░реНрдн рд╣реИ
net.TCPConn рдПрдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ TCP рдХрдиреЗрдХреНрд╢рди рдЬрд╛рдирдХрд╛рд░реА рдХреА рд╕рдВрд░рдЪрдирд╛ рд╣реЛрддреА рд╣реИред
rsa.PublicKey - рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ред рдпрд╣ рдкреНрд░реЗрд╖рд┐рдд рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕ рддрд░рд╣ рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдВрдЧреЗ:
рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдПрдХрд▓ рдЧрд▓рдд рдорд╛рди рд▓реЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ os.Error рд╣реИ ред
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдо рдУрдПрд╕ рдкреИрдХреЗрдЬ ( os.Error ) рд╕реЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред
 func checkErr(err os.Error){ if err != nil { //    fmt.Println(err) //   os.Exit(1) } } 


рд╡реИрд╢реНрд╡рд┐рдХ рд╡реИрд░рд┐рдПрдмрд▓ listenAddr рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ рдЬреЛ рдХрд┐ listenAddr рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╕рдВрджрд░реНрдн рд╣реЛрдЧрд╛ред рдПрд╕реАрдбреАрдбреАрдЖрд░
 var listenAddr = &net.TCPAddr{IP: net.IPv4(192,168,0,4), Port: 0} 
Ampersand "&" net рд╕реЗ рдкрд╣рд▓реЗред CPAddr рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рд╕рдВрджрд░реНрдн рд▓реМрдЯрд╛рдПрдЧрд╛ред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ "рдкреЛрд░реНрдЯ: 0" рдХрд╛ рдорддрд▓рдм рд╣реИ - рдХреЛрдИ рднреА рдореБрдлреНрдд рдкреЛрд░реНрдЯред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХрдиреЗрдХреНрд╢рди рдФрд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдХреЛ рдЗрд╕ рдХрдиреЗрдХреНрд╢рди рдХреЛ remoteConn рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП remoteConn рд╣реИред
рдФрд░ рдпрд╣ remoteConn рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рджреЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдореВрд▓реНрдп рдирд╣реАрдВред
 func getRemoteConn(c *net.TCPConn) *remoteConn{ return &remoteConn{c: c, pubK: waitPubKey(bufio.NewReader())} } 
bufio.NewReader() - рдХрдиреЗрдХреНрд╢рди "c" рд╕реЗ рдмрд╛рдЗрдЯ рдмрдлрд░ рдмрдирд╛рддрд╛ рд╣реИред рд╡рд╛рдкрд╕реА рдХрд╛ рдкреНрд░рдХрд╛рд░ *bufio.Reader ( *bufio.Reader рд▓рд┐рдВрдХ)
waitPubKey() - "рдХреНрд▓рд╛рдЗрдВрдЯ" рд╕реЗ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрдиреБрдХреНрд░рдо рдореЗрдВ PublicKey рд╕рдВрдЪрд╛рд░рд┐рдд рд╣реЛрдЧрд╛

рдлрд╝рдВрдХреНрд╢рди рдмрдлрд╝рд░ ( *bufio.Reader ) рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдмрджрд▓реЗ рдореЗрдВ рд╕рднреА рдмрд╛рдЗрдЯреНрд╕ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдХрдиреЗрдХреНрд╢рди "c" рд╕реЗ рдЖрддреЗ рд╣реИрдВред
 //      rsa.PublicKey func waitPubKey(buf *bufio.Reader) (*rsa.PublicKey) { //     line, _, err := buf.ReadLine(); checkErr(err) //    line - []byte ( ) //      <code><b>line</b></code>   if string(line) == "CONNECT" { //         ,       line, _, err := buf.ReadLine(); checkErr(err) //  PublicKey.N //   rsa.PublicKey pubKey := rsa.PublicKey{N: big.NewInt(0)} // pubKey.N == 0 //  pubKey.N big.Int http://golang.org/pkg/big/#Int //       pubKey.N big.Int pubKey.N.SetString(string(line), 10) //  SetString()  2 : // string(line) -      // 10 -       // (2 , 8 , 10 , 16  ...) //       pubKey.E line, _, err = buf.ReadLine(); checkErr(err) //   strconv    string   int pubKey.E, err = strconv.Atoi(string(line)); checkErr(err) //    rsa.PublicKey return &pubKey } else { //        .  : //    fmt.Println("Error: unkown command ", string(line)) os.Exit(1) //   } return nil } 


рдирд┐рдореНрди рдлрд╝рдВрдХреНрд╢рди рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ remoteConn рдПрдХ рдЪрд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ
рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдФрд░ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░рддрд╛ рд╣реИред
 func (rConn *remoteConn) sendCommand(comm string) { //   eComm, err := rsa.EncryptOAEP(sha1.New(), rand.Reader, rConn.pubK, []byte(comm), nil) // sha1.New()    hash.Hash //       sha512.New() sha256.New() ... // rand.Reader   io.Reader       //    /dev/unrandom   Linux  CryptGenRandom API   Windows // rConn.pubK -       func waitPubKey // []byte(comm) -   comm    ([]byte) checkErr(err) //    //        rConn.c.Write(eComm) // rConn.c  ? - net.TCPConn     Write() // http://golang.org/pkg/net/#TCPConn.Write } 


рдиреАрдЪреЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рдШреЛрд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдВрддрддрдГ рд╡рд┐рднрд┐рдиреНрди рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ "рдХреНрд▓рд╛рдЗрдВрдЯ" рд╕рд░реНрд╡рд░ рдирд╛рдо рдФрд░ рд╢реБрднрдХрд╛рдордирд╛рдПрдВ рднреЗрдЬрддрд╛ рд╣реИред
 func listen() { //     l, err := net.ListenTCP(tcpProtocol, listenAddr); checkErr(err) //    fmt.Println("Listen port: ", l.Addr().(*net.TCPAddr).Port) // l == *net.TCPListener ==     // .Addr() http://golang.org/pkg/net/#TCPListener.Addr ==   *net.TCPListener   "" // net.Addr http://golang.org/pkg/net/#Addr        TCPAddr - *net.TCPAddr //    Network()  String() c, err := l.AcceptTCP(); checkErr(err) //             // AcceptTCP() -   *net.TCPListener http://golang.org/pkg/net/#TCPListener.AcceptTCP //     fmt.Println("Connect from:", c.RemoteAddr()) //  3     fmt.Print[f|ln]()    // 1. c.RemoteAddr() // 2. c.RemoteAddr().(*net.TCPAddr) // 3. c.RemoteAddr().String() //     : fmt.Println(), fmt.Print(), fmt.Printf()    String() //       //             rConn := getRemoteConn() //     rConn.sendCommand("Go Language Server v0.1 for learning") rConn.sendCommand("!") rConn.sendCommand("╤Ц!") rConn.sendCommand("╤Ц!") rConn.sendCommand("Hello!") rConn.sendCommand("Salut!") rConn.sendCommand("уГПуВд!") rConn.sendCommand("цВихе╜!") rConn.sendCommand("ьХИыЕХ!") rConn.sendCommand("Hej!") } 


рдпрд╣ рд╕рд░реНрд╡рд░ рд╕рдореАрдХреНрд╖рд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред
 func main() { listen() } 


рдЧреНрд░рд╛рд╣рдХ


 package main import( "fmt" "net" "os" "bufio" "crypto/rsa" "crypto/rand" "crypto/sha1" "strconv" ) const( tcpProtocol = "tcp4" keySize = 1024 readWriterSize = keySize/8 ) func checkErr(err os.Error){ if err != nil { fmt.Println(err) os.Exit(1) } } var connectAddr = &net.TCPAddr{IP: net.IPv4(192,168,0,2), Port: 0} //             func connectTo() *net.TCPConn{ //   "Enter port:"      fmt.Print("Enter port:") //        "%d" fmt.Scanf("%d", &connectAddr.Port) // Scanf           fmt.Println("Connect to", connectAddr) //     c ,err := net.DialTCP(tcpProtocol, nil, connectAddr); checkErr(err) return c } //      PublicKey func sendKey(c *net.TCPConn, k *rsa.PrivateKey) { //       PublicKey c.Write([]byte("CONNECT\n")) //  N  *big.Int c.Write([]byte(k.PublicKey.N.String() + "\n")) // String()  *big.Int  string //  E  int c.Write([]byte(strconv.Itoa(k.PublicKey.E) + "\n")) // strconv.Itoa()  int  string // []byte()  ""    } //       //    func getBytes(buf *bufio.Reader, n int) []byte { //  n  bytes, err:= buf.Peek(n); checkErr(err) //  n  skipBytes(buf, n) return bytes } // ,     func skipBytes(buf *bufio.Reader, skipCount int){ for i:=0; i<skipCount; i++ { buf.ReadByte() } } func main() { //    c := connectTo() //       "c" buf := bufio.NewReader() //           k, err := rsa.GenerateKey(rand.Reader, keySize); checkErr(err) //     sendKey(c, k) //        for { //      cryptMsg := getBytes(buf, readWriterSize) //   msg, err := rsa.DecryptOAEP(sha1.New(), rand.Reader, k, cryptMsg, nil) //    checkErr(err) //    fmt.Println(string(msg)) } } 


рдПрдХ рднреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдмрд┐рдирд╛ рд╕реНрд░реЛрдд рдпрд╣рд╛рдБ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
code.google.com/p/learning-go-language/source/browse

Source: https://habr.com/ru/post/In126461/


All Articles