В нашей программе будем использовать следующие функции:
1) Функция для записи файла последовательностью случайных чисел.
private static void WriteRandNum(string fileName, int count)
{
FileInfo f = new FileInfo(fileName);
long len = f.Length;
for (int j = 0; j < count; j++)
{
Random rnd = new Random();
byte[] bytes = new byte[len];
rnd.NextBytes(bytes);
File.WriteAllBytes(fileName, bytes);
}
}
В данную функцию в качестве формальных параметров предаётся путь к файлу и число раз, которое необходимо повторить цикл перезаписи.
Сначала мы определяем размер заданного файла. Затем создаем массив байт равный размеру файла, и заполняем его случайными числами. Далее перезаписываемый файл открывается, в него происходит запись сгенерированного ранее массива случайных чисел и файл закрывается.
2) Функция для записи файла битовой маской.
private static void WriteBitMask(string fileName, byte bitMask, int count)
{
FileInfo f = new FileInfo(fileName);
long len = f.Length;
for (int i = 0; i < count; i++)
{
byte[] bytes = new byte[len];
for (int j = 0; j < len; j++)
{
bytes[i] = bitMask;
}
File.WriteAllBytes(fileName, bytes);
}
}
В данную функцию в качестве формальных параметров предаётся путь к файлу, байт которым будет перезаписан файл и число раз, которое необходимо повторить цикл перезаписи.
Сначала мы определяем размер заданного файла. Затем создаем массив байт равный размеру файла и заполняем его ячейки указанным байтом. Далее перезаписываемый файл открывается, в него происходит запись созданного ранее массива байтов и файл закрывается.
3) Функция для риверсирования данных
private static void Reverse(string fileName)
{
FileStream fstream = new FileStream(fileName, FileMode.Open);
long len = fstream.Length;
byte[] bits = new byte[len];
MemoryStream ms = new MemoryStream();
fstream.CopyTo(ms);
fstream.Close();
Array.Reverse(ms.ToArray());
Array.Copy(ms.ToArray(), bits, len);
File.WriteAllBytes(fileName, bits);
}
В данную функцию в качестве формальных параметров предаётся путь к файлу. Мы открываем файл, определяем его размер. После чего с помощью нехитрых манипуляций помещаем содержимое файла в массив, инвертируем его, и записываем обратно в файл.
4) Функция реализующая алгоритм DoD (вариант Е)
private static void DOD3(string fileName)
{
//Перезапись случайными числами
WriteRandNum(fileName, 1);
//Инвертирование данных
Reverse(fileName);
//Перезапись случайными числами
WriteRandNum(fileName, 1);
//Удаление указателя на файл
File.Delete(fileName);
}
В данную функцию в качестве формальных параметров предаётся путь к файлу. Согласно алгоритму, мы последовательно производим перезапись файла случайными числами, затем инвертируем их, и снова записываем случайными числами. После перезаписи происходит удаление указателя на файл.
5) Функция реализующая алгоритм DoD (вариант ЕСЕ)
private static void DOD7(string fileName)
{
//Перезапись байтом #FF
WriteBitMask(fileName, 0xFF, 3);
//Перезапись байтом #00
WriteBitMask(fileName, 0x00, 3);
//Перезапись байтом #F6
WriteBitMask(fileName, 0xF6, 1);
//Удаление указателя на файл
File.Delete(fileName);
}
В данную функцию в качестве формальных параметров предаётся путь к файлу. Согласно алгоритму, перезапись производится три раза байтом #FF, три раза байтом #00 и один раз байтом #F6. В завершении удаляется указатель на файл.
6) Функция реализующая алгоритм Питера Гутмана
private static void Gutmann(string fileName)
{
//Перезапись случайными числами (первые 4 цикла)
WriteRandNum(fileName, 4);
//Перезапись битовыми масками
WriteBitMask(fileName, 0x55, 3);
WriteBitMask(fileName, 0xAA, 3);
WriteBitMask(fileName, 0x92, 1);
WriteBitMask(fileName, 0x49, 1);
WriteBitMask(fileName, 0x24, 1);
WriteBitMask(fileName, 0x49, 1);
WriteBitMask(fileName, 0x24, 1);
WriteBitMask(fileName, 0x92, 1);
WriteBitMask(fileName, 0x24, 1);
WriteBitMask(fileName, 0x92, 1);
WriteBitMask(fileName, 0x49, 1);
WriteBitMask(fileName, 0x00, 3);
WriteBitMask(fileName, 0x11, 3);
WriteBitMask(fileName, 0x22, 3);
WriteBitMask(fileName, 0x33, 3);
WriteBitMask(fileName, 0x44, 3);
WriteBitMask(fileName, 0x55, 3);
WriteBitMask(fileName, 0x66, 3);
WriteBitMask(fileName, 0x77, 3);
WriteBitMask(fileName, 0x88, 3);
WriteBitMask(fileName, 0x99, 3);
WriteBitMask(fileName, 0xAA, 3);
WriteBitMask(fileName, 0xBB, 3);
WriteBitMask(fileName, 0xCC, 3);
WriteBitMask(fileName, 0xDD, 3);
WriteBitMask(fileName, 0xEE, 3);
WriteBitMask(fileName, 0xFF, 3);
WriteBitMask(fileName, 0x92, 1);
WriteBitMask(fileName, 0x49, 1);
WriteBitMask(fileName, 0x24, 1);
WriteBitMask(fileName, 0x49, 1);
WriteBitMask(fileName, 0x24, 1);
WriteBitMask(fileName, 0x92, 1);
WriteBitMask(fileName, 0x24, 1);
WriteBitMask(fileName, 0x92, 1);
WriteBitMask(fileName, 0x49, 1);
WriteBitMask(fileName, 0x6D, 1);
WriteBitMask(fileName, 0xB6, 1);
WriteBitMask(fileName, 0xDB, 1);
WriteBitMask(fileName, 0xB6, 1);
WriteBitMask(fileName, 0xDB, 1);
WriteBitMask(fileName, 0x6D, 1);
WriteBitMask(fileName, 0xDB, 1);
WriteBitMask(fileName, 0x6D, 1);
WriteBitMask(fileName, 0xB6, 1);
//Перезапись случайными числами (последние 4 цикла)
WriteRandNum(fileName, 4);
//Удаление указателя на файл
File.Delete(fileName);
}
В данную функцию в качестве формальных параметров предаётся путь к файлу. Согласно алгоритму, первые и последние 4 цикла файл перезаписывается случайными числами, а с пятый по тридцать первый битовыми масками, основанными на теории уничтожения информации.
7) Функция для вызова конкретного метода удаления
public static void Erase(string item, int selectedIndex)
{
switch (selectedIndex)
{
case 0:
DOD3(item);
break;
case 1:
DOD7(item);
break;
case 2:
Gutmann(item);
break;
}
}
В данную функцию в качестве формальных параметров предаётся путь к файлу и номер метода, который выбрал пользователь.
8) Функция для удаления каталога и его содержимого
public static void DirSearch(string sDir, int selectedIndex)
{
foreach (string d in Directory.GetDirectories(sDir))
{
foreach (string f in Directory.GetFiles(d))
{
Erase(f, selectedIndex);
}
DirSearch(d, selectedIndex);
Directory.Delete(d);
}
foreach (string f in Directory.GetFiles(sDir))
{
Erase(f, selectedIndex);
}
}
В данную функцию в качестве формальных параметров предаётся путь к файлу и номер метода, который выбрал пользователь. В этой функции мы выявляем каталоги. Также мы проверяем находиться ли в данном каталоге другие каталоги. Функция является рекурсивной т.к. она вызывает сама себя.
Все файлы, находящиеся в каталоге удаляются по выбранному пользователем методу, после чего удаляется сама папка.