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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Грухин Иван  
#1 Оставлено : 3 марта 2010 г. 14:21:52(UTC)
Грухин Иван

Статус: Новичок

Группы: Участники
Зарегистрирован: 03.03.2010(UTC)
Сообщений: 4

Работаю над шифрованием файлов для отправки в Министерство торговли Пермского края. Из Министерства получена следующая схема:

Цитата:
1. Генерируется случайный сессионный ключ по ГОСТ 28147-89.
2. Генерируется вектор инициализации сессионного ключа.
3. Сессионным ключом шифруется файл.
4. На основе открытого ключа получателя и секретного отправителя вырабатывается ключ обмена.
5. Сессионный ключ шифруется ключом обмена.
6. В передаваемое сообщение включаются:
- Размер зашифрованного сессионного ключа (4 байта);
- Зашифрованный сессионный ключ;
- Размер вектора инициализации сессионного ключа (4 байта);
- Вектор инициализации сессионного ключа;
- Зашифрованный файл.


Перед шифрованием файл еще подписывается, но меня на данный момент больше интересует шифрование, т. к. отправленный файл в первую очередь расшифровывается, а опробованные способы шифрования (capicom, cryptcp) сервер Министерства не принял. Поэтому решил сделать весь процесс руками.
Разработка ведется в Delphi. Установлен "КриптоПро CSP 3.6". Наш сертификат установлен в личное хранилище пользователя. Файл сертификата Министерства имеется (.cer). Шифрование должно быть по ГОСТ Р 34.10 2001. Шифруемые файлы - таблицы dbf.
Хотелось бы узнать, какие команды из wcrypt2 использовать в пунктах этой схемы (можно просто список команд).
На данный момент получил контекст криптопровайдера и получаю сессионный ключ.
Буду рад любым советам.

P.S.: с п.6, думаю, справлюсь. Привел его для полноты картины

Отредактировано пользователем 3 марта 2010 г. 15:18:51(UTC)  | Причина: Не указана

Offline Грухин Иван  
#2 Оставлено : 11 марта 2010 г. 12:29:41(UTC)
Грухин Иван

Статус: Новичок

Группы: Участники
Зарегистрирован: 03.03.2010(UTC)
Сообщений: 4

Получаю контекст криптопровайдера следующим способом:
CryptAcquireContext(@hProv, nil, nil, PROV_GOST_2001_DH, 0);
Здесь выводится список доступных ключевых носителей, но на каждый носитель пишет "Нет ключей", хотя дискета вставлена.
При указании флага CRYPT_VERIFYCONTEXT и получении ключа команда CryptGetUserKey(hProv, AT_KEYEXCHANGE, @hKey) возвращает ложь с ошибкой "Нет ключей" (что вроде логично).

Решил перейти на получение криптопровайдера из сертификата в хранилище. Контекст сертификата из хранилища получил:
hStore := CertOpenSystemStore(0, 'MY');
pCertContext := CertFindCertificateInStore(hStore, X509_ASN_ENCODING or PKCS_7_ASN_ENCODING, 0, CERT_FIND_SUBJECT_STR, nil, nil);
И вот тут надо бы использовать CryptAcquireCertificatePrivateKey, как пишут на форуме, но такой команды нет ни в Wcrypt2, ни в wincryptex. Реакция Delphi на эту команду - undeclared identifier...

Отредактировано пользователем 11 марта 2010 г. 13:04:49(UTC)  | Причина: Не указана

Offline Kirill Sobolev  
#3 Оставлено : 11 марта 2010 г. 14:08:27(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Цитата:
Здесь выводится список доступных ключевых носителей, но на каждый носитель пишет "Нет ключей", хотя дискета вставлена.

Это правильно, потому что Вы не указываете имя контейнера в CryptAcquireContext.
Цитата:
И вот тут надо бы использовать CryptAcquireCertificatePrivateKey, как пишут на форуме, но такой команды нет ни в Wcrypt2, ни в wincryptex.

Есть в wincrypt.h из Platform SDK.
Техническую поддержку оказываем тут
Наша база знаний
Offline Грухин Иван  
#4 Оставлено : 11 марта 2010 г. 17:21:14(UTC)
Грухин Иван

Статус: Новичок

Группы: Участники
Зарегистрирован: 03.03.2010(UTC)
Сообщений: 4

С контейнером разобрался, спасибо.
Теперь возник другой вопрос:

Код:
// получаю вектор инициализации
if not CryptGetKeyParam(hSessionKey, KP_IV, nil, @dwIV, 0) then // получаю dwIV=8
  begin
...
  end;

GetMem(pbIV, dwIV);
if not CryptGetKeyParam(hSessionKey, KP_IV, @pbIV, @dwIV, 0) then // по-прежнему dwIV=8
  begin
...
  end;

// шифрование hSessionKey на ключе hAgreeKey
if not CryptExportKey(hSessionKey, hAgreeKey, SIMPLEBLOB, 0, nil, @dwBlobLenSimple) then // получаю dwBlobLenSimple=71
  begin
...
  end;

GetMem(pbKeyBlobSimple, dwBlobLenSimple);
if not CryptExportKey(hSessionKey, hAgreeKey, SIMPLEBLOB, 0, @pbKeyBlobSimple, @dwBlobLenSimple) then // dwBlobLenSimple меняется на 26142
  begin
...
  end;


Должен ли меняться dwBlobLenSimple? Или где-то ошибка?

P.S.: При использовании
CryptExportKey(hSessionKey, hAgreeKey, SIMPLEBLOB, 0, @pbKeyBlobSimple[0], @dwBlobLenSimple) или
CryptExportKey(hSessionKey, hAgreeKey, SIMPLEBLOB, 0, pbKeyBlobSimple, @dwBlobLenSimple)
размер остается 71. Вообще, какой размер считается нормальным? 71 - это много/мало?

Отредактировано пользователем 16 марта 2010 г. 11:27:19(UTC)  | Причина: Не указана

Offline Грухин Иван  
#5 Оставлено : 22 марта 2010 г. 9:48:08(UTC)
Грухин Иван

Статус: Новичок

Группы: Участники
Зарегистрирован: 03.03.2010(UTC)
Сообщений: 4

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