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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Kio  
#1 Оставлено : 19 ноября 2008 г. 11:34:22(UTC)
Kio

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

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

Подскажите, пожалуйста, в следующей ситуации:
Я написал модуль шифрования\дешифрования по ГОСТ 28147 в среде разработки C++ Builder 6. Шифрую, а затем расшифровываю нормально.
Есть процедура, написанная на .Net, и шифрующая по тому же алгоритму.
Задача в идеале выглядит так: на клиенте стоит Си-программа, а на сервере - .Net.
Но! При попытке расшифровать сообщение, созданное .Net-процедурой (с использованием тех же сертификатов и ключевых пар), мне не удается получить (расшифровать) сессионый ключ (функцией CryptImportKey).
Ошибка у меня или дело в другом? Зависит ли сессионный ключ от среды разработки (при прочих равных - версии CSP, сертификатов и ключевых парах)?

Отредактировано пользователем 19 ноября 2008 г. 11:37:44(UTC)  | Причина: Не указана

Offline Kio  
#2 Оставлено : 20 ноября 2008 г. 11:14:57(UTC)
Kio

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

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

Неужели никто не знает?
Offline Максим Коллегин  
#3 Оставлено : 20 ноября 2008 г. 12:20:38(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 715 раз в 620 постах
Какой функцией экспортируется сессионный ключ в .net?
Посмотрите топик
http://www.cryptopro.ru/...t.aspx?g=posts&t=573
Знания в базе знаний, поддержка в техподдержке
Offline Kio  
#4 Оставлено : 20 ноября 2008 г. 13:18:22(UTC)
Kio

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

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

Спасибо за ссылку: буду разбираться...

Ключ экспортируется так:
// Создаем симметричный ключ.
Gost28147 symmetric = Gost28147.Create();
// Создаем поток шифратора.
ICryptoTransform transform = symmetric.CreateEncryptor();
// Открываем ключ отправителя.
CspParameters par = new CspParameters(75, null, _SourceContainer);
Gost3410CryptoServiceProvider srcContainer = new Gost3410CryptoServiceProvider(par);
Gost3410Parameters srcPublicKeyParameters = srcContainer.ExportParameters(false);
// Создаем agree ключ
GostSharedSecretAlgorithm agree = srcContainer.CreateAgree(alg.ExportParameters(false));
// Зашифровываем симметричный ключ на agree ключе.
byte[] WrappedKey = agree.Wrap(symmetric, GostKeyWrapMethod.CryptoProKeyWrap);
// Создаем зашифрованный файл.
using (FileStream ofs = new FileStream(_EncrFileName, FileMode.Create))
{
BinaryWriter bw = new BinaryWriter(ofs);
// Записываем зашифрованный симметричный ключ.
bw.Write(WrappedKey.Length);
bw.Write(WrappedKey);
// Записываем синхропосылку
bw.Write(symmetric.IV.Length);
bw.Write(symmetric.IV);
// Передаем открытый ключ.
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(ofs, srcPublicKeyParameters);
Offline Kio  
#5 Оставлено : 21 ноября 2008 г. 16:30:03(UTC)
Kio

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

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

Цитата:
Зашифрованные симметричные ключи в "ГНИВЦ Курьер" скорее всего имеют структуру CRYPT_SIMPLEBLOB (см. описание в WinCryptEx.h). Не лучший способ формата сессионного ключа с моей точки зрения.
wrappedKey из вашего примера может быть разобран в структуру GostWrappedKey:

Code:
GostWrappedKey wk = new GostWrappedKey();
wk.SetByXmlWrappedKey(wrappedKey);

Останется только сопоставить соответствующие поля GostWrappedKey и CRYPT_SIMPLEBLOB
bSV - Ukm
bEncryptedKey - EncryptedKey
bMacKey - Mac
bEncryptionParamSet - EncryptionParamSet


С уважением, Александр Челпанов.


Не понял, как сопоставить? Побайтным копированием? Очень хотется хотя бы приблизительный примерчикd'oh!



Offline Максим Коллегин  
#6 Оставлено : 21 ноября 2008 г. 16:36:42(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 715 раз в 620 постах
Цитата:
Небольшой комментарий по поводу преобразования зашифрованных сессионных ключей в CRYPT_SIMPLEBLOB (для тех кто не в курсе внутренней переписки). Нам показалось, что такая фукциональность будет востребована достаточно часто, поэтому мы решили добавить ее в КриптоПро Шарпей. Для преобразования зашифрованного сессионного ключа из вышеуказанного примера в BLOB:
Code:
GostWrappedKey wk = new GostWrappedKey();
wk.SetByXmlWrappedKey(wrappedKey);
byte[] blob = wk.GetCryptoServiceProviderBlob()
;
Знания в базе знаний, поддержка в техподдержке
Offline Kio  
#7 Оставлено : 21 ноября 2008 г. 18:08:24(UTC)
Kio

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

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

Это, хорошо, конечно, но если изменения со стороны .Net нежелательны?
Как действовать\преобразовывать со стороны С++?
Пример: получен колюч (65 байт), сгенерированный в .Net (мой пример, без SetByXmlWrappedKey разум-ся).
Можно ли его в С++ Builder преобразовать в simpleblob?
Или только в .net есть соотвествующие средства?
Offline Максим Коллегин  
#8 Оставлено : 21 ноября 2008 г. 21:14:13(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 715 раз в 620 постах
все написано в предыдущих постах, тему закрываю.
Знания в базе знаний, поддержка в техподдержке
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (2)
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.