このコードは自習用に書かれています。 素材を統合するために、作業について少しコメントすることにしました。
私はすぐに言わなければなりません:私はコンパイルされた言語で書きませんでした。
アプリケーションは何をしますか
[k]-クライアント
[c]-サーバー
1.確立されたTCP接続を介して、[k]は公開キーrsaを転送します。
2.受け入れられた公開鍵を使用して、[c]メッセージを暗号化して送信します[to]
3. [k]はメッセージを復号化して表示します。
コンソールでは次のように表示されます。

サーバー
package main
必要なパッケージをインポートします
import(
パッケージへのアクセスは、ドットを介した名前によって行われます。
例:
fmt
Println()
、
os
。 Exit()
など
必要なパッケージ名がわからない場合は、コードの一番上の行でパッケージソースを確認できます。
たとえば、
crypto / rsaの場合、
6行目のrsa.gogoinstallコマンドを使用すると、他の
開発者からパッケージをインストールできます。
この場合、「bitbucket.org/user/project」、「github.com/user/project」、または「project.googlecode.com/hg」のようなものをインポートします
必要な定数を宣言する
const(
接続「c」とこの接続「pubK」へのキーを一緒に保持するには、remoteConnデータ型を構造体として宣言します。
type remoteConn struct { c *net.TCPConn pubK *rsa.PublicKey }
変数の型の前のアスタリスク「*」は、変数が宣言された型のデータへの参照であることを意味します
net.TCPConnは、TCP接続情報の構造を含むデータ型です。
rsa.PublicKey-データ型。 送信メッセージの暗号化に必要です。
慣れるために、次のように表示されるエラーを処理します。
この関数は、タイプが
os.Errorである単一の
err
値を取ります。
この場合、
osパッケージの
エラータイプ(
os.Error
)を使用しています。
func checkErr(err os.Error){ if err != nil {
タイプ
net.TCPAddrの構造への参照となるグローバル変数
listenAddr
を宣言します
var listenAddr = &net.TCPAddr{IP: net.IPv4(192,168,0,4), Port: 0}
net.TCPAddrの前のアンパサンド "&"は、このタイプへの参照を返します。
この場合の「ポート:0」は、すべての空きポートを意味します。
次の関数は、接続と公開鍵を組み合わせて、この接続を
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}
コメントが1つもないソースは、次の場所にあります。
code.google.com/p/learning-go-language/source/browse