Статус: Новичок
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Цитата:Здесь выводится список доступных ключевых носителей, но на каждый носитель пишет "Нет ключей", хотя дискета вставлена. Это правильно, потому что Вы не указываете имя контейнера в CryptAcquireContext. Цитата:И вот тут надо бы использовать CryptAcquireCertificatePrivateKey, как пишут на форуме, но такой команды нет ни в Wcrypt2, ни в wincryptex. Есть в wincrypt.h из Platform SDK. |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 03.03.2010(UTC) Сообщений: 4
|
И реально ли реализовать указанный алгоритм шифрования средствами capicom?
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close