Реализация алгоритма подписи по ГОСТ Р 34.10 через Cryptographic Service Provider (CSP). Этот класс не наследуется.

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

Синтаксис

Visual Basic
<ComVisibleAttribute(True)> _
Public NotInheritable Class Gost3410CryptoServiceProvider _
	Inherits Gost3410 _
	Implements ICspAsymmetricAlgorithm
C#
[ComVisibleAttribute(true)]
public sealed class Gost3410CryptoServiceProvider : Gost3410, 
	ICspAsymmetricAlgorithm
Visual C++
[ComVisibleAttribute(true)]
public ref class Gost3410CryptoServiceProvider sealed : public Gost3410, 
	ICspAsymmetricAlgorithm
JavaScript
CryptoPro.Sharpei.Gost3410CryptoServiceProvider = function();

Type.createClass(
	'CryptoPro.Sharpei.Gost3410CryptoServiceProvider',
	CryptoPro.Sharpei.Gost3410,
	ICspAsymmetricAlgorithm);

Заметки

Класс Gost3410CryptoServiceProvider используется для создания цифровой подписи, формирования общего секрета (Shared Secret). Алгоритм использует секретный ключ длиной 256, и открытый ключ длиной 512 бит.

Примеры

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

' Пример шифрования файла.
'
' Данный пример шифрует содержимое файла на алгоритме ГОСТ-28147
' со случайными ключом и синхропосылкой и сохраняет результат.
'
' В командной строке примеру необходимо передать имена входного
' и выходного файлов.

Imports System
Imports System.IO
Imports System.Security.Cryptography
Imports CryptoPro.Sharpei

Class Gost3410CSPSample

    Shared Sub Main(ByVal args() As String)

        If (args.Length < 2) Then
            Console.WriteLine(GetType(Gost3410CSPSample).FullName + " <in-file> <out-file>")
            Return
        End If
        ' Создаем потоки для входного и выходного файлов.
        Dim bin As Byte() = New Byte(100) {} 'Промежуточный буфер.
        Dim rdlen As Long = 0             'Общее число записанных байт.

        Dim fin As FileStream = New FileStream(args(0), FileMode.Open, FileAccess.Read)
        Dim fout As FileStream = New FileStream(args(1), FileMode.OpenOrCreate, FileAccess.Write)
        fout.SetLength(0)

        Dim totlen As Long = fin.Length    'Общий размер входного файла.
        Dim len As Integer                 'Число считанных за один раз байт.

        ' Создаем CSP, генерируем ключ и синхропосылку.
        Dim gost As Gost28147 = New Gost28147CryptoServiceProvider()
        gost.GenerateIV()
        gost.GenerateKey()

        ' Создаем криптопоток для записи
        Dim encStream As CryptoStream = New CryptoStream(fout, gost.CreateEncryptor(), _
                CryptoStreamMode.Write)

        Console.WriteLine("Шифрование...")

        'Читаем из входного файла, шифруем и пишем в выходной.
        Do While (rdlen < totlen)
            len = fin.Read(bin, 0, 100)
            encStream.Write(bin, 0, len)
            rdlen = rdlen + len
            Console.WriteLine("обработано {0} байтов", rdlen)
        Loop
        encStream.Close()
        fout.Close()
        fin.Close()
    End Sub

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

// Пример создания и проверки подписи.
//
// Данный пример подписывает значение хэш на алгоритме 
// ГОСТ Р 34.10-2001 на случайном ключе, проверяет правильность 
// подписи и выводит результат. 

using System;
using System.Security.Cryptography;

using CryptoPro.Sharpei;

namespace Samples.MySamples
{
    class Gost3410CSPSample
    {
        [STAThread]
        static void Main(string[] args)
        {
            try
            {
                //Создаем новый Гост-34.10 CSP.
                Gost3410CryptoServiceProvider Gost = new Gost3410CryptoServiceProvider();

                //32-х битное значение хэш для подписи.
                byte[] HashValue = { 59, 4, 248, 102, 77, 97, 142, 201, 
                                    210, 12, 224, 93, 25, 41, 100, 197, 
                                    213, 134,130, 135, 0, 0, 0, 0,
                                    0,0,0,0,0,0,0,0};

                //Подписываем значение хэш.
                byte[] SignedHashValue = GostSignHash(HashValue, Gost, "Gost3411");

                //Проверяем правильность подписи и выводим результат.
                bool b = GostVerifyHash(HashValue, SignedHashValue, Gost, "Gost3411");
                if (b)
                {
                    Console.WriteLine("Подпись вычислена верно.");
                }
                else
                {
                    Console.WriteLine("Подпись вычислена неверно.");
                }
            }
            catch (ArgumentNullException e)
            {
                Console.WriteLine(e.Message);
            }
        }

        static byte[] GostSignHash(byte[] HashToSign, Gost3410CryptoServiceProvider key, string HashAlg)
        {
            try
            {
                //Создаем форматтер подписи с закрытым ключом из переданного 
                //функции криптопровайдера.
                GostSignatureFormatter Formatter = new GostSignatureFormatter((Gost3410CryptoServiceProvider)key);

                //Устанавливаем хэш-алгоритм.
                Formatter.SetHashAlgorithm(HashAlg);

                //Создаем подпись для HashValue и возвращаем ее.
                return Formatter.CreateSignature(HashToSign);
            }
            catch (CryptographicException e)
            {
                Console.WriteLine(e.Message);
                return null;
            }
        }

        static bool GostVerifyHash(byte[] HashValue, byte[] SignedHashValue, AsymmetricAlgorithm key, string HashAlg)
        {
            try
            {
                //Создаем форматтер подписи с закрытым ключом из переданного 
                //функции криптопровайдера.
                GostSignatureDeformatter Deformatter = new GostSignatureDeformatter(key);

                //Устанавливаем хэш-алгоритм.
                Deformatter.SetHashAlgorithm(HashAlg);

                //Проверяем подпись и возвращаем результат. 
                return Deformatter.VerifySignature(HashValue, SignedHashValue);
            }
            catch (CryptographicException e)
            {
                Console.WriteLine(e.Message);
                return false;
            }
        }
    }
}

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

System..::..Object
  AsymmetricAlgorithm
    CryptoPro.Sharpei..::..Gost3410
      CryptoPro.Sharpei..::..Gost3410CryptoServiceProvider

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

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

Версии CSP:

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

См. также: