/// <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); }