/// <summary> /// 发送信息 /// </summary> private void SendMsg(User user, string msg) { // ilogger.Logger(string.Format("发送的数据:{0}",msg)); user.sw.WriteLine(RijndaelProcessor.EncryptString(msg, user.randomKey)); user.sw.Flush(); }
private void ProcessAndShowInfoClient() { // 如果接收到 <EOF> 表示完成一次,否则继续将自己置于接收状态 if (messageFromServer.ToString().IndexOf("<EOF>") > -1) { //解密SSL通道发送过来的密文并显示 LogInfo(string.Format("接收到服务器消息:{0}", RijndaelProcessor.DecryptString(messageFromServer.ToString().Substring(0, messageFromServer.ToString().Length - 5), keyCreateRandom))); messageFromServer.Clear(); } }
private void btnSendTextToClient_Click(object sender, EventArgs e) { if (clientCommunicateSocket == null) { LogInfo("发送失败,客户端未连接"); return; } //加密消息体 string msg = string.Format("{0}{1}", RijndaelProcessor.EncryptString(DateTime.Now.ToString() + " " + txtSendTo.Text, keyCreateRandom), "<EOF>"); byte[] msgBytes = EncodingInstance.Instance.GetBytes(msg); clientCommunicateSocket.BeginSend(msgBytes, 0, msgBytes.Length, SocketFlags.None, null, null); LogInfo(string.Format("发送 : {0}", msg)); }
private void ProcessAndShowInServer() { string msg = messageFromClient.ToString(); // 如果接收到 <EOF> 表示完成一次,否则继续将自己置于接收状态 if (msg.IndexOf("<EOF>") > -1) { // 如果客户端发送Key,则负责初始化Key if (msg.IndexOf("<KEY>") > -1) { key = RASProcesser.RSADecrypt(pfxKey, msg.Substring(0, msg.Length - 10)); LogInfo(string.Format("接收到客户端密钥:{0}", key)); } else { //解密SSL通道发送过来的密文并显示 LogInfo(string.Format("接收到客户端消息:{0}", RijndaelProcessor.DecryptString(msg.Substring(0, msg.Length - 5), key))); } messageFromClient.Clear(); } }
/// <summary> /// 解析消息或KEY /// </summary> /// <param name="user">用户对象</param> /// <param name="receiveString">收到的加密后的字符串</param> private void ControlMsgOrKey(User user, string receiveString) { //根据私钥,解析出随机对称密钥 if (receiveString.IndexOf(MessageTypes.KEY) > -1) { string key = RSAProcessor.RSADecrypt(configModel.PrivateKey, receiveString.Substring(0, receiveString.Length - MessageTypes.KEY.Length)); if (Regex.IsMatch(key, @"^[a-z0-9]{8}$")) { user.randomKey = key; } else { ilogger.Logger(string.Format("用户{0}KEY({1})不符合规范,执行断开.", user.client.Client.RemoteEndPoint, key)); Console.WriteLine("用户{0}KEY({1})不符合规范,执行断开.", user.client.Client.RemoteEndPoint, key); RemoveUser(user); user.IsExit = true; return; } } //根据不同消息标志,做出不同处理 else { //直接用对称密钥解密信息 receiveString = RijndaelProcessor.DencryptString(receiveString, user.randomKey); //排查信息长度,最少3位 if (receiveString.Length < 3) { ilogger.Logger(string.Format("用户{0}信息长度{1}不符合规范,执行断开.", user.client.Client.RemoteEndPoint, receiveString.Length)); Console.WriteLine("用户{0}信息长度{1}不符合规范,执行断开.", user.client.Client.RemoteEndPoint, receiveString.Length); RemoveUser(user); return; } //排查是否为非法标志 if (Array.IndexOf(MessageTypes.LoginSignArray, receiveString.Substring(0, 3)) < 0) { ilogger.Logger(string.Format("用户{0}信息标志{1}非法,执行断开.", user.client.Client.RemoteEndPoint, receiveString.Substring(0, 3))); Console.WriteLine("用户{0}信息标志{1}非法,执行断开.", user.client.Client.RemoteEndPoint, receiveString.Substring(0, 3)); RemoveUser(user); return; } var dealMethod = typeof(DealMessage).GetMethod( ActionInTable( //字符串标志转换为枚举 (MessageTypes.LoginSign)Enum.Parse( typeof(MessageTypes.LoginSign), receiveString.Substring(0, 3) ))); //提取消息,避免为单纯的标志,故做一判断 receiveString = receiveString.Length > 3 ? receiveString.Substring(3, receiveString.Length - 3) : receiveString; //执行方法 dealMethod.Invoke( dealMessage, //封装了方法的类的实例 new object[] { user, receiveString } //传入方法的参数 ); } }
/// <summary> /// 发送信息 /// </summary> private void SendMsg(User user, string msg) { user.sw.WriteLine(RijndaelProcessor.EncryptString(msg, user.randomKey)); user.sw.Flush(); }
/// <summary> /// 消息管理 /// </summary> private void Msg_Click(object sender, RoutedEventArgs e) { Button btn = sender as Button; switch (btn.Name) { #region 发布消息 case "sendMsg": if (titleBox.Text.Trim() == "" || contentBox.Text.Trim() == "") { MessageBox.Show("请填写完整信息!"); } sendMsg.IsEnabled = false; sendMsg.Content = "等待."; NoticeInfo noticeInfo = new NoticeInfo { MsgTitle = titleBox.Text.Trim(), MsgContent = contentBox.Text.Trim() }; try { Access.InsertNotice(noticeInfo); } catch (Exception ex) { MessageBox.Show("插入数据异常:" + ex.Message); sendMsg.IsEnabled = true; sendMsg.Content = "发送"; return; } foreach (User u in connViewModel.AllUsers) { u.sw.WriteLine(RijndaelProcessor.EncryptString(MessageTypes.MSG + MessageTypes.PSP + "1" + MessageTypes.PSP + noticeInfo.MsgType + MessageTypes.NSP + noticeInfo.MsgTitle + MessageTypes.NSP + noticeInfo.MsgContent + MessageTypes.NSP + noticeInfo.MsgPublish, u.randomKey)); u.sw.Flush(); } sendMsg.IsEnabled = true; sendMsg.Content = "发送"; titleBox.Text = ""; contentBox.Text = ""; MessageBox.Show("信息发布成功"); break; #endregion #region 清空消息记录 case "clearMsg": clearMsg.IsEnabled = false; clearMsg.Content = "等待."; try { Access.ClearNotice(); } catch (Exception ex) { MessageBox.Show("清空数据异常:" + ex.Message); clearMsg.IsEnabled = false; clearMsg.Content = "等待."; return; } clearMsg.IsEnabled = true; clearMsg.Content = "清空已发布信息记录"; MessageBox.Show("数据清空成功!"); break; #endregion } }