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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline refrefref  
#1 Оставлено : 14 декабря 2010 г. 3:40:39(UTC)
refrefref

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

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

Здравствуйте.
Решаем задачу передачи зашифрованных сообщений между программами (Java, C#). В качестве формата обмена сообщениями выбрали cms (pkcs#7).
На C# для шифрования используем следующий код (построен по примерам из sdk, без подписывания сообщения):

Код:

static byte[] Encrypt_cms(byte[] data)
{
    ContentInfo content = new ContentInfo(data);
    EnvelopedCms cms = new EnvelopedCms(content);

    CmsRecipientCollection recipients = new CmsRecipientCollection();
    CmsRecipient recipient = new CmsRecipient(new X509Certificate2(farCert));
    recipients.Add(recipient);

    encryptedMessage.Encrypt(recipients);
    return encryptedMessage.Encode();
}


Данные успешно расшифровываются на других системах (jcp), путем генерации ключа согласования, расшифровывания симметрического ключа и, в конечном счете, расшифровкой переданного сообщения. Поскольку приватный ключ отправителя в коде не используется, приходим к выводу, что для шифрования используется эфемерная пара ключей.

Вопрос: что нужно изменить в коде, чтобы для шифрования симметрического ключа использовалась явно указанная пара ключей, а не эфемерная?
Наличие в пространстве имен System.Security.Cryptography.Pkcs класса KeyAgreeRecipientInfo и перечисления KeyAgreeKeyChoice вселяют надежду, что это все-таки возможно.
Спасибо

Offline Максим Коллегин  
#2 Оставлено : 14 декабря 2010 г. 9:10:32(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 32 раз
Поблагодарили: 706 раз в 614 постах
AgreeKey не подразумевает использования статического DH. Так что ответ на вопрос: высокоуровневым API - никак. Встречный вопрос - а зачем?
Знания в базе знаний, поддержка в техподдержке
Offline refrefref  
#3 Оставлено : 14 декабря 2010 г. 13:46:48(UTC)
refrefref

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

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

Ключевая пара фиксирована с обеих сторон, и очень высока вероятность, что заказчик потребует использования этих приватных ключей при создании ключей согласования... Видимо, для некоторой аутентификации. При этом подпись сообщения (как в примерах для CMS) для решения этой проблемы, к сожалению, не рассматривается.

Вообще говоря уже есть код на Java+JCP, который работает по нужной схеме (использует фиксированные ключевые пары сторон для AgreeKeys) и упаковывает сообщение в CMS - осталось сделать то же самое на C#.

Может Вы посоветуете другой способ/стандарт обмена шифром между разнородными системами? Или это решается НЕвысокоуровневым API?
На Java, например, пришлось для этой задачи вручную заполнять объект класса EnvelopedData. В C# пытался сделать по аналогии, но большинство полей и методов оказались доступны только для чтения (либо я неправильно это делал).
Offline Челпанов А.  
#4 Оставлено : 14 декабря 2010 г. 14:18:48(UTC)
Челпанов А.

Статус: Активный участник

Группы: Участники
Зарегистрирован: 24.12.2007(UTC)
Сообщений: 390
Мужчина
Откуда: КриптоПро

Поблагодарили: 2 раз в 2 постах
Класс KeyAgreeRecipientInfo используется micrsoft исключительно при расшифровании сообщения. При зашифровании сообщения выбор между agree и transport осуществляется по типу алгоритма, для ГОСТ как и для RSA - transport. Да же, если этот выбор заменить на agree (что не так просто), то высокоуровневые функции работать все равно пока не будут. Придется спускаться на уровень CryptoApi. Я надеюсь коллеги подскажут примерчик.
С уважением, Александр.
Offline Максим Коллегин  
#5 Оставлено : 14 декабря 2010 г. 14:29:02(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 32 раз
Поблагодарили: 706 раз в 614 постах
Уточню. PKCS7 обвязка CSP не поддерживает статический DH. Если только вручную кодировать на уровне CSP.
http://msdn.microsoft.co...y/aa377945(v=vs.85).aspx
Цитата:
pSenderId
A pointer to a CERT_ID structure. This member is used when the dwKeyChoice member contains CMSG_KEY_AGREE_STATIC_KEY_CHOICE. This member is not currently used.

MS не особо этот вариант поддерживает.
Если нужна аутентификация - проще подписать документ.

Отредактировано пользователем 14 декабря 2010 г. 14:32:21(UTC)  | Причина: Не указана

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