Статус: Новичок
Группы: Участники
Зарегистрирован: 19.11.2008(UTC) Сообщений: 5
|
Подскажите, пожалуйста, в следующей ситуации: Я написал модуль шифрования\дешифрования по ГОСТ 28147 в среде разработки C++ Builder 6. Шифрую, а затем расшифровываю нормально. Есть процедура, написанная на .Net, и шифрующая по тому же алгоритму. Задача в идеале выглядит так: на клиенте стоит Си-программа, а на сервере - .Net. Но! При попытке расшифровать сообщение, созданное .Net-процедурой (с использованием тех же сертификатов и ключевых пар), мне не удается получить (расшифровать) сессионый ключ (функцией CryptImportKey). Ошибка у меня или дело в другом? Зависит ли сессионный ключ от среды разработки (при прочих равных - версии CSP, сертификатов и ключевых парах)? Отредактировано пользователем 19 ноября 2008 г. 11:37:44(UTC)
| Причина: Не указана
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 19.11.2008(UTC) Сообщений: 5
|
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,391 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 715 раз в 620 постах
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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);
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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
С уважением, Александр Челпанов. Не понял, как сопоставить? Побайтным копированием? Очень хотется хотя бы приблизительный примерчик
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,391 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 715 раз в 620 постах
|
Цитата:Небольшой комментарий по поводу преобразования зашифрованных сессионных ключей в CRYPT_SIMPLEBLOB (для тех кто не в курсе внутренней переписки). Нам показалось, что такая фукциональность будет востребована достаточно часто, поэтому мы решили добавить ее в КриптоПро Шарпей. Для преобразования зашифрованного сессионного ключа из вышеуказанного примера в BLOB: Code: GostWrappedKey wk = new GostWrappedKey(); wk.SetByXmlWrappedKey(wrappedKey); byte[] blob = wk.GetCryptoServiceProviderBlob() ; |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 19.11.2008(UTC) Сообщений: 5
|
Это, хорошо, конечно, но если изменения со стороны .Net нежелательны? Как действовать\преобразовывать со стороны С++? Пример: получен колюч (65 байт), сгенерированный в .Net (мой пример, без SetByXmlWrappedKey разум-ся). Можно ли его в С++ Builder преобразовать в simpleblob? Или только в .net есть соотвествующие средства?
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,391 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 715 раз в 620 постах
|
все написано в предыдущих постах, тему закрываю. |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close