/// <summary> /// Получить дешифрованные данные из потока файла MCDF. /// </summary> /// <param name="stream">Поток файла MCDF</param> /// <param name="diskKey">Ключ</param> /// <param name="diskTable">Таблица</param> /// <returns></returns> public static byte[] DecryptStream(CFStream stream, byte[] diskKey, byte[] diskTable) { int count = (int)stream.Size - 8; byte[] resData = stream.GetData(0, ref count); count = 8; byte[] synchro = stream.GetData(stream.Size - 8, ref count); resData = Mathdll.GostGamma(resData, diskKey, diskTable, synchro); return(resData); }
/// <summary> /// Поместить данные в указанный поток /// </summary> /// <param name="stream">Поток для загрузки данных</param> /// <param name="data">Данные, которые необходимо зашифровать и поместить</param> /// <param name="diskKey">Ключ</param> /// <param name="diskTable">Таблица</param> private static void SetDataToStream(CFStream stream, byte[] data, byte[] diskKey, byte[] diskTable) { // сгенеррировать синхропосылку byte[] synchroArr = GenerateSynchro(); // зашифровать данные byte[] cryptData = Mathdll.GostGamma(data, diskKey, diskTable, synchroArr); // создать буффер для объединения зашифрованных данных и синхропосылки byte[] buffer = new byte[data.Length + synchroArr.Length]; Array.Copy(cryptData, 0, buffer, 0, cryptData.Length); Array.Copy(synchroArr, 0, buffer, cryptData.Length, synchroArr.Length); // записать данные в поток stream.SetData(buffer); }
/// <summary> /// Добавить поток с указанными зашифрованными данными в указанный каталог файла MCDF. /// </summary> /// <param name="dir">Каталог, в который необходимо добавить поток</param> /// <param name="data">Данные в виде массива байт</param> /// <param name="diskKey">Ключ</param> /// <param name="diskTable">Таблица</param> /// <returns></returns> private static CFStream AddStream(CFStorage dir, byte[] data, byte[] diskKey, byte[] diskTable) { // сгенерировать синхропосылку byte[] synchroArr = GenerateSynchro(); byte[] imito; // зашифровать данные и получить от них хеш Mathdll.CryptData(diskKey, diskTable, synchroArr, ref data, out imito); // создать поток с именем, являющимся 16-тиричным представлением массива байт - imito CFStream stream = dir.AddStream(ReadKey.BinToHex(imito)); // создать бефер для объединения данных и синхропосылки byte[] buffer = new byte[data.Length + synchroArr.Length]; Array.Copy(data, 0, buffer, 0, data.Length); Array.Copy(synchroArr, 0, buffer, data.Length, synchroArr.Length); // записать данные в поток stream.SetData(buffer); // return(stream); }