Поделиться через


Шифрование данных

В следующей процедуре описаны действия, которые необходимо выполнить для шифрования сообщения с помощью базовых функций шифрования. Сведения о шифровании сообщений с помощью стандартов PKCS 7 см. в разделах Функции сообщений низкого уровня и Упрощенные функции сообщений.

Шифрование сообщения

  1. Создайте ключ сеанса с помощью функции CryptGenKey .

    Этот вызов создает случайный ключ и возвращает дескриптор, чтобы ключ можно было использовать для шифрования и расшифровки данных. На этом этапе также указан используемый алгоритм шифрования. Так как CryptoAPI не позволяет приложениям использовать алгоритмы открытого ключа для шифрования массовых данных, укажите симметричный алгоритм, например RC2 или RC4, с помощью вызова CryptGenKey .

  2. Кроме того, используйте функцию CryptDeriveKey , чтобы преобразовать пароль в ключ, подходящий для шифрования.

    Если приложению необходимо зашифровать сообщение, чтобы любой пользователь с указанным паролем мог расшифровать данные, используйте CryptDeriveKey для преобразования пароля в ключ, подходящий для шифрования.

    Примечание

    В этом случае эта функция вызывается вместо функции CryptGenKey и последующие вызовы CryptExportKey не требуются.

     

  3. При необходимости задайте дополнительные криптографические свойства ключа с помощью функции CryptSetKeyParam .

    После создания ключа можно задать дополнительные криптографические свойства ключа с помощью функции CryptSetKeyParam. Эта функция позволяет шифровать различные разделы файла с помощью разных солей ключей и позволяет изменить режим шифра или вектор инициализации ключа. Эти параметры можно использовать для обеспечения соответствия шифрования определенному стандарту шифрования данных.

  4. Зашифруйте данные в файле с помощью функции CryptEncrypt .

    Функция CryptEncrypt принимает ключ сеанса, созданный на предыдущем шаге, и шифрует буфер данных.

    Примечание

    По мере шифрования данных алгоритм шифрования может немного расширить их. Приложение отвечает за запоминание длины зашифрованных данных, чтобы правильную длину можно было позже указать для функции CryptDecrypt .

     

  5. При необходимости используйте функцию CryptExportKey , чтобы разрешить текущему пользователю расшифровать данные в будущем.

    Чтобы разрешить текущему пользователю расшифровать данные в будущем, функция CryptExportKey используется для сохранения ключа расшифровки в зашифрованной форме (blOB-объект ключа), который можно расшифровать только с помощью закрытого ключа пользователя. Для этой функции требуется открытый ключ обмена ключами пользователя, который можно получить с помощью функции CryptGetUserKey . Функция CryptExportKey возвращает большой двоичный объект ключа, который должен храниться приложением для использования при расшифровке файла.

Примечание

Если приложение имеет сертификаты (или открытые ключи) для других пользователей, оно может разрешить другим пользователям расшифровывать файл, выполняя вызовы CryptExportKey для каждого пользователя, который должен получить доступ. Возвращаемые ключевые BLOB-объекты должны храниться приложением, как показано на шаге 5.

 

Создание зашифрованного сообщения

Упрощенные функции сообщений упрощают шифрование и расшифровку данных. На следующем рисунке показаны отдельные задачи, которые необходимо выполнить для шифрования сообщения. Шаги описаны в следующем списке.

шифрование сообщения

Шифрование сообщения

  1. Получение указателя на сообщение в виде открытого текста.
  2. Создание симметричного (сеансового) ключа.
  3. Используя симметричный ключ и указанный алгоритм шифрования, зашифруйте данные сообщения.
  4. Откройте хранилище сертификатов.
  5. Получите сертификат получателя.
  6. Получите открытый ключ из сертификата получателя.
  7. Используя открытый ключ получателя, зашифруйте симметричный ключ.
  8. Получите идентификатор получателя из сертификата получателя.
  9. Включите в сообщение с цифровой оболочкой следующее: алгоритм шифрования данных, зашифрованные данные, зашифрованный симметричный ключ и идентификатор получателя.