private void remoteHandshake() { byte[] readBuffer = new byte[1024]; bool sessionOk = false; try { readBuffer = udpClient.Receive(ref ipPartnerEndPointRcv); } catch (Exception e) { Console.WriteLine(e.ToString()); } byte[] sessionKey = null; if (readBuffer != null) { sessionKey = CAes.SimpleDecrypt(readBuffer, m_myUseruser.m_kdcAsSessionKey, m_myUseruser.m_kdcAsSessionKey); m_sessionKey = sessionKey; string challenge = System.IO.Path.GetRandomFileName(); messageCreateChatRemoteToMaster sendMsgFromMaster = new messageCreateChatRemoteToMaster();; sendMsgFromMaster.challenge = CAes.SimpleEncrypt(challenge, sessionKey, sessionKey); sendMsgFromMaster.sessionKey = CAes.SimpleEncrypt(sessionKey, sessionKey, sessionKey); m_binryFormatter.Serialize(m_memStreamer, sendMsgFromMaster); byte[] buffer = m_memStreamer.ToArray(); udpClient.Send(buffer, buffer.Length, ipPartnerEndPointSend); byte[] readBuffer2 = new byte[1024]; try { readBuffer2 = udpClient.Receive(ref ipPartnerEndPointRcv); byte[] clientData = new byte[1024]; MemoryStream readSteam = new MemoryStream(readBuffer2); messageCreateChatRemoteToMaster retMsgFromRemote = (messageCreateChatRemoteToMaster)m_binryFormatter.Deserialize(readSteam); byte[] sessionKey2 = CAes.SimpleDecrypt(retMsgFromRemote.sessionKey, sessionKey, sessionKey); string challenge2 = CAes.SimpleDecrypt(retMsgFromRemote.challenge, sessionKey, sessionKey); if (StructuralComparisons.StructuralEqualityComparer.Equals(sessionKey2, sessionKey) && challenge2 == challenge + challenge) { sessionOk = true; } } catch (Exception e) { //set session key Console.WriteLine(e.ToString()); } } if (sessionOk) { MessageBoxResult messageBoxResult = System.Windows.MessageBox.Show("confirm chat with " + m_userPort.userName, "Confirmation", System.Windows.MessageBoxButton.YesNo); if (messageBoxResult == MessageBoxResult.Yes) { string confirmStr = "confirm"; byte[] confirmStringBytes = Encoding.ASCII.GetBytes(confirmStr); byte[] encryptedMsg = CAes.SimpleEncrypt(confirmStringBytes, m_sessionKey, m_sessionKey); udpClient.Send(encryptedMsg, encryptedMsg.Length, ipPartnerEndPointSend); var evt = setShowChatWindowEvnt; if (evt != null) { evt(this, ""); } readChatMsg(); } else { return; } } }
private void masterHandshake() { while (m_sessionRespons == null) { Thread.Sleep(100); } m_sessionKey = CAes.SimpleDecrypt(m_sessionRespons.m_sessionKeyA, m_myUseruser.m_kdcAsSessionKey, m_myUseruser.m_kdcAsSessionKey); m_remoteKey = CAes.SimpleDecrypt(m_sessionRespons.m_sessionKeyB, m_myUseruser.m_kdcAsSessionKey, m_myUseruser.m_kdcAsSessionKey); bool sessionOk = false; try { udpClient.Send(m_remoteKey, m_remoteKey.Length, ipPartnerEndPointSend); } catch (Exception e) { Console.WriteLine(e.ToString()); } byte[] readBuffer = null; try { readBuffer = udpClient.Receive(ref ipPartnerEndPointRcv); byte[] clientData = new byte[1024]; MemoryStream readSteam = new MemoryStream(readBuffer); messageCreateChatRemoteToMaster retMsgFromMaster = (messageCreateChatRemoteToMaster)m_binryFormatter.Deserialize(readSteam); byte[] sessionKey = CAes.SimpleDecrypt(retMsgFromMaster.sessionKey, m_sessionKey, m_sessionKey); if (StructuralComparisons.StructuralEqualityComparer.Equals(sessionKey, m_sessionKey)) { string challenge = CAes.SimpleDecrypt(retMsgFromMaster.challenge, m_sessionKey, m_sessionKey); string retChallengeEncryted = CAes.SimpleEncrypt(challenge + challenge, m_sessionKey, m_sessionKey); byte[] encryptedSession = CAes.SimpleEncrypt(m_sessionKey, m_sessionKey, m_sessionKey); messageCreateChatRemoteToMaster retMsgToMaster = new messageCreateChatRemoteToMaster(); retMsgToMaster.challenge = retChallengeEncryted; retMsgToMaster.sessionKey = encryptedSession; m_binryFormatter.Serialize(m_memStreamer, retMsgToMaster); byte[] buffer = m_memStreamer.ToArray(); udpClient.Send(buffer, buffer.Length, ipPartnerEndPointSend); sessionOk = true; } else { //error return; } } catch (Exception e) { Console.WriteLine(e.ToString()); } if (sessionOk) { byte[] readBufferConfirm = new byte[1024]; readBufferConfirm = udpClient.Receive(ref ipPartnerEndPointRcv); byte[] readBufferConfirmBytes = CAes.SimpleDecrypt(readBufferConfirm, m_sessionKey, m_sessionKey); string retStringConfirm = Encoding.ASCII.GetString(readBufferConfirmBytes); if (retStringConfirm == "confirm") { var evt = setShowChatWindowEvnt; if (evt != null) { evt(this, ""); } readChatMsg(); } else { ; } { return; } } }