Шифрование файла. Хранение ключа в реестре - 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);