Абстрактный базовый класс для всех реализаций ключа согласования.
Пространство имен:
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 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
CryptoPro.Sharpei..::..GostSharedSecretAlgorithm
CryptoPro.Sharpei..::..GostSharedSecretCryptoServiceProvider
Потокобезопасность
Любые открытые члены этого типа, объявленные как static (Shared в Visual Basic), являются потокобезопасными. Потокобезопасность членов экземпляров не гарантирована.