public static MessageModel DecryptMessage(this MessageModel message) { if ((message.MessageFlags & MessageFlags.EncryptedMessage) != MessageFlags.EncryptedMessage) { return(message); } if (message.EncryptedMessage == null) { throw new Exception("Encrypted blob is missing"); } if (UserSettingsModel.Instance.PrivateKey == null) { throw new Exception("Private key is missing"); } try { using (MemoryStream stream = new MemoryStream(message.EncryptedMessage)) { // Read the encrypted AES encryption keys // encrypted using sender's public key and recipient's public key byte[] encryptedDataKeyForRecipient = stream.ReadNextBlob(); byte[] encryptedDataKeyForSender = stream.ReadNextBlob(); // Decrypt my copy of the AES key byte[] aesKey = RsaEncryption.DecryptMessage(message.IsMine ? encryptedDataKeyForSender : encryptedDataKeyForRecipient, UserSettingsModel.Instance.PrivateKey); // Decrypt the message encrypted using the AES key byte[] serializedMessage = AesEncryption.DecryptMessage(stream.ReadNextBlob(), aesKey); // Deserialize the protobuf format return(ProtoBuf.Serializer.Deserialize <MessageModel>(new MemoryStream(serializedMessage))); } } catch (Exception) { return(null); } }