Зашифрованная для передачи ключевая информация.
Пространство имен:
CryptoPro.SharpeiСборка: CryptoPro.Sharpei.Base (в CryptoPro.Sharpei.Base.dll)
Синтаксис
| Visual Basic |
|---|
<SerializableAttribute> _ <ComVisibleAttribute(True)> _ Public Structure GostKeyTransport |
| C# |
|---|
[SerializableAttribute] [ComVisibleAttribute(true)] public struct GostKeyTransport |
| Visual C++ |
|---|
[SerializableAttribute] [ComVisibleAttribute(true)] public value class GostKeyTransport |
| JavaScript |
|---|
|
Заметки
Синхропосылка не входит в класс GostKeyTransport и должна
передаваться отдельно.
Примеры
Пример использования
класса GostKeyTransport для передачи ключевой информации.
| Visual Basic | |
|---|---|
' Copyright (C) 2006-2012 Крипто-Про. Все права защищены.
'
' Этот файл содержит информацию, являющуюся
' собственностью компании Крипто Про.
'
' Любая часть этого файла не может быть скопирована,
' исправлена, переведена на другие языки,
' локализована или модифицирована любым способом,
' откомпилирована, передана по сети с или на
' любую компьютерную систему без предварительного
' заключения соглашения с компанией Крипто Про.
'
' Программный код, содержащийся в этом файле, предназначен
' исключительно для целей обучения и не может быть использован
' для защиты информации.
'
' Компания Крипто-Про не несет никакой
' ответственности за функционирование этого кода.
' Пример передачи сессионного ключа.
'
' Данный пример:
' 1. Создает случайный ключ получателя.
' 2. Создает случайный сессионный симметричный ключ.
' 3. Шифрует на сессионном ключе сообщение.
' 4. Шифрует сессионный ключ на ключе получателя.
' 5. Расшифровывает сессионный ключ и сообщение.
Imports System
Imports System.IO
Imports System.Security.Cryptography
Imports CryptoPro.Sharpei
Class KeyExchange
Shared Sub Main()
Try
' Создаем объект шифрования со сгенерированным ключом и синхропосылкой.
Dim gost As Gost28147 = Gost28147.Create()
' Строка для шифрования.
Dim Data As String = "Here is some data to encrypt."
Dim FileName As String = "Test.txt"
' Шифруем текст и сохраняем в файле.
EncryptTextToFile(Data, FileName, gost)
'Расшифровываем текст файла.
Dim result As String = DecryptTextFromFile(FileName, gost)
Console.WriteLine(result)
Console.ReadLine()
Catch e As Exception
Console.WriteLine(e.Message)
End Try
End Sub
Shared Sub EncryptTextToFile(ByVal Data As String, _
ByVal FileName As String, ByVal gost As Gost28147)
Try
' Открываем или создаем файл.
Dim fStream As FileStream = File.Open(FileName, FileMode.OpenOrCreate)
' Создаем CryptoStream, используя FileStream,
' переданный ключ и синхропосылку (IV).
Dim cStream As CryptoStream = New CryptoStream(fStream, _
gost.CreateEncryptor(), CryptoStreamMode.Write)
' Создаем StreamWriter, используя CryptoStream.
Dim sWriter As StreamWriter = New StreamWriter(cStream)
' Пишем данные в поток, зашифровая их.
sWriter.WriteLine(Data)
' Закрываем все потоки.
sWriter.Close()
cStream.Close()
fStream.Close()
Catch e As CryptographicException
Console.WriteLine("A Cryptographic error occurred: {0}", e.Message)
Catch e As UnauthorizedAccessException
Console.WriteLine("A file error occurred: {0}", e.Message)
End Try
End Sub
Shared Function DecryptTextFromFile(ByVal FileName As String, _
ByVal gost As Gost28147) As String
Try
' Открываем файл.
Dim fStream As FileStream = File.Open(FileName, FileMode.Open)
' Создаем CryptoStream, используя FileStream,
' переданный ключ и синхропосылку (IV).
Dim cStream As CryptoStream = New CryptoStream(fStream, _
gost.CreateDecryptor(), CryptoStreamMode.Read)
' Создаем StreamWriter, используя CryptoStream.
Dim sReader As StreamReader = New StreamReader(cStream)
' Считываем данные из потока, расшифровывая их.
Dim val As String = sReader.ReadLine()
' Закрываем все потоки.
sReader.Close()
cStream.Close()
fStream.Close()
Return val
Catch e As CryptographicException
Console.WriteLine("A Cryptographic error occurred: {0}", e.Message)
Return Nothing
Catch e As UnauthorizedAccessException
Console.WriteLine("A file error occurred: {0}", e.Message)
Return Nothing
End Try
End Function
End Class
| |
| C# | |
|---|---|
// Copyright (C) 2006-2012 Крипто-Про. Все права защищены.
//
// Этот файл содержит информацию, являющуюся
// собственностью компании Крипто-Про.
//
// Любая часть этого файла не может быть скопирована,
// исправлена, переведена на другие языки,
// локализована или модифицирована любым способом,
// откомпилирована, передана по сети с или на
// любую компьютерную систему без предварительного
// заключения соглашения с компанией Крипто-Про.
//
// Программный код, содержащийся в этом файле, предназначен
// исключительно для целей обучения и не может быть использован
// для защиты информации.
//
// Компания Крипто-Про не несет никакой
// ответственности за функционирование этого кода.
// Пример передачи сессионного ключа.
//
// Данный пример:
// 1. Создает случайный ключ получателя.
// 2. Создает случайный сессионный симметричный ключ.
// 3. Шифрует на сессионном ключе сообщение.
// 4. Шифрует сессионный ключ на ключе получателя.
// 5. Расшифровывает сессионный ключ и сообщение.
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Security.Cryptography;
using CryptoPro.Sharpei;
namespace Samples.MySamples
{
class KeyExchange
{
// Ассиметричный ключ получателя.
private Gost3410 AssymKey;
// Синхропосылка.
private byte[] IV;
[STAThread]
static void Main(string[] args)
{
// Создаем случайный открытый ключ.
KeyExchange GostKeyExchange = new KeyExchange();
Gost3410 gkey = new Gost3410CryptoServiceProvider();
GostKeyExchange.InitializeKey(gkey);
// Создаем случайный секретный ключ, который необходимо передать.
Gost28147 key = new Gost28147CryptoServiceProvider();
// Синхропосылка не входит в GostKeyTransport и должна
// передаваться отдельно.
GostKeyExchange.IV = key.IV;
// Создаем форматтер, шифрующий на ассиметричном ключе получателя.
GostKeyExchangeFormatter Formatter = new GostKeyExchangeFormatter(GostKeyExchange.AssymKey);
// GostKeyTransport - формат зашифрованной для безопасной передачи
// ключевой информации.
GostKeyTransport encKey = Formatter.CreateKeyExchange(key);
// Шифруемая строка
string message = "012345678901234567890";
byte[] sourceBytes = Encoding.ASCII.GetBytes(message);
Console.WriteLine("** Строка до шифрования: " + message);
// Шифруем строку на сессионном ключе
byte[] encBytes = GostKeyExchange.GostEncrypt(key, sourceBytes);
Console.WriteLine("** Строка после шифрования: " +
Encoding.ASCII.GetString(encBytes));
// Получатель расшифровывает GostKeyTransport и само сообщение.
byte[] decBytes = GostKeyExchange.GostDecrypt(encKey, encBytes);
Console.WriteLine("** Строка после расшифрования: " +
Encoding.ASCII.GetString(decBytes));
Console.ReadLine();
}
// Создаем ключ получателя.
private void InitializeKey(Gost3410 gkey)
{
AssymKey = gkey;
}
// Шифруем байтовый массив
byte[] GostEncrypt(Gost28147 key, byte[] sourceBytes)
{
int currentPosition = 0;
byte[] targetBytes = new byte[1024];
int sourceByteLength = sourceBytes.Length;
// Создаем шифратор для ГОСТ.
CPCryptoAPITransform cryptoTransform = (CPCryptoAPITransform)key.CreateEncryptor();
// Размер блока считанных байт.
int inputBlockSize = cryptoTransform.InputBlockSize;
// Размер выходного блока.
int outputBlockSize = cryptoTransform.OutputBlockSize;
try
{
// Если возможна обработка нескольких блоков:
if (cryptoTransform.CanTransformMultipleBlocks)
{
int numBytesRead = 0;
while (sourceByteLength - currentPosition >= inputBlockSize)
{
// Преобразуем байты начиная с currentPosition в массиве
// sourceBytes, записывая результат в массив targetBytes.
numBytesRead = cryptoTransform.TransformBlock(
sourceBytes, currentPosition,
inputBlockSize, targetBytes,
currentPosition);
currentPosition += numBytesRead;
}
// Преобразуем последний блок.
byte[] finalBytes = cryptoTransform.TransformFinalBlock(
sourceBytes, currentPosition,
sourceByteLength - currentPosition);
// Записываем последний зашифрованный блок
// в массив targetBytes.
finalBytes.CopyTo(targetBytes, currentPosition);
}
}
catch (Exception ex)
{
Console.WriteLine("Caught unexpected exception:" + ex.ToString());
}
// Определяем, может ли CPCryptoAPITransform использоваться повторно.
if (!cryptoTransform.CanReuseTransform)
{
// Освобождаем занятые ресурсы.
cryptoTransform.Clear();
}
// Убираем неиспользуемые байты из массива.
return TrimArray(targetBytes);
}
// Действия получателя - расшифровываем полученные сессионный ключ и сообщение.
byte[] GostDecrypt(GostKeyTransport encKey, byte[] encBytes)
{
// Деформаттер для ключей, зашифрованных на ассиметричном ключе получателя.
GostKeyExchangeDeformatter Deformatter = new GostKeyExchangeDeformatter(AssymKey);
// Получаем ГОСТ-овый ключ из GostKeyTransport.
Gost28147 key = (Gost28147)Deformatter.DecryptKeyExchange(encKey);
// Устанавливаем синхропосылку.
key.IV = IV;
byte[] targetBytes = new byte[1024];
int currentPosition = 0;
// Создаем дешифратор для ГОСТ.
CPCryptoAPITransform cryptoTransform =
(CPCryptoAPITransform)key.CreateDecryptor();
int inputBlockSize = cryptoTransform.InputBlockSize;
int sourceByteLength = encBytes.Length;
try
{
int numBytesRead = 0;
while (sourceByteLength - currentPosition >= inputBlockSize)
{
// Преобразуем байты начиная с currentPosition в массиве
// sourceBytes, записывая результат в массив targetBytes.
numBytesRead = cryptoTransform.TransformBlock(
encBytes,
currentPosition,
inputBlockSize,
targetBytes,
currentPosition);
currentPosition += numBytesRead;
}
// Преобразуем последний блок.
byte[] finalBytes = cryptoTransform.TransformFinalBlock(
encBytes,
currentPosition,
sourceByteLength - currentPosition);
// Записываем последний расшифрованный блок
// в массив targetBytes.
finalBytes.CopyTo(targetBytes, currentPosition);
}
catch (Exception ex)
{
Console.WriteLine("Caught unexpected exception:" + ex.ToString());
}
// Убираем неиспользуемые байты из массива.
return TrimArray(targetBytes);
}
private static byte[] TrimArray(byte[] targetArray)
{
IEnumerator enum1 = targetArray.GetEnumerator();
int i = 0;
while (enum1.MoveNext())
{
if (enum1.Current.ToString().Equals("0"))
{
break;
}
i++;
}
// Создаем новый массив нужного размера.
byte[] returnedArray = new byte[i];
for (int j = 0; j < i; j++)
{
returnedArray[j] = targetArray[j];
}
return returnedArray;
}
}
}
| |
Потокобезопасность
Любые открытые члены этого типа, объявленные как static (Shared в Visual Basic), являются потокобезопасными. Потокобезопасность членов экземпляров не гарантирована.