Ключевое слово в защите информации
ключевое слово
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

2 Страницы<12
Опции
К последнему сообщению К первому непрочитанному
Offline Андрей Писарев  
#11 Оставлено : 19 мая 2015 г. 11:36:43(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 14,113
Мужчина
Российская Федерация

Сказал «Спасибо»: 615 раз
Поблагодарили: 2381 раз в 1873 постах
Техническую поддержку оказываем тут
Наша база знаний
Offline bony599  
#12 Оставлено : 19 мая 2015 г. 13:28:54(UTC)
bony599

Статус: Активный участник

Группы: Участники
Зарегистрирован: 15.05.2015(UTC)
Сообщений: 40
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 2 раз
Вы хотели сказать это: "Нужно использовать более низкоуровневое api (cryptmsgopentodecode) или открыть нужный контейнер предварительно и задать пин." ?
Offline Андрей Писарев  
#13 Оставлено : 19 мая 2015 г. 15:14:47(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 14,113
Мужчина
Российская Федерация

Сказал «Спасибо»: 615 раз
Поблагодарили: 2381 раз в 1873 постах
Автор: bony599 Перейти к цитате
Вы хотели сказать это: "Нужно использовать более низкоуровневое api (cryptmsgopentodecode) или открыть нужный контейнер предварительно и задать пин." ?


Да.
Техническую поддержку оказываем тут
Наша база знаний
Offline bony599  
#14 Оставлено : 19 мая 2015 г. 17:36:33(UTC)
bony599

Статус: Активный участник

Группы: Участники
Зарегистрирован: 15.05.2015(UTC)
Сообщений: 40
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 2 раз
Для тех, кто дочитал эту пусто-порожнюю переписку до этого места сообщаю, что мне чудом удалось написать удачный код, который должен был быть вторым и последним сообщением по этой теме:

CspParameters cspParameters = new CspParameters(75);
cspParameters.Flags = CspProviderFlags.NoPrompt;
string pin = "123456";
SecureString spin = new SecureString();
foreach (char c in pin.ToCharArray())
{
spin.AppendChar(c);
}
cspParameters.KeyPassword = spin;
cspParameters.KeyContainerName = CertificateCN;

Gost3410CryptoServiceProvider csp = new Gost3410CryptoServiceProvider(cspParameters);

// Создаем объект для декодирования и расшифрования.
EnvelopedCms envelopedCms = new EnvelopedCms();

// Декодируем сообщение.
envelopedCms.Decode(File.ReadAllBytes(fname + ".p7m"));

// Расшифровываем сообщение.
// Сообщение будет расшифровано для того получателя,
// чей секретный ключ будет найден первым.
// Для расшифрования сообщения на конкретного
// получателя можно использовать код подобный следующему:
// envelopedCms.Decrypt(envelopedCms.RecipientInfos[0]);
// который расшифровывает сообщение для первого
// получателя.
Console.Write("Сертификатов: {0}. Расшифрование ... ", envelopedCms.Certificates.Count);

envelopedCms.Certificates.Clear();
envelopedCms.Certificates.Add(csp.ContainerCertificate);

envelopedCms.Decrypt(envelopedCms.Certificates);

Вроде бы проблема решилась.
И большой респект экспертам!
Offline bony599  
#15 Оставлено : 19 мая 2015 г. 17:46:00(UTC)
bony599

Статус: Активный участник

Группы: Участники
Зарегистрирован: 15.05.2015(UTC)
Сообщений: 40
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 2 раз
Для тех, кто дочитал эту пусто-порожнюю переписку до этого места сообщаю, что мне чудом удалось написать удачный код, который должен был быть вторым и последним сообщением по этой теме:

CspParameters cspParameters = new CspParameters(75);
cspParameters.Flags = CspProviderFlags.NoPrompt;
string pin = "123456";
SecureString spin = new SecureString();
foreach (char c in pin.ToCharArray())
{
spin.AppendChar(c);
}
cspParameters.KeyPassword = spin;
cspParameters.KeyContainerName = CertificateCN;

Gost3410CryptoServiceProvider csp = new Gost3410CryptoServiceProvider(cspParameters);

