Как зашифровать файл c
- Хранить данную критическую информацию «зашитой» в исполняемый файл exe. Из плюсов – относительная надёжность хранения, ведь для получения доступа к этой информации из вне потребуется дизассемблировать/декомпилировать исполняемый файл, из минусов — необходимость постоянно перекомпилировать исполняемый файл при смене пароля в учетных записях и опять же хранение этих данных в открытом виде в исходном коде программы, где эта информация и может быть считана посторонним наблюдателем.
- Хранить информацию в настроечных файлах приложения, но при этом само приложение должно работать на сервере приложений с ограниченным доступом. Из плюсов – легкая настройка в случае изменения данных учетных записей, из минусов – легкий доступ к критической информации всем, кто может зайти на сервер приложений.
- Хранить информацию в настроечных файлах программы в зашифрованном виде. Из плюсов – легкая настройка приложения в случае изменения данных, программа может работать не только на сервере приложений, критически важная информация хранится в виде недоступном для постороннего наблюдателя. Из минусов – только необходимость модернизации ранее написанного ПО.
По совокупности плюсов и минусов выбираем третий вариант.
Теперь чуть –чуть теории. Что же такое шифрование и для чего оно нужно? Шифрование –это трансформация для ее сокрытия от не авторизованных лиц,
но в то же время с предоставлением определенным пользователям доступа к ней. Для правильного шифрования и расшифрования данных нужна секретная информация, используемая криптографическими алгоритмами (ключ) для дешифровки.
Выделяем основные способы шифрования
- симметричное
- асимметричное
- хеширование
Симметричное шифрование это способ шифрования, в котором и для шифрования и расшифровывания используется один и тот же криптографический ключ
Асимметричное шифрование это способ при котором создаются два математически связанных ключа, один из которых передается открытым (доступных для всех) способом, а второй, приватный ключ — для расшифровывания
После краткой разминки для мозгов вернемся к нашей проблеме. Так как данные которые мы хотели шифровать должны быть обратимы после их зашифровывания, хеширование нам не подходит. Осталось определиться между симметричным и асимметричным алгоритмами шифрования. Так как ключ никуда передаваться не должен и будет использоваться одним пользователем, то нет и смыла усложнять исходный код наших программ алгоритмами создания и проверки пар ключей, используемых при асимметричном шифровании. Соответственно выбор пал на симметричное шифрование.
В итоге мы реализовали следующую схему. В динамически подключаемой библиотеке (dll) был создан статический класс инкапсулировавший в себе весь функционал требуемый нам для шифрования/расшифровывания данных. Вот пример функции выполняющей шифрование:
static public object Encrypt(byte[] data, string password) < SymmetricAlgorithm sa = null; try < sa = Rijndael.Create(); ICryptoTransform ct = sa.CreateEncryptor( (new PasswordDeriveBytes(password, null)).GetBytes(16), new byte[16]); MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, ct, CryptoStreamMode.Write); cs.Write(data, 0, data.Length); cs.FlushFinalBlock(); return ms.ToArray(); >catch (Exception e) < return e; >> static public string Encrypt(string data, string password) < object tmp = Encrypt(Encoding.UTF8.GetBytes(data), password); if (!(tmp is Exception)) < return Convert.ToBase64String((byte[])tmp); >else return null; >Теперь при создании новых программ, где требуется хранить зашифрованную информацию мы просто подключаем созданную нами dll и просто вызываем требуемые нам функции и получаем информацию для передачи в БД:
public string UserLogin < get < object tmp = dll.Crypt.Decrypt(userLogin, getKey()); return tmp is Exception ? "" : tmp.ToString(); >> При этом, в настроечном XML файле хранится информация в следующем виде: <Settings> <userLogin>p+esX621QNMR09YyY4plJQ==</userLogin> <userPassword>og6kLzB2woGVlnO0ZRisDA==</userPassword> </Settings>Таким образом мы скрываем от постороннего наблюдателя критически важную информацию. При необходимости, учитывая достаточно слабую защищённость от дизассемблирования/декомпиляции программ, созданных на платформе. Net можно дополнительно обфусцировать исполняемый файл программы с целью сокрытия механизма получения ключа.
В этом пошаговом руководстве показано, как зашифровать и расшифровать содержимое. Пример кода предназначен для приложения Windows Forms. Это приложение не демонстрирует реальные сценарии, такие как использование смарт-карт. Вместо этого оно демонстрирует основные принципы шифрования и расшифровки.
В этом пошаговом руководстве использует следующие правила шифрования:
Используйте класс Aes с симметричным алгоритмом для шифрования и расшифровки данных при помощи автоматически созданных Key и IV.
Используйте RSA асимметричный алгоритм для шифрования и расшифровки ключа с данными, зашифрованными Aes . Асимметричные алгоритмы лучше подходят для небольших объемов данных, таких как ключ.
Если вы хотите защитить данные на компьютере вместо обмена зашифрованным содержимым с другими людьми, рассмотрите возможность использования ProtectedData класса.
В следующей таблице указаны задачи шифрования из этого раздела.
Задача | Описание |
---|---|
Создание приложения Windows Forms | Выводит список элементов управления, необходимых для запуска приложения. |
Объявление глобальных объектов | Объявляет, что строковые переменные пути CspParameters и RSACryptoServiceProvider имеют глобальный контекст класса Form. |
Создание асимметричного ключа | Создает пару значений открытого и закрытого асимметричного ключа и присваивает ей имя контейнера ключей. |
Шифрование файла | Отображает диалоговое окно, где можно выбрать шифруемый файл, и шифрует этот файл. |
Расшифровка файла | Отображает диалоговое окно, где можно выбрать зашифрованный файл, и выполняет расшифровку этого файла. |
Получение закрытого ключа | Возвращает полную пару ключей при помощи имени контейнера ключей. |
Экспорт открытого ключа | Сохраняет ключ в XML-файл только с открытыми параметрами. |
Импорт открытого ключа | Загружает ключ из XML-файла в контейнер ключей. |
Тестирование приложения | Список процедур для тестирования этого приложения. |
Предварительные требования
Для выполнения этого пошагового руководства требуются следующие компоненты:
Создание приложения Windows Forms
Большинство примеров кода в этом пошаговом руководстве предназначено для использования в качестве обработчиков событий для элементов управления кнопок. В следующей таблице перечислены элементы управления, необходимые для образца приложения, и их имена в соответствии с примерами кода.
Элемент | Имя | Текстовое свойство (при необходимости) |
---|---|---|
Button | buttonEncryptFile | Шифрование файла |
Button | buttonDecryptFile | Расшифровка файла |
Button | buttonCreateAsmKeys | Создание ключей |
Button | buttonExportPublicKey | Экспорт открытого ключа |
Button | buttonImportPublicKey | Импорт открытого ключа |
Button | buttonGetPrivateKey | Получение закрытого ключа |
Label | label1 | Ключ не задан |
OpenFileDialog | openFileDialog1 | |
OpenFileDialog | openFileDialog2 |
дважды щелкните кнопки в конструкторе Visual Studio, чтобы создать свои обработчики событий.
Объявление глобальных объектов
Добавьте следующий код как часть объявления класса Form1. Измените строковые переменные для среды и параметров.
Создание асимметричного ключа
Эта задача создает асимметричный ключ, который шифрует и расшифровывает ключ Aes. Этот ключ был использован для шифрования содержимого, и отображает имя контейнера ключей в элементе управления метки.
Добавьте следующий код в качестве обработчика событий Click для кнопки Create Keys ( buttonCreateAsmKeys_Click ).
Шифрование файла
Эта задача включает два метода: метод обработчика событий для Encrypt File кнопки ( buttonEncryptFile_Click ) и EncryptFile метод. Первый метод отображает диалоговое окно для выбора файла и передает имя этого файла во второй метод, который выполняет шифрование.
Зашифрованное содержимое, ключ и вектор инициализации сохраняются в один FileStream, который называется пакетом шифрования.
Метод EncryptFile выполняет следующие действия:
Создает симметричный алгоритм Aes для шифрования содержимого.
Создает объект RSACryptoServiceProvider для шифрования ключа Aes.
Использует объект CryptoStream для чтения и шифрования исходного файла FileStream блоками байтов в конечный объект FileStream для зашифрованного файла.
Определяет длину зашифрованного ключа и вектора инициализации и создает массивы байтов со значениями их длин.
Записывает ключ, вектор инициализации и значения их длин в зашифрованный пакет.
Пакет шифрования использует следующий формат:
Длина ключа, байты 0–3
Длина вектора инициализации, байты 4–7
Вы можете использовать значения длины ключа и вектора инициализации для определения начальных точек и длин всех частей пакета шифрования, которые затем можно использовать для расшифровки файла.
Добавьте следующий код в качестве обработчика событий Click для кнопки Encrypt File ( buttonEncryptFile_Click ).
Добавьте следующий метод EncryptFile к форме:
Расшифровка файла
Эта задача включает в себя два метода: метод обработчика событий для кнопки Decrypt File ( buttonDecryptFile_Click ) и метод DecryptFile . Первый метод отображает диалоговое окно для выбора файла и передает имя этого файла во второй метод, который выполняет расшифровку.
Метод Decrypt выполняет следующие действия:
Создает Aes симметричный алгоритм для расшифровки содержимого.
Считывает первые восемь байтов FileStream зашифрованного пакета в массивы байтов, чтобы получить значения длин зашифрованного ключа и вектора инициализации.
Извлекает ключ и вектор инициализации из пакета шифрования в массивы байтов.
Создает объект RSACryptoServiceProvider для расшифровки ключа Aes.
Использует объект CryptoStream для чтения и расшифровки зашифрованного текста пакета шифрования FileStream блоками байтов в объект FileStream для расшифрованного файла. После завершения этой операции расшифровка завершается.
Добавьте следующий код в качестве обработчика событий Click для кнопки Decrypt File .
Добавьте следующий метод DecryptFile к форме:
Экспорт открытого ключа
Эта задача сохраняет ключ, созданный при помощи кнопки Create Keys , в файл. Она экспортирует только открытые параметры.
Данная задача имитирует ситуацию, в которой Ольга предоставляет Дмитрию свой открытый ключ, чтобы он мог зашифровывать для нее файлы. Дмитрий и другие лица, имеющие этот открытый ключ, не смогут расшифровать данные, поскольку они не имеют полной пары ключей с закрытыми параметрами.
Добавьте следующий код в качестве обработчика событий Click для кнопки Export Public Key ( buttonExportPublicKey_Click ).
Импорт открытого ключа
Эта задача загружает ключ исключительно с открытыми параметрами, в том виде, в котором он был создан при помощи кнопки Export Public Key , и задает его в качестве имени контейнера ключей.
Данная задача имитирует ситуацию, в которой Дмитрий загружает ключ Ольги исключительно с открытыми параметрами, чтобы зашифровывать для нее файлы.
Добавьте следующий код в качестве обработчика событий Click для кнопки Import Public Key ( buttonImportPublicKey_Click ).
Получение закрытого ключа
Эта задача устанавливает в качестве имени контейнера ключей имя ключа, созданного при помощи кнопки Create Keys . Контейнер ключей будет содержать полную пару ключей с закрытыми параметрами.
Данная задача имитирует ситуацию, в которой Ольга использует свой закрытый ключ для расшифровки файлов, зашифрованных Дмитрием.
Добавьте следующий код в качестве обработчика событий Click для кнопки Get Private Key ( buttonGetPrivateKey_Click ).
Тестирование приложения
После сборки приложения необходимо выполнить следующие сценарии тестирования.
Создание ключей, шифрование и расшифровка
Изучите только что расшифрованный файл.
Закройте приложение и перезапустите его, чтобы протестировать извлечение сохраненных контейнеров ключей в следующем сценарии.
Шифрование при помощи открытого ключа
Этот сценарий показывает, как шифровать файлы для другого лица при наличии только открытого ключа. Обычно это лицо предоставляет вам только открытый ключ и утаивает закрытый ключ для расшифровки.
Расшифровка при помощи закрытого ключа
Симметричное и асимметричное шифрования выполняются с использованием различных процессов. Симметричное шифрование выполняется в рамках потоков, поэтому его удобно применять для шифрования больших объемов данных. Асимметричное шифрование выполняется в рамках небольшого числа байтов, поэтому его удобно применять для шифрования только небольших объемов данных.
Симметричное шифрование
Управляемые классы симметричного шифрования используются со специальным классом потока CryptoStream , который шифрует данные, считанные в поток. Класс CryptoStream инициализируется классом управляемого потока, классом, реализующим ICryptoTransform интерфейс (созданным из класса, реализующего криптографический алгоритм), и CryptoStreamMode перечислением, описывающим тип доступа, разрешенный для CryptoStream. Класс CryptoStream можно инициализировать с помощью любого класса, производного от Stream класса, включая FileStream , MemoryStream и NetworkStream . При помощи этих классов можно осуществлять симметричное шифрование для различных объектов потока.
В следующем примере показано, как создать новый экземпляр класса реализации по умолчанию для Aes алгоритма. Экземпляр используется для выполнения шифрования класса CryptoStream . В этом примере CryptoStream инициализируется при помощи объекта потока fileStream , который может быть любым типом управляемого потока. Методу креатинкриптор из класса AES передается ключ и вектор инициализации, используемые для шифрования. В этом случае используется ключ и вектор инициализации по умолчанию, созданные из aes .
После выполнения этого кода все данные, записанные в объект CryptoStream , шифруются с помощью алгоритма AES.
Код шифрует поток с помощью симметричного алгоритма AES и записывает IV, а затем шифрует "Hello World!" в этот поток. Если код выполнен успешно, создается зашифрованный файл с именем TestData.txt и на консоль выводится следующий текст:
Файл можно расшифровать с помощью примера симметричного расшифровки при расшифровке данных. Этот пример и этот пример указывают тот же ключ.
Однако при возникновении исключения код выводит на консоль следующий текст:
Асимметричное шифрование
Приветствую всех. В последнее время часто встречаю вопросы как реализовать в своем приложении шифрование данных, для хранения или передачи их по сети. А после можно было бы их расшифровать и получить оригинал. Алгоритмов шифрования очень много, но в данной статье я покажу очень простой и быстрый способ шифрования. Этот способ был применен еще в MicrosoftWorld 95 . Но и сейчас можно встретить похожие подходы применения шифрования. В коде который я приведу ниже, мы передаем строку в метод EncodeDecrypt, в ней строка разбивается на символы и передается в другой метод в котором производится шифрование данных, шифрованные буквы, а точнее символы в методе TopSecret происходит вычисления XOR операции над каждым символом по ключу. И на выходе мы получаем зашифрованные данные, а в место привычных нам букв мы видим не понятные символы. Стоит заметить что в примере приведен ключ 16 битный и он будет подобран очень быстро, однако если вы ключ сделаете куда больше в 1000 раз к примеру, то такой ключ будет проблематично взломать, если это будет вообще возможно. По аналогии будет произведена расшифровка текста. И так посмотрим код программы.
ushort secretKey = 0x0088 ; // Секретный ключ (длина - 16 bit). string str = "Hello World" ; //это строка которую мы зашифруем str = EncodeDecrypt ( str , secretKey ) ; //производим шифрование Console . WriteLine ( str ) ; //выводим в консоль зашифрованную строку str = EncodeDecrypt ( str , secretKey ) ; //производим рассшифровку Console . WriteLine ( str ) ; //выводим в консоль расшифрованную строку public static string EncodeDecrypt ( string str , ushort secretKey ) var ch = str . ToArray ( ) ; //преобразуем строку в символы string newStr = "" ; //переменная которая будет содержать зашифрованную строку foreach ( var c in ch ) //выбираем каждый элемент из массива символов нашей строки newStr += TopSecret ( c , secretKey ) ; //производим шифрование каждого отдельного элемента и сохраняем его в строку public static char TopSecret ( char character , ushort secretKey ) character = ( char ) ( character ^ secretKey ) ; //Производим XOR операциюВесь код я закомментировал, и не старался его сокращать, я привел его в таком виде, что бы вам было более понятна работы такой программы построчно. Не думаю что у вас возникнут проблемы в его понимании. Такой подход шифрования можно использовать как в сетевых технологиях, типо игр,чата, но и в десктопных приложениях, веб приложениях скорость шифрования и дешифровки довольно высока, что скажется на быстрой работе вашей программы.
9 комментариев
class Program
static void Main(string[] args)
public static void EncodeDecrypt(string FileRes, string FileDest, ushort secretKey)
FileStream fs = null; // исходный файл
FileStream rs = null; // результат
try
if (File.Exists(FileDest))
File.Delete(FileDest);
fs = new FileStream(FileRes, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
rs = new FileStream(FileDest, FileMode.CreateNew);
List Bt = new List();
Опять вы все не так поняли и ошибаетесь. Давайте все по порядку разложу 🙂 В Java var появился лишь в прошлом годy. Интересно что это за компании использующие win95? Да еще встречаются с XP но там поддержка framework 4.0 в SP3. Преобладающая часть компанию уже ушла от использования windows вообще, в сторону Linux. А по этому использовать этот пример в net Core так же возможно. Ошибку выдало вам потому что вы использовали не верный тип, полный код должен был выглядеть следующим образом.
public static string EncodeDecrypt(string str, ushort secretKey)
char[] ch = str.ToArray(); //преобразуем строку в символы
string newStr = ""; //переменная которая будет содержать зашифрованную строку
foreach (char c in ch) //выбираем каждый элемент из массива символов нашей строки
newStr += TopSecret(c, secretKey); //производим шифрование каждого отдельного элемента и сохраняем его в строку
return newStr;
>
Хорошо, используете вы XP SP1 кто мешает установить FW 3.5 на него? Ошибка явно не моя, а с вашей стороны, код приведенного примера верный, а знания языка программирования и его тонкостей для вставки кода никто не отменял, вам лишь надо было объявить явный тип, а для чего вы туда string пихать начали я не в курсе. Применения var никак не ухудшает его читаемость, так как тип образуется из создаваемого объекта. Не понимание var лишь свидетельствует о низком знания языка, и практики. 20 лет назад вместо него использовали object используйте его, но я сомневаюсь что это было легче.
IEnumerable query = from name in names where name.StartsWith("A") select (Initial: name[0], LastName: name.Split(' ')[1]);
Сильно вам тут помог явный тип в понимании кода?
Если файлы ваших пользователей содержат конфиденциальную информацию, вы можете зашифровать ее, чтобы никто не мог открыть этот файл, кроме самого пользователя. Шифрование ваших файлов затрудняет доступ к ним и чтение без вашего пароля. Если вам нравится тема шифрования в вашем проекте, в этой статье мы покажем вам, как легко шифровать и дешифровать файлы с помощью алгоритма AES.
Заметка
Эта статья показывает вам способ легко и быстро шифровать и дешифровать файлы, используя простые методы, такие как шифрование и дешифрование. Они являются результатом повторного сбора информации из разных источников, таких как Stack Overflow, Security Exchange и официальный сайт MSDN.
1. Импортируйте необходимые типы
Чтобы обработать алгоритм шифрования AES в вашем проекте для шифрования и дешифрования файлов, импортируйте 2 следующих обязательных типа:
Ссылка на InteropServices в верхней части вашего класса позволит вам позже использовать DllImport метод в нашем классе.
2. Создать методы шифрования и дешифрования
Вам нужно будет добавить следующие 3 метода в ваш класс (или создать их в новом классе, а затем импортировать их в свой):
- GenerateRandomSalt : этот метод создает случайную соль. Эта функция настраивается, и вы можете изменить ее, чтобы создать собственную соль, если вам нужно.
- FileEncrypt : этот метод шифрует существующий файл простым паролем.
- FileDecrypt : этот метод расшифровывает ранее зашифрованный файл с помощью метода FileEncrypt, используя простой пароль в качестве аргумента.
- ZeroMemory : этот метод будет использоваться для удаления пароля из памяти, что повышает безопасность шифрования. Это не обязательно, однако рекомендуется к использованию.
Метод будет использован и объяснен на шаге № 3, сейчас скопируйте и включите методы в ваш проект:
Они не обязательно идеальны, и их можно (и нужно) модифицировать для обработки большего количества исключений в случае их появления и того, как вы работаете с вашим приложением.
3. Использование методов
Из обязательных методов вам нужно будет использовать только 2 из них (FileEncrypt и FileDecrypt), очевидно, и 1 из них необязательный, четвертый (GenerateRandomSalt) используется внутренне FileEncrypt метод.
Зашифровать файл
FileEncrypt Метод сгенерирует файл в том же каталоге исходного файла с aes расширение (например, wordFileExample.doc ).
Расшифровать файл
Читайте также: