Абстрактный базовый класс для всех реализаций ключа согласования.

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

Синтаксис

Visual Basic
<ComVisibleAttribute(True)> _
Public MustInherit Class GostSharedSecretAlgorithm _
	Implements IDisposable
C#
[ComVisibleAttribute(true)]
public abstract class GostSharedSecretAlgorithm : IDisposable
Visual C++
[ComVisibleAttribute(true)]
public ref class GostSharedSecretAlgorithm abstract : IDisposable
JavaScript
CryptoPro.Sharpei.GostSharedSecretAlgorithm = function();

Type.createClass(
	'CryptoPro.Sharpei.GostSharedSecretAlgorithm',
	null,
	IDisposable);

Заметки

Ключ согласования используется для шифрования/расшифрования симметричных ключей.

Примеры

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

' Пример шифрования файла с формированием ключа обмена
' при помощи создания Agree ключа.
'
' Данный пример
' 1.Создает текстовый файл test.txt.
' 2.Шифрует его на алгоритме ГОСТ Р 28147 на получателя,
' заданного сертификатом.
' 3.Сохраняет зашифрованный файл и зашифрованный сессионный 
' ключ в файле test.enc.
' 4.Расшифровывает файл и сохраняет расшифрованную информацию 
' в файле test.dec
'
' Для запуска примера необходимо иметь секретный ключ отправителя,
' секретный ключ получателя и соответствующий этому ключу сертификат.
'
' В командной строке примеру необходимо передать:
' 1.Имя контейнера секретного ключа отправителя,
' 2.Имя контейнера секретного ключа получателя,
' 3.Имя соответствующего сертификата получателя.

Imports System
'Imports System.Collections.Generic
Imports System.Text
Imports System.IO
Imports System.Security.Cryptography.X509Certificates
Imports System.Security.Cryptography
Imports System.Runtime.Serialization.Formatters.Binary

Imports CryptoPro.Sharpei

Class gEncryptFileAgree

    Shared Sub Main(ByVal args As String())

        ' Разбор командной строки
        If (args.Length < 2) Then

            Console.WriteLine(GetType(gEncryptFileAgree).FullName + "<source-container-name>" + _
                " <dest-container-name> <dest-certificate-file>")
            Return
        End If
        Dim SourceContainer As String = args(0)
        Dim DestContainer As String = args(1)
        Dim Certificate As String = args(2)

        ' Создаем тестовый файл
        CreateTestFile()
        ' Зашифровываем файл на открытом ключе из сертификата.
        EncryptTestFile(SourceContainer, Certificate)
        ' Расшифровываем файл и выврдим результат на экран.
        DecryptTestFile(DestContainer)
    End Sub

    ' Информация для шифрования.
    Private Shared SourceFileContent As String = _
            "This is a test file."

    ' Имя файла для шифрования.
    Private Shared SourceFileName As String = "test.txt"
    ' Имя зашифрованного файла.
    Private Shared EncryptedFileName As String = "test.enc"
    ' Имя расшифрованного файла.
    Private Shared DecryptedFileName As String = "test.dec"

    ' Создание тестового файла для шифрования.
    Shared Sub CreateTestFile()

        Dim sw As StreamWriter = New StreamWriter(SourceFileName)
        sw.Write(SourceFileContent)

        Console.WriteLine("Source file is:{0}", SourceFileContent)
    End Sub

    ' Зашифрование тестового файла.
    Shared Sub EncryptTestFile(ByVal SourceContainer As String, ByVal certFileName As String)

        ' Разбираем сертификат получателя
        Dim cert As X509Certificate2 = New X509Certificate2(certFileName)
        ' Открытый ключ получателя.
            dim pk as AsymmetricAlgorithm= cert.PublicKey.Key
        Dim alg As Gost3410 = CType(pk, Gost3410)
        If (alg Is Nothing) Then
            Throw New CryptographicException("Not a gost certificate")
        End If
        ' Создаем симметричный ключ.
        Dim symmetric As Gost28147 = Gost28147.Create()

        ' Открываем ключ отправителя.
        Dim par As CspParameters = New CspParameters(75, Nothing, SourceContainer)
        Dim srcContainer As Gost3410CryptoServiceProvider = New Gost3410CryptoServiceProvider(par)
        Dim srcPublicKeyParameters As Gost3410Parameters = srcContainer.ExportParameters(False)

        ' Создаем agree ключ
        Dim agree As GostSharedSecretAlgorithm = srcContainer.CreateAgree(alg.ExportParameters(false))

        ' Зашифровываем симметричный ключ на agree ключе.
        Dim WrappedKey As Byte() = agree.Wrap(symmetric, GostKeyWrapMethod.CryptoProKeyWrap)

        ' Создаем поток шифратора.
        Dim transform As ICryptoTransform = symmetric.CreateEncryptor()

        ' Создаем зашифрованный файл.
        Dim ofs As FileStream = New FileStream(EncryptedFileName, FileMode.Create)

        ' Записываем зашифрованный симметричный ключ.
        Dim formatter As BinaryFormatter = New BinaryFormatter()
        formatter.Serialize(ofs, WrappedKey)

        ' Записываем синхропосылку
        Dim bw As BinaryWriter = New BinaryWriter(ofs)
        bw.Write(symmetric.IV.Length)
        bw.Write(symmetric.IV)

        ' Передаем открытый ключ.
        formatter.Serialize(ofs, srcPublicKeyParameters)

        ' Создаем поток шифрования для записи в файл.
        Dim cs As CryptoStream = New CryptoStream(ofs, transform, CryptoStreamMode.Write)

        Dim data As Byte() = New Byte(4096) {}
        ' Открываем входной файл.
        Dim ifs As FileStream = New FileStream(SourceFileName, FileMode.Open, FileAccess.Read)

        ' и переписываем содержимое в выходной поток.
        Dim length As Integer = ifs.Read(data, 0, data.Length)

        While (length > 0)
            cs.Write(data, 0, length)
            length = ifs.Read(data, 0, data.Length)
        End While

    End Sub

    ' Расшифрование тестового файла.
    Shared Sub DecryptTestFile(ByVal DestContainer As String)

        ' Открываем ключ получателя.
        Dim par As CspParameters = New CspParameters(75, Nothing, DestContainer)
        Dim destCont As Gost3410CryptoServiceProvider = New Gost3410CryptoServiceProvider(par)

        ' Открываем зашифрованный файл.
        Dim ifs As FileStream = New FileStream(EncryptedFileName, FileMode.Open, FileAccess.Read)

        ' Читаем зашифрованный симметричный ключ.
        Dim formatter As BinaryFormatter = New BinaryFormatter()
        Dim cekLength = CType(formatter.Deserialize(ifs), Integer)
        Dim cek As Byte() = _
            CType(formatter.Deserialize(ifs), GostWrappedKey)

        Dim srcPublicKeyParameters As Gost3410Parameters = _
            CType(formatter.Deserialize(ifs), Gost3410Parameters)


        ' Читаем синхропосылку
        Dim iv As Byte()
        Dim br As BinaryReader = New BinaryReader(ifs)
        Dim ivLength As Integer = br.ReadInt32()
        iv = br.ReadBytes(ivLength)

        ' Читаем открытый ключ.
        Dim srcPublicKeyParameters As Gost3410Parameters = _
            CType(formatter.Deserialize(ifs), Gost3410Parameters)

        ' Создаем алгоритм отправителя и импортируем открытый ключ
        Dim src As Gost3410 = Gost3410.Create()
        src.ImportParameters(srcPublicKeyParameters)

        ' Создаем agree ключ
        Dim agree As GostSharedSecretAlgorithm = destCont.CreateAgree( _
            srcPublicKeyParameters)

        ' Расшифровываем симметричный ключ на agree
        Dim symmetric As SymmetricAlgorithm = agree.Unwrap(cek, _
            GostKeyWrapMethod.CryptoProKeyWrap)
        symmetric.IV = iv

        ' Создаем поток разшифрования.
        Dim transform As ICryptoTransform = symmetric.CreateDecryptor()

        ' Создаем поток разшифрования из файла.
        Dim cs As CryptoStream = New CryptoStream(ifs, transform, CryptoStreamMode.Read)

        ' Открываем расшифрованный файл
        Dim ofs As FileStream = New FileStream(DecryptedFileName, FileMode.Create)

        Dim data As Byte() = New Byte(4096) {}
        ' и переписываем содержимое в выходной поток.
        Dim length As Integer = cs.Read(data, 0, data.Length)

        While (length > 0)
            ofs.Write(data, 0, length)
            length = cs.Read(data, 0, data.Length)
        End While

    End Sub

End Class


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

System..::..Object
  CryptoPro.Sharpei..::..GostSharedSecretAlgorithm
    CryptoPro.Sharpei..::..GostSharedSecretCryptoServiceProvider

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

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

См. также: