private bool decrypt(string path, string namefile) { try { int id_datakey = -1; int extra_key_status = -22; //string namefile= label1.Text; string namefile_new = "error"; byte[] encrypted_datakey = null; byte[] encrypted_dataIV = null; byte[] salt = new byte[32]; Aes master_aes = Aes.Create(); Aes data_aes = Aes.Create(); //Читаем данные о файле if (File.Exists("DB.db")) { SQLiteConnection dbConn = new SQLiteConnection("Data Source=DB.db; Version=3;"); SQLiteCommand command; dbConn.Open(); //Вносим все кроме id_DataKey command = new SQLiteCommand("SELECT * FROM DataKey WHERE namefile ='" + namefile + "'", dbConn); using (SQLiteDataReader reader = command.ExecuteReader()) { if (reader.HasRows) // если есть данные { while (reader.Read()) // построчно считываем данные { id_datakey = reader.GetInt32(0); extra_key_status = reader.GetInt32(1); namefile_new = reader.GetString(3); encrypted_datakey = _SQLite.stringtobyte(reader.GetString(4)); encrypted_dataIV = _SQLite.stringtobyte(reader.GetString(5)); } } } dbConn.Close(); } if ((path.ToLower().IndexOf(Directory.GetCurrentDirectory().ToLower()) == -1) || (File.Exists(Directory.GetCurrentDirectory() + "\\open\\" + namefile_new)) || (id_datakey == -1)) { MessageBox.Show("Невозможно расшифровать данный файл"); return(false); } else { //Если datakey зашифрован masterkey if (extra_key_status == 0) { if (File.Exists("DB.db")) { SQLiteConnection dbConn = new SQLiteConnection("Data Source=DB.db; Version=3;"); SQLiteCommand command; dbConn.Open(); //Вносим все кроме id_DataKey command = new SQLiteCommand("SELECT * FROM MasterKey ", dbConn); using (SQLiteDataReader reader = command.ExecuteReader()) { if (reader.HasRows) // если есть данные { while (reader.Read()) // построчно считываем данные { salt = _SQLite.stringtobyte(reader.GetString(2)); master_aes.IV = _SQLite.stringtobyte(reader.GetString(3)); Rfc2898DeriveBytes k1 = new Rfc2898DeriveBytes(_master_password, salt, 1000, HashAlgorithmName.SHA256); master_aes.Key = k1.GetBytes(32); } } } dbConn.Close(); } } //Если datakey зашифрован extakey else if (extra_key_status == 1) { string ps_hash = ""; if (File.Exists("DB.db")) { SQLiteConnection dbConn = new SQLiteConnection("Data Source=DB.db; Version=3;"); SQLiteCommand command; dbConn.Open(); //Вносим все кроме id_DataKey command = new SQLiteCommand("SELECT * FROM ExtraKey WHERE id_DataKey='" + id_datakey + "'", dbConn); using (SQLiteDataReader reader = command.ExecuteReader()) { if (reader.HasRows) // если есть данные { while (reader.Read()) // построчно считываем данные { ps_hash = reader.GetString(2); salt = _SQLite.stringtobyte(reader.GetString(3)); master_aes.IV = _SQLite.stringtobyte(reader.GetString(4)); } } } dbConn.Close(); } //Ввод и проверка пароля using (var form = new Form_auth(namefile)) { var result = form.ShowDialog(); if (result == DialogResult.OK) { string val = form.ReturnValue1; //values preserved after close string password = val; if (_SQLite.Hash(password) == ps_hash) { Rfc2898DeriveBytes k1 = new Rfc2898DeriveBytes(password, salt, 1000, HashAlgorithmName.SHA256); master_aes.Key = k1.GetBytes(32); } else { MessageBox.Show("Введен неверный пароль"); return(false); } } else { MessageBox.Show("Отмена расшифровки"); return(false); } } } else { MessageBox.Show("Не удалось расшифровать datakey"); return(false); } // Расшифровываем datakey data_aes.Key = DecryptStringFromBytes_Aes(encrypted_datakey, master_aes.Key, master_aes.IV); data_aes.IV = DecryptStringFromBytes_Aes(encrypted_dataIV, master_aes.Key, master_aes.IV); using (FileStream fstream = File.OpenRead(path)) { // преобразуем строку в байты byte[] array = new byte[fstream.Length]; // считываем данные fstream.Read(array, 0, array.Length); byte[] decript = DecryptStringFromBytes_Aes(array, data_aes.Key, data_aes.IV); FileStream fstream1 = new FileStream($"{Directory.GetCurrentDirectory()}\\open\\{namefile_new}", FileMode.OpenOrCreate); // запись массива байтов в файл fstream1.Write(decript, 0, decript.Length); if (fstream1 != null) { fstream1.Close(); } if (fstream != null) { fstream.Close(); } } //Удаление зашифрованного файла if (checkBox3.Checked) { if (File.Exists("DB.db")) { SQLiteConnection dbConn = new SQLiteConnection("Data Source=DB.db; Version=3;"); SQLiteCommand command; dbConn.Open(); //Вносим все кроме id_DataKey command = new SQLiteCommand("DELETE FROM ExtraKey WHERE id_DataKey = '" + id_datakey + "'", dbConn); command.ExecuteNonQuery(); command = new SQLiteCommand("DELETE FROM DataKey WHERE id = '" + id_datakey + "'", dbConn); command.ExecuteNonQuery(); FileInfo fileInf = new FileInfo(path); if (fileInf.Exists) { fileInf.Delete(); } dbConn.Close(); } } return(true); } } finally { _ThreadWaiter.RemoveThread(); } }
private bool encrypt(string path, string namefile_old) { try { using (FileStream fstream = File.OpenRead(path)) { // преобразуем строку в байты byte[] array = new byte[fstream.Length]; // считываем данные fstream.Read(array, 0, array.Length); if (array.Length == 0) { MessageBox.Show("Ошибка! Файл пуст."); return(false); } } //Читаем данные о файле if (File.Exists("DB.db")) { int id_datakey = -1; SQLiteConnection dbConn = new SQLiteConnection("Data Source=DB.db; Version=3;"); SQLiteCommand command; dbConn.Open(); //Вносим все кроме id_DataKey command = new SQLiteCommand("SELECT * FROM DataKey WHERE namefile_old ='" + namefile_old + "'", dbConn); using (SQLiteDataReader reader = command.ExecuteReader()) { if (reader.HasRows) // если есть данные { while (reader.Read()) // построчно считываем данные { id_datakey = reader.GetInt32(0); } } } dbConn.Close(); if (id_datakey != -1) { MessageBox.Show("Файл с таким именем уже был зашифрован!"); return(false); } } // Создание datakey Aes data_aes = Aes.Create(); int status_extra_key = 0; string namefile = namefile_old + ".sec"; //string namefile_old= label1.Text; byte[] encrypted_extrakey; byte[] encrypted_extraIV; //Проверяем нужно ли сменить имя, если да, меняем if (checkBox4.Checked) { namefile = _SQLite.Hash(namefile_old) + ".sec"; } //проверка нахождения файла на флешке(директории с exe-шником) if ((path.ToLower().IndexOf(Directory.GetCurrentDirectory().ToLower()) == -1) || (File.Exists(Directory.GetCurrentDirectory() + "\\encrypted\\" + namefile))) { MessageBox.Show("Невозможно зашифровать данный файл"); return(false); } else { //Доп пароль на файл if (checkBox2.Checked) { //Введение пароля для файла using (var form = new Form_auth(namefile_old)) { //Создание extrakey Aes extra_aes = Aes.Create(); var result = form.ShowDialog(); if (result == DialogResult.OK) { string val = form.ReturnValue1; //values preserved after close string password = val; byte[] salt1 = new byte[32]; RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider(); // Fill the array with a random value. rngCsp.GetBytes(salt1); Rfc2898DeriveBytes k1 = new Rfc2898DeriveBytes(password, salt1, 1000, HashAlgorithmName.SHA256); byte[] extra_key = new byte[32]; byte[] extra_IV = new byte[16]; extra_key = k1.GetBytes(32); //Считаем IV extra_aes.GenerateIV(); extra_IV = extra_aes.IV; extra_aes.Key = extra_key; string password_hash = _SQLite.Hash(password); if (File.Exists("DB.db")) { SQLiteConnection dbConn = new SQLiteConnection("Data Source=DB.db; Version=3;"); SQLiteCommand command; dbConn.Open(); //Вносим все кроме id_DataKey command = new SQLiteCommand("INSERT INTO ExtraKey (id_DataKey, ps_hash, salt, IV) VALUES (22222 ,'" + password_hash + "', '" + _SQLite.bytetostring(salt1) + "', '" + _SQLite.bytetostring(extra_IV) + "');", dbConn); command.ExecuteNonQuery(); dbConn.Close(); status_extra_key = 1; } else { MessageBox.Show("Не удалось найти файл БД"); return(false); } } else { MessageBox.Show("Отмена шифрования"); return(false); } //Шифруем ключ datakey encrypted_extrakey = EncryptStringToBytes_Aes(data_aes.Key, extra_aes.Key, extra_aes.IV); encrypted_extraIV = EncryptStringToBytes_Aes(data_aes.IV, extra_aes.Key, extra_aes.IV); } } else { //Шифруем datakey masterkey Aes master_aes = Aes.Create(); byte[] salt = new byte[32]; if (File.Exists("DB.db")) { SQLiteConnection dbConn = new SQLiteConnection("Data Source=DB.db; Version=3;"); SQLiteCommand command; dbConn.Open(); command = new SQLiteCommand("SELECT * FROM MasterKey ", dbConn); using (SQLiteDataReader reader = command.ExecuteReader()) { if (reader.HasRows) // если есть данные { while (reader.Read()) // построчно считываем данные { salt = _SQLite.stringtobyte(reader.GetString(2)); master_aes.IV = _SQLite.stringtobyte(reader.GetString(3)); Rfc2898DeriveBytes k1 = new Rfc2898DeriveBytes(_master_password, salt, 1000, HashAlgorithmName.SHA256); master_aes.Key = k1.GetBytes(32); } } } dbConn.Close(); } //Зашифровать мастер ключом дата ключ encrypted_extrakey = EncryptStringToBytes_Aes(data_aes.Key, master_aes.Key, master_aes.IV); encrypted_extraIV = EncryptStringToBytes_Aes(data_aes.IV, master_aes.Key, master_aes.IV); } using (FileStream fstream = File.OpenRead(path)) { // преобразуем строку в байты byte[] array = new byte[fstream.Length]; // считываем данные fstream.Read(array, 0, array.Length); //Шифрование файла // Encrypt the string to an array of bytes. byte[] encrypted = EncryptStringToBytes_Aes(array, data_aes.Key, data_aes.IV); //Создаем шифрованный файл в encrypted FileStream fstream1 = new FileStream($"{Directory.GetCurrentDirectory()}\\encrypted\\{namefile}", FileMode.OpenOrCreate); // запись массива байтов в файл fstream1.Write(encrypted, 0, encrypted.Length); if (fstream1 != null) { fstream1.Close(); } if (fstream != null) { fstream.Close(); } // Если нужно удалить исходный файл, удаляем if (checkBox3.Checked) { FileInfo fileInf = new FileInfo(path); if (fileInf.Exists) { fileInf.Delete(); } } //Сохраняем ключи в БД if (File.Exists("DB.db")) { SQLiteConnection dbConn = new SQLiteConnection("Data Source=DB.db; Version=3;"); SQLiteCommand command; dbConn.Open(); //Вносим все кроме id_DataKey command = new SQLiteCommand("INSERT INTO DataKey (extra_key, namefile, namefile_old, key, IV) VALUES ('" + status_extra_key + "','" + namefile + "', '" + namefile_old + "', '" + _SQLite.bytetostring(encrypted_extrakey) + "', '" + _SQLite.bytetostring(encrypted_extraIV) + "');", dbConn); command.ExecuteNonQuery(); if (checkBox2.Checked) { command = new SQLiteCommand("UPDATE ExtraKey SET id_DataKey = (SELECT ID FROM DataKey WHERE namefile='" + namefile + "') WHERE id_DataKey = 22222;", dbConn); command.ExecuteNonQuery(); } dbConn.Close(); } else { MessageBox.Show("Не удалось найти файл БД"); return(false); } } return(true); } } finally { _ThreadWaiter.RemoveThread(); } }