예제 #1
0
        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);
            }
        }