Вычисляет HMAC на алгоритме вычисления хэш ГОСТ Р 34.11-2012 512.
Пространство имен:
CryptoPro.SharpeiСборка: CryptoPro.Sharpei.Base (в CryptoPro.Sharpei.Base.dll)
Синтаксис
Visual Basic |
---|
<ComVisibleAttribute(True)> _ Public Class Gost3411_2012_512HMAC _ Inherits HMAC |
C# |
---|
[ComVisibleAttribute(true)] public class Gost3411_2012_512HMAC : HMAC |
Visual C++ |
---|
[ComVisibleAttribute(true)] public ref class Gost3411_2012_512HMAC : public HMAC |
JavaScript |
---|
CryptoPro.Sharpei.Gost3411_2012_512HMAC = function(); Type.createClass( 'CryptoPro.Sharpei.Gost3411_2012_512HMAC', HMAC); |
Примеры
Пример добавления HMAC в файл.
C# | Copy Code |
---|---|
// Copyright (C) 2006-2012 Крипто-Про. Все права защищены. // // Этот файл содержит информацию, являющуюся // собственностью компании Крипто-Про. // // Любая часть этого файла не может быть скопирована, // исправлена, переведена на другие языки, // локализована или модифицирована любым способом, // откомпилирована, передана по сети с или на // любую компьютерную систему без предварительного // заключения соглашения с компанией Крипто-Про. // // Программный код, содержащийся в этом файле, предназначен // исключительно для целей обучения и не может быть использован // для защиты информации. // // Компания Крипто-Про не несет никакой // ответственности за функционирование этого кода. // Пример вычисления HMAC на основе алгоритма ГОСТ Р 34.11-2012 512. using System; using System.IO; using CryptoPro.Sharpei; namespace Samples.Hash { class HMAC2012_512 { // Размер буфера для копирования. 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_512HMAC gostHmac = new Gost3411_2012_512HMAC(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_512HMAC gostHmac = new Gost3411_2012_512HMAC(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_512HMAC
HashAlgorithm
KeyedHashAlgorithm
HMAC
CryptoPro.Sharpei..::..Gost3411_2012_512HMAC
Потокобезопасность
Любые открытые члены этого типа, объявленные как static (Shared в Visual Basic), являются потокобезопасными. Потокобезопасность членов экземпляров не гарантирована.
Версии CSP:
КриптоПро CSP 2.0, КриптоПро CSP 3.6