Ejemplo n.º 1
0
        /// <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();
            }
        }
Ejemplo n.º 5
0
        /// <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 } //传入方法的参数
                    );
            }
        }
Ejemplo n.º 6
0
 /// <summary>
 /// 发送信息
 /// </summary>
 private void SendMsg(User user, string msg)
 {
     user.sw.WriteLine(RijndaelProcessor.EncryptString(msg, user.randomKey));
     user.sw.Flush();
 }
Ejemplo n.º 7
0
        /// <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
            }
        }