Шифрование файла. Хранение ключа в реестре - C#

Узнай цену своей работы

Формулировка задачи:

Всем доброго времени суток! На просторах форума найдена реализация шифрования\дешифрования файла при помощи AES алгоритма
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);
        }
В представленной реализации ключ хранится в файле. Подскажите можно ли и как реализовать хранение ключа в реестре windows. Сразу отвечу на вопрос "зачем хранить именно в реестре?" - в моем случае это единственный найденный мной способ наиболее безопасного хранения ключа. Пробовал писать в реестр уже из файла строковое значение
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);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.667 из 5