logo
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

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

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

Группы: Участники
Зарегистрирован: 19.05.2017(UTC)
Сообщений: 1
Российская Федерация

Добрый день, мне нужно зашифровать файл по ГОСТ 28147 и вложить его внутрь SOAP запроса в виде такой структуры:
Код:
<EncryptedData xmlns="http://www.w3.org/2001/04/xmlenc#" Type="http://www.w3.org/2001/04/xmlenc#Element">
  <EncryptionMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gost28147"/>
  <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
    <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
      <EncryptionMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:transport-gost2001"/>
      <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
        <X509Data>
          <X509Certificate>X509CERT</X509Certificate>
        </X509Data>
      </KeyInfo>
      <CipherData>
        <CipherValue>CIPHER_KEY</CipherValue>
      </CipherData>
    </EncryptedKey>
  </KeyInfo>
  <CipherData>
    <CipherValue>CIPHER_DATA</CipherValue>
  </CipherData>
</EncryptedData>

В наличие есть файл, сертификат получателя установленный в системе и сертификат отправителя c закрытым ключом установленный в криптоконтейнер.
Алгоритм шифрования примерно такой:

CryptAcquireContext - Получаем контекст криптопровайдера hProv
открываем сертификат получателя и получаем контекст сертификата получателя CERT_CONTEXT

CryptImportPublicKeyInfo - Получаем открытый ключ получателя hPublicKey
CryptExportKey(hPublicKey, 0, PUBLICKEYBLOB, 0 - экспортируем ключ получателя в блоб pbKeyBlob

CryptGetUserKey(hProv, AT_KEYEXCHANGE, &hSenderKey) - Получаем закрытый ключ отправителя hSenderKey
CryptImportKey(hProv, pbKeyBlob, dwBlobLen, hSenderKey, 0, &hAgreeKey) - Получаем ключ согласования hAgreeKey из ключа отправителя и блоба с открытым ключом получателя
CryptGenKey(hProv, CALG_G28147, CRYPT_EXPORTABLE, &hSessionKey) - Генерируем сессионный ключ hSessionKey
CryptExportKey(hSessionKey, hAgreeKey, SIMPLEBLOB, 0, pbKeyBlobSimple, &dwBlobLenSimple) Шифруем сессионный ключ на ключе согласования hAgreeKey

CryptEncrypt(hSessionKey, 0, TRUE, 0, pbContent, &cbContent, bufLen) - Шифруем данные pbContent сессионным ключом

Правильно ли я понимаю, что в X509CERT передаем сертификат отправителя, в CIPHER_KEY передаем шифрованный сессионный ключ pbKeyBlobSimple, а в CIPHER_DATA - зашифрованные данные pbContent?
Не упускаю ли я чего-то?
Offline mtv06  
#2 Оставлено : 6 марта 2018 г. 13:00:08(UTC)
mtv06

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

Группы: Участники
Зарегистрирован: 06.12.2017(UTC)
Сообщений: 43
Российская Федерация
Откуда: Карелия

Добрый день! Не подскажите - получилось реализовать шифрование в такой последовательности, как у вас описано?
Offline olekhov  
#3 Оставлено : 7 марта 2018 г. 8:03:59(UTC)
olekhov

Статус: Участник

Группы: Участники
Зарегистрирован: 25.10.2013(UTC)
Сообщений: 12
Российская Федерация

Сказал(а) «Спасибо»: 4 раз
Упускаете.
Вы шифруете для получателя. От получателя нужен публичный ключ (например, в составе сертификата X509).

Схема работает по такой механике:

На отправляющей стороне:
В криптопровайдере открываем контекст CRYPT_VERIFYCONTEXT, генерируем эфемерный ключ.
Импортируем публичный ключ получателя, получаем ключ шифрования ключей (KEK)
Генерируем ключ шифрования данных (content encryption key, CEK).
Экспортируем CEK на KEK (SIMPLEBLOB)
Шифруем данные при помощи CEK.

получателю выдаём:
шифрованные данные
зашифрованный CEK
публичный ключ к эфемерному ключу

На принимающей стороне:
Открываем контекст с приватным ключом к сертификату
Импортируем публичный ключ к эфемерному ключу (тут формируется KEK)
Импортируем CEK.
Расшифровываем данные.

Итого, в вашей схеме не хватает как минимум блоба с публичным ключом эфемерного ключа.

Отредактировано пользователем 7 марта 2018 г. 8:05:06(UTC)  | Причина: Не указана

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