powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вопрос по RSAPKCS1SignatureFormatter / RSAPKCS1SignatureDeformatter
1 сообщений из 1, страница 1 из 1
Вопрос по RSAPKCS1SignatureFormatter / RSAPKCS1SignatureDeformatter
    #38780598
JohnSparrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток.

Возникла потребность в использовании ЭЦП, начал знакомиться с материалом из МСДН. Судя по прочитанному, ЭЦП получается путем следующей процедуры:
1) Хеширование исходного объекта.
2) Асимметричное шифрование хеша-функции, полученной на этапе 1.

После ознакомления с алгоритмами асимметричного шифрования выяснил, что шифруют публичным ключом, расшифровывают приватным. Тогда получается, что описанный выше алгоритм получения ЭЦП непонятно как работает: каким ключом шифровать хеш на этапе 2? Если публичным, так это может сделать любой (публичный ключ доступен всем), если приватным, то как потом его расшифровать? Подумал, что, возможно, зашифрованное приватным ключом можно расшифровать публичным, точно так же, как зашифрованное публичным расшифровывается приватным. Оказалось - нет, вот код:

using System;
using System.Security.Cryptography;
using System.Text;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace _test.Cryptography
{
[TestClass]
public class AsymmetricTest
{
[TestMethod]
public void PrivatePublicKeys()
{
var @private = new RSACryptoServiceProvider();

var @public = new RSACryptoServiceProvider();
@public.ImportParameters(@private.ExportParameters(false));

var encryptedByPrivate = @private.Encrypt(Encoding.UTF32.GetBytes("Private"), false);
var encryptedByPublic = @public.Encrypt(Encoding.UTF32.GetBytes("Public"), false);

var ret = "";
ret = Encoding.UTF32.GetString(@private.Decrypt(encryptedByPrivate, false));
ret = Encoding.UTF32.GetString(@private.Decrypt(encryptedByPublic, false));

try
{
ret = Encoding.UTF32.GetString(@public.Decrypt(encryptedByPrivate, false));
ret = Encoding.UTF32.GetString(@public.Decrypt(encryptedByPublic, false));
}
catch (Exception e)
{
}
}
}
}

Обе строки кода, заключенные в try{}, выбрасывают исключения (CryptographicException "Ключ не существует"). Это значит, что публичным ключом нельзя расшифровать то, что зашифровано приватным? Или ошибка в коде?

Ниже приведен рабочий код, составленный по итогам знакомства с процедурами обращения с ЭЦП из МСДН:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
/* 01 */  using System.Security.Cryptography;
/* 02 */  using System.Text;
/* 03 */  using Microsoft.VisualStudio.TestTools.UnitTesting;
/* 04 */
/* 05 */  namespace _test.Cryptography
/* 06 */  {
/* 07 */      [TestClass]
/* 08 */      public class SignatureTest
/* 09 */      {
/* 10 */          [TestMethod]
/* 11 */          public void RSA_Signature_test()
/* 12 */          {
/* 13 */              // source data
/* 14 */              var data = Encoding.UTF32.GetBytes("message");
/* 15 */  
/* 16 */              // sign the data
/* 17 */              var @private = new RSACryptoServiceProvider();  // create private provider
/* 18 */              
/* 19 */              var signFormatter = new RSAPKCS1SignatureFormatter(@private);   //  sign the hash
/* 20 */              signFormatter.SetHashAlgorithm("SHA256");
/* 21 */  
/* 22 */              var hash = SHA256.Create().ComputeHash(data);  // make the hash
/* 23 */  
/* 24 */              var signature = signFormatter.CreateSignature(hash); // create signature
/* 25 */  
/* 26 */              // check the signature of the data 
/* 27 */              
/* 28 */              var @public = new RSACryptoServiceProvider();               // create public provider
/* 29 */              @public.ImportParameters(@private.ExportParameters(false)); 
/* 30 */  
/* 31 */              var signDeformatter = new RSAPKCS1SignatureDeformatter(@public);    
/* 32 */              signDeformatter.SetHashAlgorithm("SHA256");
/* 33 */  
/* 34 */              var ret = signDeformatter.VerifySignature(hash, signature); // check signature
/* 35 */          }
/* 36 */      }
/* 37 */  }




Несколько вопросов:
1) При создании SignatureFormatter'а конструктору передается экземпляр класса AsymmetricAlgorythm (строка 19). Каким образом этот экземпляр используется для шифрования/расшифровки? Я не нашел у AsymmetricAlgorythm соотв. методов а-ля Encrypt/Decrypt.
2) При инициализации SignatureFormatter'а указывается алгоритм хеширования (строка 20). Тогда зачем хешировать объект вручную (строка 22), а в SignatureFormatter передавать полученный хеш?
3) Если для хеширования объекта (строка 22) использовать один алгоритм, а SignatureFormatter'у передать другой (строка 20), то при создании подписи (строка 24) будет выброшено исключение CryptographicException "Плохой хеш". Зачем это все, опять вопрос №2.
4) Каким образом производится расшифровка сигнатуры, зашифрованной приватным ключом (строка 34)?

Буду очень благодарен за самый краткий ответ. А то ерунда какая-то: все работает, а как - непонятно.
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вопрос по RSAPKCS1SignatureFormatter / RSAPKCS1SignatureDeformatter
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]