Классы для формирования и проверки цифровой подписи — КиберПедия 

Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...

Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...

Классы для формирования и проверки цифровой подписи

2020-04-01 66
Классы для формирования и проверки цифровой подписи 0.00 из 5.00 0 оценок
Заказать работу

 

В Microsoft.NET Framework 2.0 существуют специализированные классы, осуществляющие автоматическое формирование подписанного документа. Для формирования подписи служат классы, наследованные от класса Asymmetric SignatureFormatter. Для проверки цифровой подписи используются классы, наследованные от класса AsymmetricSignatureDeformatter.

В версии Microsoft.NET Framework 2.0 реализованы два класса для формирования цифровой подписи:

• DSASignatureFormatter,

•   RSAPKCS1SignatureFormatter;

и два класса для проверки цифровой подписи:

• DSASignatureDeformatter,

•   RSAPKCS1SignatureDeformatter.

Подпись формируется в формате PKCS#1 версии 1.5.

Программист может добавить свои собственные классы для формирования и проверки цифровой подписи для любого криптографического алгоритма. Для этого необходимо наследовать класс формирования цифровой подписи от класса AsymmetricSignatureFormatter, а класс проверки цифровой подписи от класса AsymmetricSignatureDeformatter соответственно.

Для формирования цифровой подписи с использованием класса RSAPKCS1 SignatureFormatter необходимо:

)Создать экземпляр класса RSAPKCS1SignatureFormatter.

Определить секретный ключ для формирования подписи можно передав в качестве параметра конструктора объект, представляющий алгоритм RSA, который содержит секретный ключ, или передав объект в метод SetKey.

) Задать алгоритм вычисления значения хеша.

Это можно сделать с помощью метода SetHashAlgorithm. В качестве параметра он принимает название алгоритма. Например: “SHA1”.

)Сформировать подпись.

Для этого используется метод CreateSignature. В качестве параметра передается значение хеша подписываемых данных.

Для проверки подписи необходимо:

)Создать экземпляр класса RSAPKCS1SignatureDeformatter.

Задать открытый ключ для проверки подписи можно аналогично заданию ключа для класса RSAPKCS1SignatureFormatter.

) Задать алгоритм вычисления значения хеша.

) Проверить подпись.

Для этой цели используется метод VerifySignature. В качестве параметров задается значение хеша документа и подпись значения хеша.


Примеры

 

Симметричное шифрование.

В примере кода для зашифрования файла, заданного строкой inName, используется класс RijndaelManaged с заданным свойством Key и вектором инициализации (IV), а результат зашифрования выводится в файл, заданный строкой outName. Параметры desKey и desIV, передаваемые в данный метод, представляют собой 8-байтовые массивы. Для выполнения этого примера необходимо наличие установленного пакета стойкого шифрования.

Язык Visual C++

 

void EncryptData(String^ inName, String^ outName, array<Byte>^rijnKey, array<Byte>^rijnIV)

{

//Create the file streams to handle the input and output files.^ fin = gcnew FileStream(inName,FileMode::Open,FileAccess::Read);^ fout = gcnew FileStream(outName,FileMode::OpenOrCreate,FileAccess::Write);>SetLength(0);

//Create variables to help with read and write.<Byte>^bin = gcnew array<Byte>(100);rdlen = 0; //This is the total number of bytes written.totlen = (long)fin->Length; //This is the total length of the input file.len; //This is the number of bytes to be written at a time.^ rijn = SymmetricAlgorithm::Create(); //Creates the default implementation, which is RijndaelManaged. ^ encStream = gcnew CryptoStream(fout,rijn->CreateEncryptor(rijnKey, rijnIV),CryptoStreamMode::Write);::WriteLine("Encrypting...");

//Read from the input file, then encrypt and write to the output file.(rdlen < totlen)

{= fin->Read(bin, 0, 100);>Write(bin, 0, len);= rdlen + len;::WriteLine("{0} bytes processed", rdlen);

}>Close();>Close();>Close();

}

 

Асимметричное шифрование

В примере кода показано, как реализовать пользовательский алгоритм асимметричного шифрования, наследуемый от класса AsymmetricAlgorithm. Для демонстрации порядка использования пользовательского класса приведен дополнительный класс.

Язык Visual C++

 

#using <System.Xml.dll>

#using <System.Security.dll>namespace System;namespace System::Xml;namespace System::Text;namespace System::Security::Cryptography;namespace System::Reflection;

[assembly: AssemblyKeyFile("CustomCrypto.snk")];

[assembly: AssemblyVersion("1.0.0.0")];

[assembly: CLSCompliant(true)];Contoso

{

// Define a CustomCrypto class that inherits from the AsymmetricAlgorithm

// class.ref class CustomCrypto:System::Security::Cryptography::AsymmetricAlgorithm

{

// Declare local member variables.:^ cryptoServiceParameters;<KeySizes^>^ customValidKeySizes;

// Initialize a CustomCrypto with the default key size of 8.:()

{= array<KeySizes^>{gcnew KeySizes(8, 64, 8)};>KeySize = 8;

}

// Initialize a CustomCrypto with the specified key size.:(int keySize)

{= array<KeySizes^>{gcnew KeySizes(8, 64, 8)};>KeySize = keySize;

}

// Accessor function for keySizes member variable.:array<KeySizes^>^ LegalKeySizes

{array<KeySizes^>^ get() override

{(array<KeySizes^>^)customValidKeySizes->Clone();

}

}

// Modify the KeySizeValue property inherited from the Asymmetric

// class. Prior to setting the value, ensure it falls within the

// range identified in the local keySizes member variable.:int KeySize

{int get() override

{KeySizeValue;

}void set(int value) override

{(int i = 0; i < customValidKeySizes->Length; i++)

{(customValidKeySizes[i]->SkipSize == 0)

{(customValidKeySizes[i]->MinSize == value)

{= value;;

}

}

{(int j = customValidKeySizes[i]->MinSize;<= customValidKeySizes[i]->MaxSize;+= customValidKeySizes[i]->SkipSize)

{(j == value)

{= value;;

}

}

}

}

// If the key does not fall within the range identified

// in the keySizes member variable, throw an exception.gcnew CryptographicException("Invalid key size.");

}

}

// Initialize the parameters with default values.:InitializeParameters()

{= gcnew CspParameters();>ProviderName = "Contoso";>KeyContainerName = "SecurityBin1";>KeyNumber = 1;>ProviderType = 2;

}

// Parse specified xmlString for values to populate the CspParams

// Expected XML schema:

// <CustomCryptoKeyValue>

// <ProviderName></ProviderName>

// <KeyContainerName></KeyContainerName>

// <KeyNumber></KeyNumber>

// <ProviderType></ProviderType>

// </CustomCryptoKeyValue>:void FromXmlString(String^ xmlString) override

{(xmlString!= nullptr)

{^ document = gcnew XmlDocument();>LoadXml(xmlString);^ firstNode = document->FirstChild;^ nodeList;

// Assemble parameters from values in each XML element.= gcnew CspParameters();

// KeyContainerName is optional.= >GetElementsByTagName("KeyContainerName");(nodeList->Count > 0)

{>KeyContainerName =>Item(0)->InnerText;

}

// KeyNumber is optional.= document->GetElementsByTagName("KeyNumber");(nodeList->Count > 0)

{>KeyNumber =::Parse(nodeList->Item(0)->InnerText);

}

// ProviderName is optional.= document->GetElementsByTagName("ProviderName");(nodeList->Count > 0)

{>ProviderName =>Item(0)->InnerText;

}

// ProviderType is optional.= document->GetElementsByTagName("ProviderType");(nodeList->Count > 0)

{>ProviderType =::Parse(nodeList->Item(0)->InnerText);

}

}

{gcnew ArgumentNullException("xmlString");

}

}

// Create an XML string representation of the parameters in the

// current customCrypto object.:String^ ToXmlString(bool includePrivateParameters) override

{^ keyContainerName = "";^ keyNumber = "";^ providerName = "";^ providerType = "";(cryptoServiceParameters!= nullptr)

{= >KeyContainerName;= cryptoServiceParameters->KeyNumber.ToString();= cryptoServiceParameters->ProviderName;= >ProviderType.ToString();

}^ sb = gcnew StringBuilder();>Append("<CustomCryptoKeyValue>");>Append("<KeyContainerName>");>Append(keyContainerName);>Append("</KeyContainerName>");>Append("<KeyNumber>");>Append(keyNumber);>Append("</KeyNumber>");>Append("<ProviderName>");>Append(providerName);>Append("</ProviderName>");>Append("<ProviderType>");>Append(providerType);>Append("</ProviderType>");>Append("</CustomCryptoKeyValue>");(sb->ToString());

}

// Return the name for the key exchange algorithm.:String^ KeyExchangeAlgorithm

{String^ get() override

{"RSA-PKCS1-KeyEx";

}

}

// Retrieves the name of the signature alogrithm.:String^ SignatureAlgorithm

{String^ get() override

{"http://www.w3.org/2000/09/xmldsig#rsa-sha1";

}

}

// Required member for implementing the AsymmetricAlgorithm class.:~CustomCrypto()

{

}

// Call the Create method using the CustomCrypto assembly name.

// The create function attempts to create a CustomCrypto

// object using the assembly name. This functionality requires

// modification of the machine.config file. Add the following

// section to the configuration element and modify the values

// of the cryptoClass to reflect what isinstalled

// in your machines GAC.

//<mscorlib>

// <cryptographySettings>

// <cryptoNameMapping>

// <cryptoClasses>

// <cryptoClass CustomCrypto="Contoso.CustomCrypto,

// CustomCrypto,

// Culture=neutral,

// PublicKeyToken=fdb9f9c4851028bf,

// Version=1.0.1448.27640" />

// </cryptoClasses>

// <nameEntry name="Contoso.CustomCrypto"

// class="CustomCrypto" />

// <nameEntry name="CustomCrypto" class="CustomCrypto" />

// </cryptoNameMapping>

// </cryptographySettings>

//</mscorlib>:CustomCrypto^ Create()

{Create("CustomCrypto");

}

// Create a CustomCrypto object by calling CrytoConfig's

// CreateFromName method and casting the type to CustomCrypto.

// The create function attempts to create a CustomCrypto object

// using the assembly name. This functionality requires

// modification of the machine.config file. Add the following

// section to the configuration element and modify the values

// of the cryptoClass to reflect what is installed

// in your machines GAC.

//<mscorlib>

// <cryptographySettings>

// <cryptoNameMapping>

// <cryptoClasses>

// <cryptoClass CustomCrypto="Contoso.CustomCrypto,

// CustomCrypto,

// Culture=neutral,

// PublicKeyToken=fdb9f9c4851028bf,

// Version=1.0.1448.27640" />

// </cryptoClasses>

// <nameEntry name="Contoso.CustomCrypto"

// class="CustomCrypto" />

// <nameEntry name="CustomCrypto" class="CustomCrypto" />

// </cryptoNameMapping>

// </cryptographySettings>

//</mscorlib>:CustomCrypto^ Create(String^ algorithmName)

{(CustomCrypto^)::CreateFromName(algorithmName);

}

};

}

 

