|
Вопрос по RSAPKCS1SignatureFormatter / RSAPKCS1SignatureDeformatter
|
|||
---|---|---|---|
#18+
Доброго времени суток. Возникла потребность в использовании ЭЦП, начал знакомиться с материалом из МСДН. Судя по прочитанному, ЭЦП получается путем следующей процедуры: 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.
Несколько вопросов: 1) При создании SignatureFormatter'а конструктору передается экземпляр класса AsymmetricAlgorythm (строка 19). Каким образом этот экземпляр используется для шифрования/расшифровки? Я не нашел у AsymmetricAlgorythm соотв. методов а-ля Encrypt/Decrypt. 2) При инициализации SignatureFormatter'а указывается алгоритм хеширования (строка 20). Тогда зачем хешировать объект вручную (строка 22), а в SignatureFormatter передавать полученный хеш? 3) Если для хеширования объекта (строка 22) использовать один алгоритм, а SignatureFormatter'у передать другой (строка 20), то при создании подписи (строка 24) будет выброшено исключение CryptographicException "Плохой хеш". Зачем это все, опять вопрос №2. 4) Каким образом производится расшифровка сигнатуры, зашифрованной приватным ключом (строка 34)? Буду очень благодарен за самый краткий ответ. А то ерунда какая-то: все работает, а как - непонятно. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2014, 23:48 |
|
|
start [/forum/topic.php?fid=20&msg=38780598&tid=1402347]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
60ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
41ms |
get tp. blocked users: |
2ms |
others: | 328ms |
total: | 475ms |
0 / 0 |