예제 #1
0
        private void StartDecrypting(Object sender, RoutedEventArgs e)
        {
            if (filename == null)
            {
                MessageBox.Show("No file chosen", "Cryptographer", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }

            string selectedUserEmail;

            try
            {
                selectedUserEmail = usersBox.SelectedItem.ToString().Split(' ')[1];
            }
            catch (Exception) { return; }

            if (selectedUserEmail != UsersControler.currentUser.email)
            {
                var x = usersBox.SelectedItem.ToString();
                var y = UsersControler.currentUser.email;
                return;
            }

            string      encryptedFileContent = File.ReadAllText(filepath);
            string      XMLStringMetadata    = encryptedFileContent.Split(new[] { "</EncryptedFileHeader>" }, StringSplitOptions.None)[0] + "</EncryptedFileHeader>";
            string      encyptedData         = encryptedFileContent.Split(new[] { "</EncryptedFileHeader>" }, StringSplitOptions.None)[1];
            string      sessionKey           = null;
            XmlDocument doc = new XmlDocument();

            doc.LoadXml(XMLStringMetadata);

            byte[] IV = Convert.FromBase64String(doc.SelectSingleNode("EncryptedFileHeader/IV").InnerText);

            CipherMode encryptionMode = 0;
            string     cipherMode     = doc.SelectSingleNode("EncryptedFileHeader/CipherMode").InnerText;

            if (cipherMode == "ECB")
            {
                encryptionMode = CipherMode.ECB;
            }
            if (cipherMode == "CBC")
            {
                encryptionMode = CipherMode.CBC;
            }
            if (cipherMode == "CFB")
            {
                encryptionMode = CipherMode.CFB;
            }

            XmlNodeList approvedUserNodes = doc.SelectNodes("/EncryptedFileHeader/ApprovedUsers");

            foreach (XmlNode node in approvedUserNodes)
            {
                if (UsersControler.currentUser.email == node.SelectSingleNode("User/Email").InnerText)
                {
                    string encryptedSessionKey = node.SelectSingleNode("User/SessionKey").InnerText;
                    sessionKey = Decrypt(encryptedSessionKey, UsersControler.currentUser.rsaPublicPrivateKey);
                    break;
                }
            }
            if (sessionKey == null)
            {
                MessageBox.Show("No user fitting to detailed in XML metadata");
                return;
            }
            SaveFileDialog sf = new SaveFileDialog();

            sf.FileName = filename.Remove(filename.Length - 4);
            bool?safeDialogResult = sf.ShowDialog();

            if (safeDialogResult == true)
            {
                File.WriteAllText(Path.GetFullPath(sf.FileName), AESCryptography.DecryptStringFromBytes(Convert.FromBase64String(encyptedData), Convert.FromBase64String(sessionKey), IV, encryptionMode));
            }
        }