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

Уведомление

Icon
Error

2 Страницы<12
Опции
К последнему сообщению К первому непрочитанному
Offline Юрий  
#11 Оставлено : 8 октября 2014 г. 16:31:57(UTC)
Юрий

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

Группы: Участники
Зарегистрирован: 22.01.2008(UTC)
Сообщений: 675
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 95 раз в 68 постах
Наиболее элегантный способ - использовать CryptQueryObject.
Менее элегантный - загружать контекст файла в память и декодировать ASN.1 структуры непосредственно через CryptDecodeObject.
С уважением,
Юрий Строжевский
thanks 1 пользователь поблагодарил Юрий за этот пост.
antiigor оставлено 08.10.2014(UTC)
Offline antiigor  
#12 Оставлено : 13 октября 2014 г. 20:34:14(UTC)
antiigor

Статус: Участник

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

Сказал(а) «Спасибо»: 10 раз
Юрий, спасибо за заданное направление!
К сожалению, через CryptQueryObject так и не смог получить контекст сертификата. Обстоятельства таковы, что приходится вызывать CriptoAPI на C# через p/invoke, примеров найти не смог, для меня эта тема мало знакомая :(
Зато получить, начитавшись интернетов, через CertCreateCertificateContext вот так:
byte[] certData = GetFileBytes(CertificateFile);
IntPtr pRecipient = Crypto.CertCreateCertificateContext(Crypto.X509_ASN_ENCODING | Crypto.PKCS_7_ASN_ENCODING, certData, certData.Length);
В pRecipient получаю контекст и даже могу на его основе создать объект X509Certificate2 и с ним поработать
X509Certificate2 pCert = new X509Certificate2(pRecipient);
result = result + "pCert.GetFormat(): " + pCert.GetFormat() + "\n";
result = result + "pCert.GetCertHashString(): " + pCert.GetCertHashString() + "\n";

Но когда доходит до вызова CryptEncryptMessage, то из неё возвращается false, при этом GetLastError() возвращает 0, и я не могу в результате понять, что конкретно ей не нравится. При этом если вызвать CryptEncryptMessage с заведомо кривыми агрументами, например массив rgpRecipientCert содержит 1 элемент, а в cRecipientCert передать 2, то валится вполне себе AV, который перехватывается отладчиком. А в моём же случае просто тишина. Крипто-Про куда то пишет лог? В виндовых журналах ничего похожего не нашёл, в директории, куда установлена CSP одни бинарники, в C:\Users тоже ничего похожего не нашёл. Попробовал в DebugView посмотреть, тишина. Может быть логирование надо как-то включить, но как?


Юрий, и ещё котел бы уточнить, описанный мой способ похож на то, что вы описали как менее элегантный?
Автор: Юрий Перейти к цитате
Менее элегантный - загружать контекст файла в память и декодировать ASN.1 структуры непосредственно через CryptDecodeObject.

Если да, то можете уточнить, что конкретно мне нужно декодировать? Ведь это же и может быть причиной моей ошибки?

Заранее спасибо!
Offline antiigor  
#13 Оставлено : 13 октября 2014 г. 20:56:06(UTC)
antiigor

Статус: Участник

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

Сказал(а) «Спасибо»: 10 раз
Прошу прощения за предыдущий пост, что отвлёк, буквально находясь уже в тупике написал предыдущее, а сейчас понял, что неверно анализировал результат CryptDecodeObject, как !CryptDecodeObject :) Она на самом деле возвращает true и дальше всё идёт хорошо, полученный зашифрованный файл успешно расшифровал соответствующим закрытым ключом.
Ещё раз спасибо!
Offline pasergey  
#14 Оставлено : 30 октября 2025 г. 14:38:27(UTC)
pasergey

Статус: Участник

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

Автор: Станислав Смышляев Перейти к цитате
Добрый день!

Немного дополню Андрея. "На открытых ключах непосредственно не шифруют. Везде делают сессионный ключ и пользуют симметричное шифрование" – речь о криптографической сути преобразований и о некорректности употребленных Вами терминов. Действительно, открытый ключ в случае работы с российскими криптографическими алгоритмами используется для создания зашифрованного сообщения не напрямую. Происходит это так: создается временный случайный сессионный (для ГОСТ 28147-89) ключ, а также временная ключевая пара (т.н. эфемерный ключ). Сообщение шифруется на сессионном ключе. После этого на открытом ключе получателя и закрытом ключе временной ключевой пары производится VKO (по сути, Диффи-Хеллман + хэш), затем сессионный ключ зашифровывается на полученном ключе согласования. В сообщении оказываются (не считая атрибутов): 1) шифртекст сообщения (зашифрованный на сессионном ключе), 2) зашифрованный на ключе согласования сессионный ключ, 3) открытый ключ временной ключевой пары. На стороне получателя открытый ключ временной ключевой пары и закрытый ключ получателя используются для получения ключа согласования по VKO, который используется для расшифрования сессионного ключа, а сессионный ключ затем используется для расшифрования сообщения.

Все это можно произвести и вызовами CryptoAPI 1.0, но, конечно, удобнее всего использовать вызовы CryptoAPI 2.0 (CryptEncryptMessage) по аналогии с примером, указанным Андреем.



Добрый день, Станислав!

Поясните, пожалуйста, на примерах.

Стоит задача: реализовать симметричное шифрование. У пользователя должен быть только пароль(или ключ).
Функции требуется использовать из разрешённого списка. "ЖТЯИ.00103-03 95 01. Правила пользования.pdf"

В примерах, FAQ - ничего подходящего не нашел.

PS: очень неудобный хелп у вас. куча примеров, но все какие-то оторванные от жизни.

С уважением, Сергей.

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