// Создаем объект для декодирования и расшифрования.
EnvelopedCms envelopedCms = new EnvelopedCms();

// Декодируем сообщение.
envelopedCms.Decode(File.ReadAllBytes(fname + ".p7m"));

// Расшифровываем сообщение.
// Сообщение будет расшифровано для того получателя,
// чей секретный ключ будет найден первым.
// Для расшифрования сообщения на конкретного
// получателя можно использовать код подобный следующему:
// envelopedCms.Decrypt(envelopedCms.RecipientInfos[0]);
// который расшифровывает сообщение для первого
// получателя.
Console.Write("Сертификатов: {0}. Расшифрование ... ", envelopedCms.Certificates.Count);

envelopedCms.Certificates.Clear();
envelopedCms.Certificates.Add(csp.ContainerCertificate);

envelopedCms.Decrypt(envelopedCms.Certificates);

Вроде бы проблема решилась.
И большой респект экспертам!
Offline Максим Коллегин  
#16 Оставлено : 19 мая 2015 г. 19:45:59(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,433
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 38 раз
Поблагодарили: 737 раз в 634 постах
Поздравляю! Когда писал ответ номер №2 под рукой был только телефон.
Примерно такой же код находится в примере Sign.cs в Simple35.Pdf.
В контейнере может не быть сертификата - посмотрите пример.
Знания в базе знаний, поддержка в центре поддержки
thanks 1 пользователь поблагодарил Максим Коллегин за этот пост.
Андрей * оставлено 20.05.2015(UTC)
Offline bony599  
#17 Оставлено : 20 мая 2015 г. 10:27:56(UTC)
bony599

Статус: Активный участник

Группы: Участники
Зарегистрирован: 15.05.2015(UTC)
Сообщений: 40
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 2 раз
Слушайте, ну вы странные люди! С подписью у меня как раз проблем и не было потому, что были примеры.
С шифрованием, как Вы писали, "аналогично" сделать нельзя, т.к. экземпляр CmsSigner создается из CspParameters, дериват класса которого и поставляется КриптоПро .Net, в котором как и реализован программный ввод нашего "советского" ПИН-кода. В классе EnvelopedCms прилепить классы КриптоПро .Net ну просто некуда, поэтому и х.з. как сделать программный ввод ПИН-кода. Причем то, что я написал, действительно случайная удача, т.к. когда я сразу попробовал написать так:
Gost3410CryptoServiceProvider csp = new Gost3410CryptoServiceProvider(cspParameters);
X509Certificate2Collection recipientCerts = new X509Certificate2Collection(csp.ContainerCertificate);
csp.PreloadContainer(); //эта хрень ничего не дает
csp.SetContainerPassword(spin); //эта тоже

// Создаем объект для декодирования и расшифрования.
EnvelopedCms envelopedCms = new EnvelopedCms();

// Декодируем сообщение.
envelopedCms.Decode(File.ReadAllBytes(fname + ".p7m"));

// Выводим количество получателей сообщения и
// алгоритм зашифрования.
DisplayEnvelopedCms(envelopedCms, false);

// Расшифровываем сообщение.
envelopedCms.Decrypt(recipientCerts);
Так не работает! А вот через коллекцию Certificates класса EnvelopedCms работает.
У меня сертификат в контейнере вместе с ключом, мне не нужно его искать в другом месте.
Поэтому, братья по разуму, если вас какой-то бедолага спрашивает "как?", то нужно в ответ "скопипейстить" код или линк на него, если конечно знаете решение, а не заниматься отсылками на три буквы ("SDK").
Offline Максим Коллегин  
#18 Оставлено : 20 мая 2015 г. 11:47:08(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,433
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 38 раз
Поблагодарили: 737 раз в 634 постах
Какой-то неконструктивный диалог. Если формат форума не устраивает - в следующий раз покупайте техподдержку разработчика. Тему закрываю.
Важная информация

Отредактировано пользователем 20 мая 2015 г. 11:48:14(UTC)  | Причина: Не указана

Знания в базе знаний, поддержка в центре поддержки
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы<12
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.