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

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

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

Всем доброго времени суток! На просторах форума найдена реализация шифрования\дешифрования файла при помощи AES алгоритма
Листинг программы
  1. static void CryptFile(string fileIn, string fileOut, SymmetricAlgorithm algo, byte[] rgbKey, byte[] rgbIV)
  2. {
  3. if (string.IsNullOrEmpty(fileIn))
  4. throw new FileNotFoundException(string.Format("Неверный путь к файлу: {0}.", fileIn));
  5. if (!File.Exists(fileIn))
  6. throw new FileNotFoundException(string.Format("Файл '{0}' не найден.", fileIn));
  7. byte[] buff = null;
  8. const string CRYPT_EXT = ".crypt";
  9. using (var sa = algo)
  10. // Создаем поток для записи зашифрованных данных
  11. using (var fsw = File.Open(fileOut + CRYPT_EXT, FileMode.Create, FileAccess.Write))
  12. // Создаем крипто-поток для записи
  13. using (var cs = new CryptoStream(fsw,
  14. sa.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write)
  15. )
  16. {
  17. // Читаем исходный файл
  18. using (var fs = File.Open(fileIn, FileMode.Open, FileAccess.Read))
  19. {
  20. buff = new byte[fs.Length + sizeof(long)];
  21. // Читаем данные в буфер не с самого начала, а со смещением 8 байт
  22. fs.Read(buff, sizeof(long), buff.Length - sizeof(long));
  23. /* Записываем в первые 8 байт длину исходного файла
  24. * нужно это для того чтобы, после дешифровки не было
  25. * лишних данных
  26. */
  27. int i = 0;
  28. foreach (byte @byte in BitConverter.GetBytes(fs.Length))
  29. buff[i++] = @byte;
  30. }
  31. cs.Write(buff, 0, buff.Length);
  32. cs.Flush();
  33. }
  34. Array.Clear(rgbKey, 0, rgbKey.Length);
  35. Array.Clear(rgbIV, 0, rgbIV.Length);
  36. }
  37. static void DecryptFile(string fileIn, string fileOut, SymmetricAlgorithm algo, byte[] rgbKey, byte[] rgbIV)
  38. {
  39. if (string.IsNullOrEmpty(fileIn))
  40. throw new FileNotFoundException(string.Format("Неверный путь к файлу: {0}.", fileIn));
  41. if (!File.Exists(fileIn))
  42. throw new FileNotFoundException(string.Format("Файл '{0}' не найден.", fileIn));
  43. byte[] buff = null;
  44. const string DECRYPT_EXT = ".decrypt";
  45. using (var sa = algo)
  46. // Создаем поток для чтения шифрованных данных
  47. using (var fsr = File.Open(fileIn, FileMode.Open, FileAccess.Read))
  48. // Создаем крипто-поток для чтения
  49. using (var cs = new CryptoStream(fsr,
  50. sa.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Read)
  51. )
  52. {
  53. // Дешифруем исходный поток данных
  54. buff = new byte[fsr.Length];
  55. cs.Read(buff, 0, buff.Length);
  56. // Пишем дешифрованные данные
  57. using (var fsw = File.Open(fileOut + DECRYPT_EXT, FileMode.Create, FileAccess.Write))
  58. {
  59. // Читаем записанную длину исходного файла
  60. int len = (int)BitConverter.ToInt64(buff, 0);
  61. // Пишем только ту часть дешифрованных данных,
  62. // которая представляет исходный файл
  63. fsw.Write(buff, sizeof(long), len);
  64. fsw.Flush();
  65. }
  66. }
  67. Array.Clear(rgbKey, 0, rgbKey.Length);
  68. Array.Clear(rgbIV, 0, rgbIV.Length);
  69. }
В представленной реализации ключ хранится в файле. Подскажите можно ли и как реализовать хранение ключа в реестре windows. Сразу отвечу на вопрос "зачем хранить именно в реестре?" - в моем случае это единственный найденный мной способ наиболее безопасного хранения ключа. Пробовал писать в реестр уже из файла строковое значение
Листинг программы
  1. StreamReader sr = new StreamReader("key");
  2. string key = sr.ReadToEnd();
  3. sr.Close();
  4. Registry.SetValue(keyName, "key", key, RegistryValueKind.String);
В этом случае в реестре некоторые символы ключа заменяются псевдографикой и при чтении уже из реестра ключ получается некорректный. Подскажите есть ли возможность изменить представленный алгоритм что бы ключ сразу писался в реестр и читался оттуда же при расшифровке. Если нет то как полученный ключ записать и получить из реестра без искажения. Сам разобраться не смог, опыта в программировании мало (тем более в шифровании). Всем заранее спасибо!

Решение задачи: «Шифрование файла. Хранение ключа в реестре»

textual
Листинг программы
  1. byte[] buf = File.ReadAllBytes("key");
  2. Registry.SetValue(keyName, "key", buf, RegistryValueKind.Binary);

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут