Как зашифровать файл c

Обновлено: 07.07.2024

  1. Хранить данную критическую информацию «зашитой» в исполняемый файл exe. Из плюсов – относительная надёжность хранения, ведь для получения доступа к этой информации из вне потребуется дизассемблировать/декомпилировать исполняемый файл, из минусов — необходимость постоянно перекомпилировать исполняемый файл при смене пароля в учетных записях и опять же хранение этих данных в открытом виде в исходном коде программы, где эта информация и может быть считана посторонним наблюдателем.
  2. Хранить информацию в настроечных файлах приложения, но при этом само приложение должно работать на сервере приложений с ограниченным доступом. Из плюсов – легкая настройка в случае изменения данных учетных записей, из минусов – легкий доступ к критической информации всем, кто может зайти на сервер приложений.
  3. Хранить информацию в настроечных файлах программы в зашифрованном виде. Из плюсов – легкая настройка приложения в случае изменения данных, программа может работать не только на сервере приложений, критически важная информация хранится в виде недоступном для постороннего наблюдателя. Из минусов – только необходимость модернизации ранее написанного ПО.

По совокупности плюсов и минусов выбираем третий вариант.

Теперь чуть –чуть теории. Что же такое шифрование и для чего оно нужно? Шифрование –это трансформация для ее сокрытия от не авторизованных лиц,

но в то же время с предоставлением определенным пользователям доступа к ней. Для правильного шифрования и расшифрования данных нужна секретная информация, используемая криптографическими алгоритмами (ключ) для дешифровки.

Выделяем основные способы шифрования

  • симметричное
  • асимметричное
  • хеширование

Симметричное шифрование это способ шифрования, в котором и для шифрования и расшифровывания используется один и тот же криптографический ключ

Асимметричное шифрование это способ при котором создаются два математически связанных ключа, один из которых передается открытым (доступных для всех) способом, а второй, приватный ключ — для расшифровывания

После краткой разминки для мозгов вернемся к нашей проблеме. Так как данные которые мы хотели шифровать должны быть обратимы после их зашифровывания, хеширование нам не подходит. Осталось определиться между симметричным и асимметричным алгоритмами шифрования. Так как ключ никуда передаваться не должен и будет использоваться одним пользователем, то нет и смыла усложнять исходный код наших программ алгоритмами создания и проверки пар ключей, используемых при асимметричном шифровании. Соответственно выбор пал на симметричное шифрование.

В итоге мы реализовали следующую схему. В динамически подключаемой библиотеке (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 ).

Расшифровать файл

Читайте также: