Вычисляет 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 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 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; } } } |
Иерархия наследования
Потокобезопасность
Любые открытые члены этого типа, объявленные как static (Shared в Visual Basic), являются потокобезопасными. Потокобезопасность членов экземпляров не гарантирована.
Версии CSP:
КриптоПро CSP 2.0, КриптоПро CSP 3.6