#region Server /// <summary> /// 用于保存非對稱加密(數字證書)的公鑰 /// </summary> PRivate string publicKey = string.Empty; /// <summary> /// 用于保存非對稱加密(數字證書)的私鑰 /// </summary> private string pfxKey = string.Empty; ///=========================== ///服務端代碼 ///=========================== /// <summary> /// 用于跟客戶端通信的Socket /// </summary> private Socket serverCommunicateSocket; /// <summary> /// 定義接收緩存塊的大小 /// </summary> private static int serverBufferSize = 1024; /// <summary> /// 緩存塊 /// </summary> byte[] bytesReceivedFromClient = new byte[serverBufferSize]; /// <summary> /// 密鑰K /// </summary> private string key = string.Empty; StringBuilder messageFromClient = new StringBuilder(); /// <summary> /// 開啟服務器 /// </summary> private void btnStartServer_Click(object sender, EventArgs e) { //先生成數字證書(模擬,及非對稱密鑰對) RSAKeyInit(); //負責偵聽 StartListen(); } void RSAKeyInit() { RSAProcessor.CreateRSAKey(ref publicKey, ref pfxKey); //本例中,先指定一對公鑰、私鑰 publicKey = "<RSAKeyValue><Modulus>httkQLJ52ODWcIoDont7izs0Kn8OIr3IJ+Q5DC3RgzojjphvHN/5N4miVN+U0fz405o53CRP0PUghyq0rbHZNj7ZW1M1Vh/ne4lDvP/q44QerhYewTUwT92tHj8GyYxvegkp98vT95YkjFJRByQCXrhKBW64ziqnDL2n9LeUPBM=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>"; pfxKey = "<RSAKeyValue><Modulus>httkQLJ52ODWcIoDont7izs0Kn8OIr3IJ+Q5DC3RgzojjphvHN/5N4miVN+U0fz405o53CRP0PUghyq0rbHZNj7ZW1M1Vh/ne4lDvP/q44QerhYewTUwT92tHj8GyYxvegkp98vT95YkjFJRByQCXrhKBW64ziqnDL2n9LeUPBM=</Modulus><Exponent>AQAB</Exponent><P>vZPGLPJBxtjhoSSt7OXvAqalRU8IXmPbojk7/j9f1DW1DRCLwof6MjJqt4uAY9D/L/GPJh9zIddeVM3lkr9s6Q==</P><Q>tht1LlLi7XQJHsVfgJ1ewBjjOOzQSfmO+RTClWXKquuup4pblF51jSDK+5VlyibD5chzeO1mxjvzkEfcJNgTmw==</Q><DP>kZXfdfrhKqy5sX+ylaAKydViTHSiL6KuM8mSWfEfTZ+lF5BiVBUKvevb6nKWOZFxt8bhMNysFQwI5EVujSC2QQ==</DP><DQ>hEsqM77vMEWNopcMLCkm/jKWT3JqVnM/lF+qhFHwi36v4PK4WO7OQvpBu8bqrZK/2ZxnlsAQW46OAJDTsshuZQ==</DQ><InverseQ>BfZy74k5EqN6l7faYHSYvqWuRMSWwp4dCXF43uT8wcf3kciYxIkbaNNY56ulJbCAN2SyDQkD3PF+Sp3qtJZ/Vg==</InverseQ><D>ADbI6fFekCGLNZKCfveDMq1dX9PjydpTPvz1ujc4ZeTpuYg0ZO9WDeiCAXB5Y/vqySstfFPybHp3Gr/OmZf2qEbKQlK6Ztms3R30rnqk/2/XHtAm5AeVLhf03q/+76mtvgtUTspgth55JpIKGYNKcQTJBbgepbyVT26YjMwrMoE=</D></RSAKeyValue>"; } void StartListen() { ipEndPoint iep = new IPEndPoint(IPAddress.Parse("192.168.1.103"), 8009); //負責偵聽的socket Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); listenSocket.Bind(iep); listenSocket.Listen(50); listenSocket.BeginAccept(new AsyncCallback(this.Accepted), listenSocket); ListBoxShow("開始偵聽..."); btnStartServer.Enabled = false; } /// <summary> /// 負責客戶端的連接,并開始將自己置于接收狀態 /// </summary> void Accepted(IAsyncResult result) { Socket listenSocket = result.AsyncState as Socket; //初始化和客戶端進行通信的socket serverCommunicateSocket = listenSocket.EndAccept(result); ListBoxShow("有客戶端連接到..."); serverCommunicateSocket.BeginReceive(bytesReceivedFromClient, 0, serverBufferSize, SocketFlags.None, new AsyncCallback(this.ReceivedFromClient), null); } /// <summary> /// 負責處理接收自客戶端的數據 /// </summary> void ReceivedFromClient(IAsyncResult result) { int read = serverCommunicateSocket.EndReceive(result); if (read > 0) { messageFromClient.Append(UTF32Encoding.Default.GetString(bytesReceivedFromClient, 0, read)); //處理并顯示數據 ProcessAndShowInServer(); serverCommunicateSocket.BeginReceive(bytesReceivedFromClient, 0, serverBufferSize, 0, new AsyncCallback(ReceivedFromClient), null); } } private void ProcessAndShowInServer() { string msg = messageFromClient.ToString(); //如果接收到<EOF>表示完成一次,否則繼續將自己置于接收狀態 if (msg.IndexOf("<EOF>") > -1) { //如果客戶端發送Key,則負責初始化Key if (msg.IndexOf("<KEY>") > -1) { //用私鑰解密發送過來的Key信息 key = RSAProcessor.RSADecrypt(pfxKey, msg.Substring(0, msg.Length - 10)); ListBoxShow(string.Format("接收到客戶端密鑰:{0}", key)); } else { //解密SSL通道中發送過來的密文并顯示 ListBoxShow(string.Format("接收到客戶端消息:{0}", RijndaelProcessor.DecryptString(msg.Substring(0, msg.Length - 5), key))); } } messageFromClient.Clear(); } /// <summary> /// 負責向客戶端發送數據 /// </summary> private void btnStartSendToClient_Click(object sender, EventArgs e) { //加密消息體 string msg = string.Format("{0}{1}", RijndaelProcessor.EncryptString(DateTime.Now.ToString(), key), "<EOF>"); RijndaelProcessor.DecryptString(msg.Substring(0, msg.Length - 5), key); byte[] msgBytes = UTF32Encoding.Default.GetBytes(msg); serverCommunicateSocket.BeginSend(msgBytes, 0, msgBytes.Length, SocketFlags.None, null, null); ListBoxShow(string.Format("發送:{0}", msg)); } /// <summary> /// 界面顯示 /// </summary> private void ListBoxShow(string argMsg) { listBoxServer.BeginInvoke(new Action(() => { listBoxServer.Items.Add(argMsg); })); } #endregion
#region Client /// <summary> /// 用于保存非對稱加密(數字證書)的公鑰 /// </summary> private string publicKey = "<RSAKeyValue><Modulus>httkQLJ52ODWcIoDont7izs0Kn8OIr3IJ+Q5DC3RgzojjphvHN/5N4miVN+U0fz405o53CRP0PUghyq0rbHZNj7ZW1M1Vh/ne4lDvP/q44QerhYewTUwT92tHj8GyYxvegkp98vT95YkjFJRByQCXrhKBW64ziqnDL2n9LeUPBM=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>"; ///============================== /// 客戶端代碼 ///============================== ///用于跟蹤服務器通信的socket private Socket clientCommunicateSocket; /// <summary> /// 用于暫存接收到的字符串 /// &l
新聞熱點
疑難解答