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

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

Синтаксис

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

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

Примеры

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

' Пример вычисления HMAC на основе алгоритма ГОСТ Р 3411.

Imports System
Imports System.IO

Imports CryptoPro.Sharpei

Namespace Hash
    Class HMAC
        ' Размер буфера для копирования.
        Private Const BufferSize As Integer = 4096

        <STAThread()> _
        Shared Sub Main(ByVal args As String())

            ' Проверка корректности переданных параметров.
            If args.Length < 2 Then
                Console.WriteLine("Hash.HMAC <in-filename> <out-filename>")
                Return
            End If

            ' Создаем случайный ключ отправителя и получателя.
            Dim secretkey As Gost28147CryptoServiceProvider = _
                New Gost28147CryptoServiceProvider()

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

            ' На стороне получателя:
            ' Проверка подлинности сообщения.
            DecodeFile(secretkey, args(1))
        End Sub

        ' Для сообщения, содержащегося во входном файле вычисляется HMAC,
        ' этот HMAC и исходное сообщение записываются в выходной файл.
        Private Shared Sub EncodeFile(ByVal key As Gost28147, _
            ByVal sourceFile As String, ByVal destFile As String)

            ' Инициализируем объект для вычисления HMAC.
            Dim gostHmac As Gost3411HMAC = New Gost3411HMAC(key)

            ' Открываем файлы
            Dim inStream As FileStream = New FileStream(sourceFile, FileMode.Open)
            Dim outStream As FileStream = New FileStream(destFile, FileMode.Create)

            ' Вычисляем HMAC для входного файла.
            Dim hashValue As Byte() = gostHmac.ComputeHash(inStream)

            ' Записываем вычисленный HMAC в выходной поток.
            outStream.Write(hashValue, 0, hashValue.Length)
            ' Переустанавливаем указатель inStream в начало файла.
            inStream.Position = 0
            ' Копируем содержимое входного файла в выходной.
            Dim bytesRead As Integer

            ' Читаем по блоку.
            Dim buffer As Byte() = New Byte(BufferSize - 1) {}
            Do
                bytesRead = inStream.Read(buffer, 0, BufferSize)
                outStream.Write(Buffer, 0, bytesRead)
            Loop While bytesRead > 0

            ' Освобождаем ресурсы.
            gostHmac.Clear()

            ' Закрываем потоки
            inStream.Close()
            outStream.Close()
        End Sub

        ' Действия стороны получателя:
        ' Из файла считывается значение HMAC и само сообщение, для него повторно вычисляется 
        ' HMAC. Если он не совпал со считанным, сообщение изменено.
        Private Shared Function DecodeFile(ByVal key As Gost28147, ByVal sourceFile As String) _
            As Boolean

            ' Инициализируем объект для вычисления HMAC на заданном ключе.
            Dim gostHmac As Gost3411HMAC = New Gost3411HMAC(key)

            ' Буфер для HMAC, считанного из файла.
            Dim storedHash As Byte() = New Byte(gostHmac.HashSize / 8 - 1) {}
            ' Поток для чтения из входного файла.
            Dim inStream As FileStream = New FileStream(sourceFile, FileMode.Open)
            ' Считываем записанный HMAC.
            inStream.Read(storedHash, 0, storedHash.Length)
            ' Вычисляем реальное значение HMAC для содержимого файла
            ' (без хэша - указатель потока находится после него).
            Dim computedHash As Byte() = gostHmac.ComputeHash(inStream)
            ' Сравниваем вычисленный HMAC с записанным в файле
            For i As Integer = 0 To storedHash.Length - 1

                If computedHash(i) <> storedHash(i) Then

                    Console.WriteLine("HMAC отличается от исходного! Файл поврежден!")
                    Return False
                End If
            Next
            Console.WriteLine("Вычисленный HMAC совпадает с записанным в файле.")
            Return True
        End Function
    End Class
End Namespace
C# Copy imageCopy Code
// Copyright (C) 2006-2012 Крипто-Про. Все права защищены.
//
// Этот файл содержит информацию, являющуюся
// собственностью компании Крипто-Про.
// 
// Любая часть этого файла не может быть скопирована,
// исправлена, переведена на другие языки,
// локализована или модифицирована любым способом,
// откомпилирована, передана по сети с или на
// любую компьютерную систему без предварительного
// заключения соглашения с компанией Крипто-Про.
// 
// Программный код, содержащийся в этом файле, предназначен
// исключительно для целей обучения и не может быть использован
// для защиты информации.
// 
// Компания Крипто-Про не несет никакой
// ответственности за функционирование этого кода.

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

using System;
using System.IO;

using CryptoPro.Sharpei;

namespace Samples.Hash
{
    class HMAC
    {
        // Размер буфера для копирования.
        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.
            Gost3411HMAC gostHmac = new Gost3411HMAC(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 на заданном ключе.
            Gost3411HMAC gostHmac = new Gost3411HMAC(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..::..Gost3411HMAC

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

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

Версии CSP:

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

См. также: