/// <summary> /// Provides files recovery feature /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnRecoverFiles_Click(object sender, RoutedEventArgs e) { string securityAnswer = textBoxSecurityAnswer.Text.ToLower(); string password = textBoxRecoveryPassword.Password; if (EncryptedFiles.Count.Equals(0)) { MessageBox.Show("You have no files to recover.", "No encrypted files found", MessageBoxButton.OK, MessageBoxImage.Information); } else { if (DataCryptography.SHA512(securityAnswer).Equals(LoggedUser.GetAnswer()) && DataCryptography.SHA512(password).Equals(LoggedUser.GetPassword())) { MessageBoxResult result = MessageBox.Show("Do you want to recover your files? All your program settings and keys will be deleted.", "Files recovery system", MessageBoxButton.YesNo, MessageBoxImage.Question); if (result.Equals(MessageBoxResult.Yes)) { string aesKey = DataCryptography.SHA512(DataCryptography.GenerateAesKey(this.Username, password, LoggedUser.GetQuestion(), securityAnswer)); List <string> tempEncryptedFiles = new List <string>(EncryptedFiles); EncryptedFiles.Clear(); Files.Clear(); Folders.Clear(); TrustedDevices.Clear(); var decryptionTask = Task.Run(() => { foreach (string encryptedFilePath in tempEncryptedFiles) { string filePath = DataCryptography.FileDecrypt(encryptedFilePath, aesKey); } }); decryptionTask.Wait(); LoggedUser.SetPublicKeyXmlString(String.Empty); LoggedUser.SetAesKey(aesKey); IOClass.SaveFilesList(Files, this.UserFilesFilepath); IOClass.SaveFilesList(EncryptedFiles, this.UserEncryptedFilesFilepath); IOClass.SaveFoldersList(Folders, this.UserFoldersFilepath); IOClass.SaveTrustedDevicesList(TrustedDevices, this.UserKeyDataFilepath); IOClass.UpdateUser(LoggedUser); bindFilesListBox(); bindFoldersListBox(); MessageBox.Show("Your files are decrypted now.", "Files recovery system", MessageBoxButton.OK, MessageBoxImage.Information); } } else { MessageBox.Show("Security answer or password incorrect!", "Files recovery system", MessageBoxButton.OK, MessageBoxImage.Warning); } } }
/// <summary> /// Creates an authentication key from selected device and saves it to the list. /// Adds a private key to device and public key to user data. /// </summary> /// <param name="deviceData"></param> /// <returns>Returns true if procedure went well</returns> bool addTrustedDevice(string deviceData) { // Temporary limit of trusted devices due to lack of multi-private-key system if (TrustedDevices.Count.Equals(0)) { string[] deviceDataArray = deviceData.Split(':'); string deviceModel = deviceDataArray[0].Trim(); string deviceName = deviceDataArray[1].Trim(); foreach (var device in ConnectedDevices) { if (device.VolumeName.Equals(deviceName) && device.Model.Equals(deviceModel)) { TrustedDevices.Add(device); string publicKeyString, privateKeyString; (publicKeyString, privateKeyString) = DataCryptography.GenerateRsaKeys(); string aesKey = LoggedUser.GetAesKey(); string encryptedAesKey = DataCryptography.EncryptAESKey(aesKey, publicKeyString); if (IOClass.SaveTrustedDevicesList(TrustedDevices, this.UserKeyDataFilepath) && IOClass.SavePrivateKeyOnDevice(device.Path, privateKeyString)) { LoggedUser.SetPublicKeyXmlString(publicKeyString); LoggedUser.SetAesKey(encryptedAesKey); LoggedUser.SetKeysQuantity(LoggedUser.GetKeysQuantity() + 1); IOClass.UpdateUser(LoggedUser); break; } else { MessageBox.Show("Couldn't create an authentication key.", "Error", MessageBoxButton.OK, MessageBoxImage.Error); } } } return(true); } else { MessageBox.Show("You already have your trusted device. Couldn't create another one.", "Information", MessageBoxButton.OK, MessageBoxImage.Information); return(false); } }
/// <summary> /// Deletes an authentication key from the list /// </summary> /// <param name="deviceData"></param> /// <returns></returns> bool deleteTrustedDevice(string deviceData) { string[] deviceDataArray = deviceData.Split(':'); string deviceModel = deviceDataArray[0].Trim(); string deviceName = deviceDataArray[1].Trim(); foreach (var device in TrustedDevices) { if (device.VolumeName.Equals(deviceName) && device.Model.Equals(deviceModel)) { TrustedDevices.Remove(device); if (IOClass.RemovePrivateKeyFromDevice(device.Path) && IOClass.SaveTrustedDevicesList(TrustedDevices, this.UserKeyDataFilepath)) { LoggedUser.SetPublicKeyXmlString(null); LoggedUser.SetAesKey(String.Empty); LoggedUser.SetKeysQuantity(LoggedUser.GetKeysQuantity() - 1); IOClass.UpdateUser(LoggedUser); return(true); } } } return(false); }