//构造发送RN的报文 /// <summary> /// 产生一个随机数RN,并将RN和CA,CB一起发给A和B。 ///KDCA: Dp(Ep(<CA,CB,RN,T1>,KeA),KdKDC) ///KDCB: Dp(Ep(<CA,CB,RN,T1>,KeB),KdKDC) /// </summary> /// <param name="comClientGroup"></param> /// <returns></returns> private string[] createStrSendRN(ComClientGroup comClientGroup) { //str=username1+"c"+username2+"c"+RN+"c"+ticks; string[] rsaStr = new string[2]; string str = comClientGroup.CerClient1.Username + "c" + comClientGroup.CerClient2.Username + "c" + comClientGroup.Rn + "c" + TimeUtil.getTicks(); rsaStr[0] = this.rsaEnByKe(str, comClientGroup.CerClient1).Replace('$', 'd'); rsaStr[1] = this.rsaEnByKe(str, comClientGroup.CerClient2).Replace('$', 'd'); return(rsaStr); }
//检测该通信组是否已近存在 private bool isExistComClientGroup(ComClientGroup comClientGroup) { for (int i = 0; i < comClientGroups.Count; i++) { if (((ComClientGroup)comClientGroups[i]).ToString() == comClientGroup.ToString()) { return(true); } } return(false); }
private void ReceiveData() { UdpClient udpClient = new UdpClient(int.Parse(serverPort)); //远程主机节点 IPEndPoint remote = null; //返回的报文 string backMsg = string.Empty; //接收从远程主机发送过来的信息 while (true) { //关闭udpClient时此句会产生异常 //此句阻塞 byte[] bytes = udpClient.Receive(ref remote); string recStr = aes.AesDecipher(Encoding.UTF8.GetString(bytes, 0, bytes.Length)).Trim(); // this.txtComInfo.AppendText("\r\n" + recStr); // this.txtComInfo.AppendText("\r\n" + string.Format("来自{0}:{1}", remote, recStr)); //必须加这句,原因未知。 Thread.Sleep(100); string[] recStrArr = recStr.Split('|'); //连接 if (recStrArr[0] == "1") { sendMessage(aes.AesEncipher("1" + "|" + recStrArr[3].ToUpper()), IPAddress.Parse(recStrArr[1]), int.Parse(recStrArr[2])); this.txtComInfo.AppendText("\r\n处理来自" + remote + "的连接请求。"); } //注册 if (recStrArr[0] == "2") { string username = rsa.Decryption(recStrArr[3], KDCp, KDCq, KDCd); RegClient regClient = new RegClient(username); //检查是否已经注册此用户 //标志 int flag = 0; for (int i = 0; i < regClients.Count; i++) { if (regClient.Username == ((RegClient)regClients[i]).Username) { flag = 1; } } this.txtComInfo.AppendText("\r\n处理来自" + username + "的注册请求。"); //用户未注册 if (0 == flag) { regClients.Add(regClient); backMsg = rsa.Encryption(username, KDCp, KDCq, KDCd); sendMessage(aes.AesEncipher("2|" + backMsg), regClient.ClientIP, regClient.ClientPort); } if (1 == flag) { //用户已经注册 backMsg = rsa.Encryption("exist", KDCp, KDCq, KDCd); sendMessage(aes.AesEncipher("2|" + backMsg), regClient.ClientIP, regClient.ClientPort); } } //获取证书 if ("3" == recStrArr[0]) { //解密出请求报文 string cer = rsaDeByKd(recStrArr[3]); string[] cerArr = cer.Split('c'); string username = cerArr[0]; string cerKe = cerArr[1]; string cerTick = cerArr[2]; this.txtComInfo.AppendText("\r\n处理来自" + username + "的获取会话证书请求。"); this.txtComInfo.AppendText("\r\n用户名:" + username); this.txtComInfo.AppendText("\r\n用户公钥:" + cerKe); this.txtComInfo.AppendText("\r\n时间戳:" + cerTick); CerClient cerClient = new CerClient(username, cerKe, cerTick); //检测该用户是否已经取得证书 //标志 int flag = 0; for (int i = 0; i < cerClients.Count; i++) { if (cerClient.Username == ((CerClient)cerClients[i]).Username) { flag = 1; } } //用户未取得证书 if (0 == flag) { //KDC-->A: Dp(CA,KdKDC) backMsg = rsaEnByKd(username + "c" + cerKe); sendMessage(aes.AesEncipher("3|" + backMsg), cerClient.ClientIP, cerClient.ClientPort); cerClients.Add(cerClient); //广播当前获得证书的用户 Thread th = new Thread(broadcastCerClients); th.Start(); this.lbxCerClient.Items.Clear(); //页面显示 for (int i = 0; i < cerClients.Count; i++) { this.lbxCerClient.Items.Add(cerClients[i]); } } if (1 == flag) { //用户已经取得证书 backMsg = rsa.Encryption("exist", KDCp, KDCq, KDCd); sendMessage(aes.AesEncipher("3|" + backMsg), cerClient.ClientIP, cerClient.ClientPort); } } //申请会话 if ("5" == recStrArr[0]) { string str = rsaDeByKd(recStrArr[1]); string username1 = str.Split('c')[0]; string username2 = str.Split('c')[1]; CerClient c1 = null; CerClient c2 = null; for (int i = 0; i < cerClients.Count; i++) { if (username1 == ((CerClient)cerClients[i]).Username) { c1 = (CerClient)cerClients[i]; break; } } for (int i = 0; i < cerClients.Count; i++) { if (username2 == ((CerClient)cerClients[i]).Username) { c2 = (CerClient)cerClients[i]; break; } } ComClientGroup comClientGroup = new ComClientGroup(c1, c2); this.txtComInfo.AppendText("\r\n处理来自" + username1 + "的会话请求。"); this.txtComInfo.AppendText("\r\n<--" + comClientGroup.ToString() + "-->"); if (isExistComClientGroup(comClientGroup)) { //通信组已近存在 //MessageBox.Show("存在"); backMsg = rsa.Encryption("exist", KDCp, KDCq, KDCd); sendMessage(aes.AesEncipher("5|" + backMsg), c1.ClientIP, c1.ClientPort); } else { //尚未存在 this.comClientGroups.Add(comClientGroup); //this.txtComInfo.AppendText("\r\n--------\r\n" + createStrSendRN(comClientGroup)[0]); string str1 = rsaEnByKd(createStrSendRN(comClientGroup)[0]); string str2 = rsaEnByKd(createStrSendRN(comClientGroup)[1]); //this.txtComInfo.AppendText("\r\n--------\r\n" + str1); //this.txtComInfo.AppendText("\r\n--------\r\n" + str2); sendMessage(aes.AesEncipher("5|" + str1), c1.ClientIP, c1.ClientPort); sendMessage(aes.AesEncipher("5|" + str2), c2.ClientIP, c2.ClientPort); //页面显示 this.lbxComClient.Items.Clear(); for (int i = 0; i < comClientGroups.Count; i++) { this.lbxComClient.Items.Add((ComClientGroup)comClientGroups[i]); } } } //取消会话 if ("6" == recStrArr[0]) { this.txtComInfo.AppendText("\r\n取消通信组:" + recStrArr[1]); int i = 0; for (i = 0; i < comClientGroups.Count; i++) { if (((ComClientGroup)comClientGroups[i]).ToString() == recStrArr[1]) { break; } } if (i >= comClientGroups.Count) { //已经取消通信 } else { //移除该通信组 CerClient c1 = ((ComClientGroup)comClientGroups[i]).CerClient1; CerClient c2 = ((ComClientGroup)comClientGroups[i]).CerClient2; //发送通知 sendMessage(aes.AesEncipher("6|" + c2.Username), c1.ClientIP, c1.ClientPort); sendMessage(aes.AesEncipher("6|" + c1.Username), c2.ClientIP, c2.ClientPort); //刷新界面 comClientGroups.RemoveAt(i); //页面显示 this.lbxComClient.Items.Clear(); for (int j = 0; j < comClientGroups.Count; j++) { this.lbxComClient.Items.Add((ComClientGroup)comClientGroups[j]); } } } //转发通信消息 if ("7" == recStrArr[0]) { //this.txtComInfo.AppendText("\r\n收到转发通信消息报文:" + recStr); //构造比较字符串 string str1 = null; string username1 = recStrArr[1]; //源地址 string username2 = recStrArr[2]; //目的地址 //目的地址 CerClient cd = new CerClient(username2, "", ""); //源地址 CerClient cs = new CerClient(username1, "", ""); if (username1.CompareTo(username2) > 0) { str1 = username1 + "," + username2; } else { str1 = username2 + "," + username1; } int i = 0; for (i = 0; i < comClientGroups.Count; i++) { if (((ComClientGroup)comClientGroups[i]).ToString() == str1) { break; } } if (i >= comClientGroups.Count) { //不存在此通信组,返回消息发送失败 } else { //向目的地址发送消息报文 ComClientGroup comClientGroup = ((ComClientGroup)comClientGroups[i]); string repMsg = "7|" + cs.Username + "|" + recStrArr[3]; sendMessage(aes.AesEncipher(repMsg), cd.ClientIP, cd.ClientPort); //this.txtComInfo.AppendText("\r\n转发消息报文:" + repMsg); this.txtComInfo.AppendText("\r\n转发" + cs.Username + "---->" + cd.Username + " 消息报文:" + new AES(comClientGroup.Kaes).AesDecipher(recStrArr[3]).Trim()); } } //客户端断开消息 if ("8" == recStrArr[0]) { this.txtComInfo.AppendText("\r\n--------断开用户:" + recStr); string username = recStrArr[1]; //去除regClients中的该用户 int i = 0; for (i = 0; i < regClients.Count; i++) { if (((RegClient)regClients[i]).Username == username) { regClients.RemoveAt(i); break; } } //去除取得证书的用户列表中的该用户 i = 0; for (i = 0; i < cerClients.Count; i++) { if (((CerClient)cerClients[i]).Username == username) { cerClients.RemoveAt(i); break; } } //证书获得者页面刷新 this.lbxCerClient.Items.Clear(); for (int x = 0; x < cerClients.Count; x++) { this.lbxCerClient.Items.Add(cerClients[x]); } if (comClientGroups.Count != 0) { ArrayList comClientGroupsTemp = new ArrayList(); i = 0; for (i = 0; i < comClientGroups.Count; i++) { comClientGroupsTemp.Add(comClientGroups[i]); } //ArrayList comClientGroupsTemp = comClientGroups; //去除通信组中的该用户 i = 0; for (i = 0; i < comClientGroupsTemp.Count; i++) { ComClientGroup ccg = (ComClientGroup)comClientGroupsTemp[i]; if ((ccg.CerClient1.Username == username || ccg.CerClient2.Username == username)) { comClientGroups.Remove(ccg); //comClientGroups.Remove(); } } //刷新页面 //通信组显示 this.lbxComClient.Items.Clear(); for (int j = 0; j < comClientGroups.Count; j++) { this.lbxComClient.Items.Add((ComClientGroup)comClientGroups[j]); } } //广播用户断开消息 string rep = "8|" + rsa.Encryption(username, KDCp, KDCq, KDCd); for (i = 0; i < cerClients.Count; i++) { sendMessage(aes.AesEncipher(rep), ((CerClient)cerClients[i]).ClientIP, ((CerClient)cerClients[i]).ClientPort); } } //测试 //sendMessage("connect",IPAddress.Parse("127.0.0.1") ,int.Parse("1000")); } }