Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
 /// <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);
 }
Beispiel #3
0
        /// <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);
        }