Шифрование файла. Хранение ключа в реестре - C#
Формулировка задачи:
Всем доброго времени суток!
На просторах форума найдена реализация шифрования\дешифрования файла при помощи AES алгоритма
В представленной реализации ключ хранится в файле. Подскажите можно ли и как реализовать хранение ключа в реестре windows. Сразу отвечу на вопрос "зачем хранить именно в реестре?" - в моем случае это единственный найденный мной способ наиболее безопасного хранения ключа.
Пробовал писать в реестр уже из файла строковое значение
В этом случае в реестре некоторые символы ключа заменяются псевдографикой и при чтении уже из реестра ключ получается некорректный.
Подскажите есть ли возможность изменить представленный алгоритм что бы ключ сразу писался в реестр и читался оттуда же при расшифровке. Если нет то как полученный ключ записать и получить из реестра без искажения. Сам разобраться не смог, опыта в программировании мало (тем более в шифровании). Всем заранее спасибо!
Листинг программы
- static void CryptFile(string fileIn, string fileOut, SymmetricAlgorithm algo, byte[] rgbKey, byte[] rgbIV)
- {
- if (string.IsNullOrEmpty(fileIn))
- throw new FileNotFoundException(string.Format("Неверный путь к файлу: {0}.", fileIn));
- if (!File.Exists(fileIn))
- throw new FileNotFoundException(string.Format("Файл '{0}' не найден.", fileIn));
- byte[] buff = null;
- const string CRYPT_EXT = ".crypt";
- using (var sa = algo)
- // Создаем поток для записи зашифрованных данных
- using (var fsw = File.Open(fileOut + CRYPT_EXT, FileMode.Create, FileAccess.Write))
- // Создаем крипто-поток для записи
- using (var cs = new CryptoStream(fsw,
- sa.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write)
- )
- {
- // Читаем исходный файл
- using (var fs = File.Open(fileIn, FileMode.Open, FileAccess.Read))
- {
- buff = new byte[fs.Length + sizeof(long)];
- // Читаем данные в буфер не с самого начала, а со смещением 8 байт
- fs.Read(buff, sizeof(long), buff.Length - sizeof(long));
- /* Записываем в первые 8 байт длину исходного файла
- * нужно это для того чтобы, после дешифровки не было
- * лишних данных
- */
- int i = 0;
- foreach (byte @byte in BitConverter.GetBytes(fs.Length))
- buff[i++] = @byte;
- }
- cs.Write(buff, 0, buff.Length);
- cs.Flush();
- }
- Array.Clear(rgbKey, 0, rgbKey.Length);
- Array.Clear(rgbIV, 0, rgbIV.Length);
- }
- static void DecryptFile(string fileIn, string fileOut, SymmetricAlgorithm algo, byte[] rgbKey, byte[] rgbIV)
- {
- if (string.IsNullOrEmpty(fileIn))
- throw new FileNotFoundException(string.Format("Неверный путь к файлу: {0}.", fileIn));
- if (!File.Exists(fileIn))
- throw new FileNotFoundException(string.Format("Файл '{0}' не найден.", fileIn));
- byte[] buff = null;
- const string DECRYPT_EXT = ".decrypt";
- using (var sa = algo)
- // Создаем поток для чтения шифрованных данных
- using (var fsr = File.Open(fileIn, FileMode.Open, FileAccess.Read))
- // Создаем крипто-поток для чтения
- using (var cs = new CryptoStream(fsr,
- sa.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Read)
- )
- {
- // Дешифруем исходный поток данных
- buff = new byte[fsr.Length];
- cs.Read(buff, 0, buff.Length);
- // Пишем дешифрованные данные
- using (var fsw = File.Open(fileOut + DECRYPT_EXT, FileMode.Create, FileAccess.Write))
- {
- // Читаем записанную длину исходного файла
- int len = (int)BitConverter.ToInt64(buff, 0);
- // Пишем только ту часть дешифрованных данных,
- // которая представляет исходный файл
- fsw.Write(buff, sizeof(long), len);
- fsw.Flush();
- }
- }
- Array.Clear(rgbKey, 0, rgbKey.Length);
- Array.Clear(rgbIV, 0, rgbIV.Length);
- }
Листинг программы
- StreamReader sr = new StreamReader("key");
- string key = sr.ReadToEnd();
- sr.Close();
- Registry.SetValue(keyName, "key", key, RegistryValueKind.String);
Решение задачи: «Шифрование файла. Хранение ключа в реестре»
textual
Листинг программы
- byte[] buf = File.ReadAllBytes("key");
- Registry.SetValue(keyName, "key", buf, RegistryValueKind.Binary);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д