private void KeyExchange() { //todo: add handling of an unsuccessful key exchange ReadServerPublicKey(); AesKeyExchangeRequest keyExchangeRequest = new AesKeyExchangeRequest(aesEncryption.GetKey(), aesEncryption.GetIV(), UserName); tcpClient.Send(rsa.Encrypt(coding.GetBytes(JsonSerializer.Serialize(keyExchangeRequest)), false)); byte[] rawResponse = tcpClient.GetMessage(); Response response = ParseMessage <Response>(rawResponse, serverKey); if (response.Code == StatusCode.Ok) { userState = UserState.Connected; } else { Console.WriteLine(response.Message); } }
private void KeyExchange() { while (true) { // send to the client server public key [and other credentials] tcpClient.Send(server.rsa.ExportRSAPublicKey()); // get key for symmetric encryption from client byte[] encryptedMessageWithKey = tcpClient.GetMessage(); try { byte[] messageWithKeyBytes = server.rsa.Decrypt(encryptedMessageWithKey, false); string messageWithKeyInJson = coding.Decode(messageWithKeyBytes); AesKeyExchangeRequest aesKeyExchangeRequest = JsonSerializer.Deserialize <AesKeyExchangeRequest>(messageWithKeyInJson); aesEncryption.SetKey(aesKeyExchangeRequest.Key); aesEncryption.SetIV(aesKeyExchangeRequest.IV); ClientAesKey = aesEncryption.GetKey(); AesKeyExchangeResponse response = new AesKeyExchangeResponse { Code = StatusCode.Ok, RequestId = aesKeyExchangeRequest.Id }; SendMessageAesEncrypted(response, ClientAesKey); return; } catch (Exception exception) { Console.WriteLine(exception.Message); } } }