30.03.2007 11:33:42Запись/проверка ЭЦП средствами CAPICOM (.net). Правильно ли я делаю (и еще пара вопросов)? Ответов: 2
Максим
Здравствуйте!

Для подписи делаю следующее:
1. Перегоняю исходные данные в Base64 (чтобы можно было записать в строковый тип)
2. Создаю объект store, вызываю его метод open (CAPICOM_CURRENT_USER_STORE, “Имя хранилища”, CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED)
3. Выбираю сертификат для подписи.
4. Создаю объект Signer и устанавливаю:
Signer.Certificate = «Выбранный сертификат»
5. Создаю объект SignedData. Ставлю Content на строку с исходными данными в Base64
6. Вызываю метод SignedData.Sign, которому передаю объект Signer , bDetached = false, CAPICOM_ENCODE_ANY.
7. Метод возвращает Base64-строку.

Собственно вопросы:
- Полученный результат (Base64-строка) – это и есть сообщение с ЭЦП?
- Все ли я делаю правильно) ?
- Каким образом происходит выбор алгоритма ЭЦП и выбор длины ключа? Или эти данные берутся из сертификата? Можно ли как-то указать использование другого алгоритма/длины ключа.

Для проверки ЭЦП:
1. Вызываю метод Verify объекта SignedData, с передачей Base64-строки, полученной как результат работы метода sign, bDeatached = false, CAPICOM_VERIFY_SIGNATURE_AND_CERTIFICATE.
2. Произвожу обратное преобразование из Base64, получаю исходные данные.

Все вроде замечательно: полученный результат соответствует исходным данным (до подписи). Правильно ли я делаю?

Извините за ламерские вопросы в примитивной формулировке, но раньше никогда с такими вещами … как то не приходилось.
Заранее большое спасибо за ответы!
 
Ответы:
30.03.2007 12:02:44Kirill Sobolev
Да, это и есть сообщение с ЭЦП.
Не уверен насчет первого пункта - разве в .NET нельзя делать строки, содержащие бинарные данные?
Данные берутся из провайдера, которым был создан секретный ключ, использующийся при подписи. А вот при проверки - да, данные берутся из сертификата.
Никакой другой алгоритм/ключ указать нельзя.
А в целом алгоритм работы правильный :)
30.03.2007 12:35:23Максим
Большое спасибо!
Насчет бинарных данных в .net-string'ах - вроде все же нет, хотя не уверен, т.к. сам на эту штуку только сел. Это вообще мой первый .net-project.