Хэширование

В следующем примере кода показано, как вычислить хэш SHA1CryptoServiceProvider для массива. В этом примере предполагается существование предварительно определенного массива байтов dataArray[]. SHA1CryptoServiceProvider является производным классом HashAlgorithm.

Язык Visual C++

 

HashAlgorithm^ sha = gcnew SHA1CryptoServiceProvider;

array<Byte>^ result = sha->ComputeHash(dataArray);


Заключение

класс криптографический framework шифрование

В данной работе были рассмотрены криптографические средства Microsoft.NET. Проведен обзор основных криптографических классов библиотеки Framework Class Libr, пространства имен System.Security.Cryptographу, изучена иерархия классов, реализующих различные криптографические алгоритмы. Основное внимание было направлено на три основных разновидности криптографических классов:

- Симметричные алгоритмы шифрования

-   Асимметричные алгоритмы шифрования

    Алгоритмы вычисления значения хеша данных

Проведен обзор основных алгоритмов шифрования, их свойства и методы, использующиеся в среде.NET Framework. Так же изучены такие аспекты, как шифрование и расшифрование данных, формирование и проверка цифровой подписи. Далее были рассмотрены примеры использования изучаемых средств на языке Visual C++ для трех основных разновидностей криптографических классов.

В итоге стоит отметить большие возможности изучаемой среды как для защиты информации, так и для программирования. Устройство библиотек дает широчайшие возможности по работе с криптографическими алгоритмами, позволяя обеспечить совместимость интерфейсов различных реализаций одного и того же криптографического алгоритма.

 

 


Список литературы

 

1. Данные портала <http://msdn.microsoft.com>

. Данные портала <http://www.interface.ru>

3. Джеф Просиз. Программирование для Microsoft.NET. Москва. Microsoft Press (Русская редакция). 2003. 697 стр.

. Курс лекций Учебного Центра безопасности информационных технологий Microsoft Московского инженерно-физического института (государственного университета)


Поделиться с друзьями:

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...

Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...

Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.078 с.