рдпрд╣ рдХреЛрдб рд╕реНрд╡-рдЕрдзреНрдпрдпрди рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рд╕рд╛рдордЧреНрд░реА рдХреЛ рдордЬрдмреВрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдХрд┐рдП рдЧрдП рдХрд╛рдо рдкрд░ рдереЛрдбрд╝реА рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рдореБрдЭреЗ рддреБрд░рдВрдд рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП: рдореИрдВрдиреЗ рд╕рдВрдХрд▓рд┐рдд рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ред
рдЖрд╡реЗрджрди рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ
[k] - рдХреНрд▓рд╛рдЗрдВрдЯ
[рдЧ] - рд╕рд░реНрд╡рд░
1. рд╕реНрдерд╛рдкрд┐рдд рдЯреАрд╕реАрдкреА рдХрдиреЗрдХреНрд╢рди рдкрд░, [k] рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА rsa рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
2. рд╕реНрд╡реАрдХрд╛рд░ рдХреА рдЧрдИ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, [c] рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИ [рдХреЛ]
3. [рдХреЗ] рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдФрд░ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рдпрд╣ рд╕рд╛рдВрддреНрд╡рдирд╛ рдореЗрдВ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

рд╕рд░реНрд╡рд░
package main
рд╣рдо рдЖрд╡рд╢реНрдпрдХ рдкреИрдХреЗрдЬ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ
import(
рдкреИрдХреЗрдЬ рддрдХ рдЖрдЧреЗ рдкрд╣реБрдВрдЪ рдбреЙрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕рдХреЗ рдирд╛рдо рд╕реЗ рд╣реЛрдЧреАред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
fmt
ред Println()
,
os
ред Exit()
рдЖрджрд┐
рдпрджрд┐ рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕ рдкреИрдХреЗрдЬ рдХреЗ рдирд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдХреЛрдб рдХреЗ рд╢реАрд░реНрд╖ рд░реЗрдЦрд╛ рдкрд░ рдкреИрдХреЗрдЬ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рдХреНрд░рд┐рдкреНрдЯреЛ / rsa рдХреЗ рд▓рд┐рдП рдЫрдареА рдкрдВрдХреНрддрд┐ rsa.goрдЧреЛрдЗрд╕реНрдЯ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде
, рдЖрдк рдЕрдиреНрдп
рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕реЗ рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдк рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЖрдпрд╛рдд рдХрд░реЗрдВрдЧреЗ "bitbucket.org/user/project", "github.com/user/project" рдпрд╛ "project.googlecode.com/hg"
рд╣рдореЗрдВ рдЬрд┐рди рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрдирдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВ
const(
рдХрдиреЗрдХреНрд╢рди "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 {
рд╡реИрд╢реНрд╡рд┐рдХ рд╡реИрд░рд┐рдПрдмрд▓
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" рд╕реЗ рдЖрддреЗ рд╣реИрдВред
рдирд┐рдореНрди рдлрд╝рдВрдХреНрд╢рди рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ
remoteConn
рдПрдХ рдЪрд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ
рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдФрд░ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░рддрд╛ рд╣реИред
func (rConn *remoteConn) sendCommand(comm string) {
рдиреАрдЪреЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рдШреЛрд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдВрддрддрдГ рд╡рд┐рднрд┐рдиреНрди рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ "рдХреНрд▓рд╛рдЗрдВрдЯ" рд╕рд░реНрд╡рд░ рдирд╛рдо рдФрд░ рд╢реБрднрдХрд╛рдордирд╛рдПрдВ рднреЗрдЬрддрд╛ рд╣реИред
func listen() {
рдпрд╣ рд╕рд░реНрд╡рд░ рд╕рдореАрдХреНрд╖рд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред
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}
рдПрдХ рднреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдмрд┐рдирд╛ рд╕реНрд░реЛрдд рдпрд╣рд╛рдБ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
code.google.com/p/learning-go-language/source/browse