Вычисляет HMAC на алгоритме вычисления хэш ГОСТ Р 34.11-2012 256.

Пространство имен:  CryptoPro.Sharpei
Сборка:  CryptoPro.Sharpei.Base (в CryptoPro.Sharpei.Base.dll)

Синтаксис

Visual Basic
<ComVisibleAttribute(True)> _
Public Class Gost3411_2012_256HMAC _
	Inherits HMAC
C#
[ComVisibleAttribute(true)]
public class Gost3411_2012_256HMAC : HMAC
Visual C++
[ComVisibleAttribute(true)]
public ref class Gost3411_2012_256HMAC : public HMAC
JavaScript
CryptoPro.Sharpei.Gost3411_2012_256HMAC = function();

Type.createClass(
	'CryptoPro.Sharpei.Gost3411_2012_256HMAC',
	HMAC);

Примеры

Пример добавления HMAC в файл.
C# Copy imageCopy Code
// Copyright (C) 2006-2012 Крипто-Про. Все права защищены.
//
// Этот файл содержит информацию, являющуюся
// собственностью компании Крипто-Про.
// 
// Любая часть этого файла не может быть скопирована,
// исправлена, переведена на другие языки,
// локализована или модифицирована любым способом,
// откомпилирована, передана по сети с или на
// любую компьютерную систему без предварительного
// заключения соглашения с компанией Крипто-Про.
// 
// Программный код, содержащийся в этом файле, предназначен
// исключительно для целей обучения и не может быть использован
// для защиты информации.
// 
// Компания Крипто-Про не несет никакой
// ответственности за функционирование этого кода.

// Пример вычисления HMAC на основе алгоритма ГОСТ Р 34.11-2012 256.

using System;
using System.IO;

using CryptoPro.Sharpei;

namespace Samples.Hash
{
    class HMAC2012_256
    {
        // Размер буфера для копирования.
        private const int BufferSize = 4096;

        [STAThread]
        static void Main(string[] args)
        {
            // Проверка корректности переданных параметров.
            if (args.Length < 2)
            {
                Console.WriteLine("Hash.HMAC <in-filename> <out-filename>");
                return;
            }

            // Создаем случайный ключ отправителя и получателя.
            Gost28147CryptoServiceProvider secretkey = 
                new Gost28147CryptoServiceProvider();

            // На стороне отправителя:
            // Чтение входной информации и запись прочитанных данных
            // с контролем HMAC.
            EncodeFile(secretkey, args[0], args[1]);

            // На стороне получателя:
            // Проверка подлинности сообщения.
            DecodeFile(secretkey, args[1]);
        }  

        // Для сообщения, содержащегося во входном файле вычисляется HMAC,
        // этот HMAC и исходное сообщение записываются в выходной файл.
        private static void EncodeFile(Gost28147 key, 
            String sourceFile, String destFile)
        {
            // Инициализируем объект для вычисления HMAC.
            Gost3411_2012_256HMAC gostHmac = new Gost3411_2012_256HMAC(key);

            // Открываем файлы
            FileStream inStream = new FileStream(sourceFile, FileMode.Open);
            FileStream outStream = new FileStream(destFile, FileMode.Create);

            // Вычисляем HMAC для входного файла.
            byte[] hashValue = gostHmac.ComputeHash(inStream);

            // Записываем вычисленный HMAC в выходной поток.
            outStream.Write(hashValue, 0, hashValue.Length);
            // Переустанавливаем указатель inStream в начало файла.
            inStream.Position = 0;
            // Копируем содержимое входного файла в выходной.
            int bytesRead;
            // Читаем по блоку.
            byte[] buffer = new byte[BufferSize];
            do
            {
                bytesRead = inStream.Read(buffer, 0, BufferSize);
                outStream.Write(buffer, 0, bytesRead);
            } while (bytesRead > 0);
            // Освобождаем ресурсы.
            gostHmac.Clear();

            // Закрываем потоки
            inStream.Close();
            outStream.Close();
        } 

        // Действия стороны получателя:
        // Из файла считывается значение HMAC и само сообщение, для него повторно вычисляется 
        // HMAC. Если он не совпал со считанным, сообщение изменено.
        private static bool DecodeFile(Gost28147 key, String sourceFile)
        {
            // Инициализируем объект для вычисления HMAC на заданном ключе.
            Gost3411_2012_256HMAC gostHmac = new Gost3411_2012_256HMAC(key);

            // Буфер для HMAC, считанного из файла.
            byte[] storedHash = new byte[gostHmac.HashSize / 8];
            // Поток для чтения из входного файла.
            FileStream inStream = new FileStream(sourceFile, FileMode.Open);
            // Считываем записанный HMAC.
            inStream.Read(storedHash, 0, storedHash.Length);
            // Вычисляем реальное значение HMAC для содержимого файла
            // (без хэша - указатель потока находится после него).
            byte[] computedHash = gostHmac.ComputeHash(inStream);
            // Сравниваем вычисленный HMAC с записанным в файле
            for (int i = 0; i < storedHash.Length; i++)
            {
                if (computedHash[i] != storedHash[i])
                {
                    Console.WriteLine("HMAC отличается от исходного! Файл поврежден!");
                    return false;
                }
            }
            Console.WriteLine("Вычисленный HMAC совпадает с записанным в файле.");
            return true;
        } 
    }
}

Иерархия наследования

System..::..Object
  HashAlgorithm
    KeyedHashAlgorithm
      HMAC
        CryptoPro.Sharpei..::..Gost3411_2012_256HMAC

Потокобезопасность

Любые открытые члены этого типа, объявленные как static (Shared в Visual Basic), являются потокобезопасными. Потокобезопасность членов экземпляров не гарантирована.

Версии CSP:

КриптоПро CSP 2.0, КриптоПро CSP 3.6

См. также: