Статус: Участник
Группы: Участники
Зарегистрирован: 14.12.2010(UTC) Сообщений: 25 Откуда: Новосибирск
|
Здравствуйте! Стоит такая задача. Требуется подписывать файл, чтобы потом проверять подпись. При работе с RSA просто экспортировали ключ и приладывали его к подписи. На стороне проверки извлекали оттуда и проверяли, примерно так: Код: // Подписывание
byte[] fileContent;
// Здесь прочитывается содержимое pfx-файла
cert = new X509Certificate2(fileContent, pid.txtPassword.Text);
byte[] pubcert = cert.Export(X509ContentType.Cert);
RSACryptoServiceProvider cspRsa = cert.PrivateKey as RSACryptoServiceProvider;
byte[] bSign = crypto.SignData(arr, new SHA1CryptoServiceProvider());
// Здесь упаковка pubcert и bSign
// Проверка
byte[] bSign = null;
byte[] pubcert = null;
// Извлечение сертификата и подписи
// ...
X509Certificate2 cert = new X509Certificate2(pubcert);
RSACryptoServiceProvider cspRsa = cert.PublicKey.Key as RSACryptoServiceProvider;
if (!cspRsa.VerifyData(arr, new SHA1CryptoServiceProvider(), bSign))
throw new Exception("RSA подпись документа неверна!");
Пытаемся выполнить нечто подобное с КриптоПро: Код: string containerName = Gost3410CryptoServiceProvider.SelectContainer(true, false, IntPtr.Zero);
Console.WriteLine(containerName);
CspParameters cp = new CspParameters(75, "", containerName);
Gost3410CryptoServiceProvider cspGost = new Gost3410CryptoServiceProvider(cp);
byte[] pubcert = cspGost.ExportParameters(true).PrivateKey;
При экспорте выбрасывается исключение, что экспорт долговременного секретного ключа CSP в чистом виде не поддерживается. Каким образом можно передать содержимое ключа для проверки подписи на принимающей стороне?
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,393 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 717 раз в 621 постах
|
Для проверки подписи отправлять закрытый ключ? - абсурд. Обычно для этой цели используют открытый. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 14.12.2010(UTC) Сообщений: 25 Откуда: Новосибирск
|
Хорошо, пусть. А как с ключом передать информацию о сертификате подписавшего? Отредактировано пользователем 27 декабря 2010 г. 12:37:11(UTC)
| Причина: Не указана
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 24.12.2007(UTC) Сообщений: 390 Откуда: КриптоПро Поблагодарили: 2 раз в 2 постах
|
С каким ключом? Cертификат это и есть открытый ключ + информация о владельце. |
С уважением, Александр. |
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 14.12.2010(UTC) Сообщений: 25 Откуда: Новосибирск
|
Извинюяь, возможно, я неправильно выражаюсь. В общем, на данный момент получается вот что. Открываю имеющийся контейнер (выбор через диалог сейчас только для отладки и проверки), получаю провайдера, извлекаю открытый ключ: Код: string containerName = Gost3410CryptoServiceProvider.SelectContainer(true, false, IntPtr.Zero);
CspParameters cp = new CspParameters(75, null, containerName);
Gost3410CryptoServiceProvider cspGost = new Gost3410CryptoServiceProvider(cp);
byte[] pubcert = cspGost.ExportCspBlob(false);
Далее подписываем, прикладываем ключ к подписи. Проверка происходит правильно. Однако если я пытаюсь получить ссылку на сертификат, которым производится подпись: Код: X509Certificate2 cert = cspGost.ContainerCertificate;
в ответ получаю null. Вот, собственно, и вопрос: как получить не только открытый ключ, но и остальной сертификат?
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 24.12.2007(UTC) Сообщений: 390 Откуда: КриптоПро Поблагодарили: 2 раз в 2 постах
|
Для того, чтобы Цитата:X509Certificate2 cert = cspGost.ContainerCertificate; работало, необходимо, чтобы в контейнера секретного ключа был установлен сертификат. Его может там не быть, потому что: - его туда не устанавливали - устанавливали, но не хватило места, поэтому он не установился. Проверить наличие и установить сертификат в контейнер можно при помощи контрольной панели КриптоПро CSP (правда только для ГОСТ, для RSA придется пользоваться другими средствами). Вытаскивание сертификата из контейнера, может оказаться очень долгим процессом (например, на смарт-картах). Поэтому лучше предварительно установить сертификат в хранилище MY со ссылкой на секретный ключ - давать пользователяю выбор сертификата - получать секретный ключ по сертификату - подписывать полученным секретным ключом. |
С уважением, Александр. |
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close