Вычисляет 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 | |
|---|---|
' 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# | |
|---|---|
// 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
HashAlgorithm
KeyedHashAlgorithm
HMAC
CryptoPro.Sharpei..::..Gost3411HMAC
Потокобезопасность
Любые открытые члены этого типа, объявленные как static (Shared в Visual Basic), являются потокобезопасными. Потокобезопасность членов экземпляров не гарантирована.
Версии CSP:
КриптоПро CSP 2.0, КриптоПро CSP 3.6