16.03.2005 17:08:17Быстро расшифровать??? Ответов: 15
Евгений
Используем PKI, а то бишь: получаем сертификат пользователя и шифруем все с помощью CryptEncryptMessage. Расшифровываем все с помощью, естественно, CryptDecryptMessage. Все хорошо, кроме одного но - CryptDecryptMessage принимает на вход хендл на хранилище сертификатов. И при большом объеме зашифрованных данных возникают проблемы - 10 Мб расшифровывались около 15 минут... :о(
Как я понимаю, перебираются все сертификаты в поиске нужного. Как избавиться от этого перебора? Посоветуйте... Есть ли какие-нибудь другие механизмы шифрования/расшифрования, где при расшифровке использовался бы конкретный контекст сертификата...
 
Ответы:
16.03.2005 17:21:56Василий
Померьте время зашифрования-расшифрования файла такого же размера при использовании программы CryptCP - http://www.cryptopro.ru/CryptoPro/products/command.asp
16.03.2005 18:39:07Евгений
Василий, в том-то и дело, что тот же cryptcp для расшифрования требует один сертификат!
Так как расшифровывать данные, передавая только лишь сертификат, а не хендл на хранилище?
16.03.2005 18:43:54Евгений
Программой cryptcp я померил время - скорость мне понравилась.
Кстати, 15 минут в моих тестах - это субъективно, потому как потом шел разбор полученных данных.
16.03.2005 19:13:25Kirill Sobolev
Если Вам хочется использовать именно CryptDecryptMessage, то сделайте временное хранилище в памяти с единственным нужным вам сертификатом - его и передавайте. А можно использовать функции более низкого уровня - CryptMsg*.
Хотя, непонятна зависимость времени от количества сертификатов - информация о получателе есть в сообщение, а поиск в хранилище действие довольно таки быстрое...
16.03.2005 19:35:02Евгений
Кирилл, спасибо, дали ответ - информация о получателе содержится в сообщении.
И тогда встречный вопрос - как сделать так, чтобы не включать информацию о получателе в шифрованное сообщение? Или против стандартов не пойдешь? ;)
16.03.2005 19:43:13Kirill Sobolev
Ну почему - CryptEncrypt/CryptDecrypt. Но тогда придется как-то генерить и передавать ключи самостоятельно, т.к. в сообщении помимо информации о получателе содержится еще и ключ, которым было зашифровано и параметры шифрования (вектор инициализации например).
16.03.2005 22:18:51Евгений
Кирилл, Вы опять неволей затрагиваете интересующие меня вопросы - "...вектор инициализации..."
Возможно ли средствами CryptoAPI варьировать использованием различных режимов сцепления блоков шифртекста, например, вместо простейшего режима электронной кодовой книги использовать режим обратной связи по выходу?
И еще такой вопрос - функция режимов сцепления, как я понимаю, должна поддерживаться CSP?
И какие режимы использует CryptoPRO?
17.03.2005 10:10:48Василий
Разумеется, можно использовать любой из поддерживаемых режимов (вот цитата из нашей документации http://www.cryptopro.ru/CryptoPro/test/csp_2_0.chm):
Параметр KP_MODE (функции CryptSetKeyParam). Режим шифра. Задается величиной DWORD. Передаётся функции через буфер pbData. В следующем списке приведены режимы шифрования, определённые в настоящее время:
CRYPT_MODE_ECB - ГОСТ 28147-89 режим простой замены;
CRYPT_MODE_OFB - ГОСТ 28147-89 режим гаммирования;
CRYPT_MODE_CFB - ГОСТ 28147-89 режим гаммирования с обратной связью.
CRYPT_MODE_CBC - блочный шифр с обратной связью;
Но, при этом придётся самостоятельно генерить сессионный ключ и менять его параметры, а потом передавать его получателю. Полный текст примера - в http://www.cryptopro.ru/CryptoPro/forum/myforum.asp?q=4, а также http://www.cryptopro.ru/CryptoPro/test/sample2_0.zip
17.03.2005 18:06:28Евгений
Василий, спасибо Вам большое.
Товарищи, у меня еще к вам вопрос.
"1.3.6.1.5.5.7.3.2" - спуск для алгоритма ГОСТ Р 34.10-94.
А какой у 2001 ГОСТ-а?
18.03.2005 10:02:41Василий
"1.3.6.1.5.5.7.3.2" - "Проверка подлинности клиента" - это OID EKU (Extended Key Usage, в русском переводе "Улучшенный ключ") сертификата, предназначенного для функционирования TLS-клиента.
При этом алгоритм ключа сертфиката может быть разным - как ГОСТ (..94 или ..2001), так и RSA.
18.03.2005 17:08:23Евгений
Василий, спасибо, что вывели меня из заблуждения. :о)
А может кинуть ссылочку на описание всех таких OID?
И еще вопрос... Я формирую запрос на сертификацию из Lotus Notes, используя CryptoPRO. Откуда я уж отрыл "1.3.6.1.5.5.7.3.2" - я не помню уже. Но факт - мне не удается получать сетритифакы под 2001 ГОСТ... Думал, что дела в этом самом OID, но... Подскажите, в чем может быть проблема.
21.03.2005 11:00:14Василий
Это один из стандартных OID-ов EKU, зарегистрированных в Windows. Ещё примеры - Защищенная электронная почта -1.3.6.1.5.5.7.3.4, Проверка подлинности сервера - 1.3.6.1.5.5.7.3.1
По второму:
уточните, где проичодит ошибка:
- при формировании запроса на сертификат
- при изготовлении сертификата по запросу
- при установке сертификата
- при работе с сертификатом
21.03.2005 18:47:25Евгений
Василий, ошибки не происходит.
Формирование запроса на сертификацию:

Set XEnroll = CreateObject("CEnroll.CEnroll.1")

XEnroll.ProviderType = 2
XEnroll.ProviderName = "Crypto-Pro Cryptographic Service Provider"
’ XEnroll.addCertTypeToRequest("ExchangeUser")
XEnroll.addCertTypeToRequest("Пользователь")
XEnroll.KeySpec=1
strName = "2.5.4.6"
strValue = "UZ"
Call Xenroll.addNameValuePairToSignature(strName, strValue)

’AT_KEYEXCHANGE=1;
’AT_SIGNATURE=2;

Usage = "1.3.6.1.5.5.7.3.2"

PKCS10 = XEnroll.createPKCS10(strDN, usage)
Container = XEnroll.ContainerName
Store = XEnroll.RequestStoreName
StType = XEnroll.RequestStoreType

Код написан на LotusScript.
Запрос на сертификацию формируется для 94-того ГОСТ-а. А как быть с 2001?
22.03.2005 9:54:19Василий
XEnroll.ProviderType = 75
XEnroll.ProviderName = "Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider"
22.03.2005 17:09:42Евгений
Василий, спасибо большое за помощь по этому и по другим вопросам... :о) За вклад в мое просвещение... :о)