Compartilhar via


Codificando dados enveloped

Os dados enveloped consistem em conteúdo criptografado de qualquer tipo e chaves de sessão criptografadas de criptografia de conteúdo para um ou mais destinatários. As mensagens em envelope mantêm o conteúdo da mensagem em segredo e permitem que apenas pessoas ou entidades especificadas recuperem o conteúdo.

A sintaxe de mensagem criptográfica (CMS) pode ser usada para codificar mensagens em envelope. O CMS dá suporte a três técnicas de gerenciamento de chaves: transporte de chaves, contrato de chave e KEK (chaves de criptografia de chave simétricas) distribuídas anteriormente. A KEK simétrica distribuída anteriormente também é conhecida como distribuição de chave de lista de endereçamento.

Em cada uma dessas três técnicas, uma única chave de sessão é gerada para criptografar a mensagem em envelope. Os principais problemas de gerenciamento lidam com a maneira como essa chave de sessão é criptografada pelo remetente e descriptografada por um receptor. Uma única mensagem criptografada pode ser distribuída para muitos destinatários usando uma combinação das técnicas de gerenciamento de chaves.

O gerenciamento de chaves de transporte de chave usa a chave pública de um receptor pretendido para criptografar a chave de sessão. O receptor descriptografa a chave de sessão usando a chave privada associada à chave pública que foi usada para criptografar. Em seguida, o receptor usa a chave de sessão descriptografada para descriptografar os dados envolvidos. Quando o transporte de chave é usado, o receptor não confirmou informações sobre a identidade do remetente.

No gerenciamento de contratos-chave, uma chave privada Diffie-Hellman temporária e efêmera é gerada e usada para criptografar a chave de sessão. A chave pública correspondente à chave privada efêmera é incluída como parte das informações do destinatário da mensagem. O destinatário descriptografa a chave de sessão usando a chave efêmera recebida e usa essa chave de sessão descriptografada para descriptografar a mensagem enveloped. Usando o contrato de chave efêmera em conjunto com a chave privada do receptor, o receptor da mensagem tem informações confirmadas sobre a identidade do remetente.

Para o gerenciamento de chaves usando chaves simétricas distribuídas anteriormente, cada mensagem inclui a chave de criptografia de conteúdo que foi criptografada com uma chave de criptografia de chave distribuída anteriormente. Os receptores usam a chave de criptografia de chave distribuída anteriormente para descriptografar a chave de criptografia de conteúdo e, em seguida, usam a chave de criptografia de conteúdo descriptografada para descriptografar a mensagem enveloped.

Uma sequência típica de eventos cms para codificar dados enveloped, é mostrada na ilustração a seguir.

codificar dados enveloped

  • Um ponteiro para a mensagem de texto não criptografado é recuperado.
  • Uma chave simétrica (sessão) é gerada.
  • A chave simétrica e o algoritmo de criptografia especificado são usados para criptografar os dados da mensagem.
  • Um repositório de certificados é aberto.
  • O certificado do destinatário é recuperado do repositório.
  • A chave pública é recuperada do certificado do destinatário.
  • Usando a chave pública do destinatário, a chave simétrica é criptografada.
  • No certificado do destinatário, a ID do destinatário é recuperada.
  • As informações a seguir estão incluídas na mensagem em envelope digital: o algoritmo de criptografia de dados, os dados criptografados, a chave simétrica criptografada e a estrutura de informações do destinatário.

Para usar funções de mensagem de baixo nível para realizar as tarefas típicas listadas, use o procedimento a seguir.

Para codificar uma mensagem em envelope

  1. Crie ou recupere o conteúdo.

  2. Obter um provedor criptográfico.

  3. Obtenha um certificado de destinatário.

  4. Inicialize a estrutura de CMSG_ENVELOPED_ENCODE_INFO .

  5. Chame CryptMsgCalculateEncodedLength para obter o tamanho do BLOB de mensagem codificado. Alocar memória para ele.

  6. Chame CryptMsgOpenToEncode, passando CMSG_ENVELOPED para dwMsgType e um ponteiro para CMSG_ENVELOPED_ENCODE_INFO para pvMsgEncodeInfo. Como resultado dessa chamada, você obterá um identificador para a mensagem aberta.

  7. Chame CryptMsgUpdate, passando o identificador recuperado na etapa 6 e um ponteiro para os dados que devem ser criptografados, envolvidos e codificados. Essa função pode ser chamada quantas vezes forem necessárias para concluir o processo de codificação.

  8. Chame CryptMsgGetParam, passando o identificador recuperado na etapa 6 e os tipos de parâmetro apropriados para acessar os dados desejados e codificados. Por exemplo, passe CMSG_CONTENT_PARAM para obter um ponteiro para toda a mensagem PKCS nº 7.

    Se o resultado dessa codificação for usado como os dados internos de outra mensagem codificada, como uma mensagem em envelope, o parâmetro CMSG_BARE_CONTENT_PARAM deverá ser passado. Para obter um exemplo, consulte Código alternativo para codificar uma mensagem enveloped.

  9. Feche a mensagem chamando CryptMsgClose.

O resultado desse procedimento é uma mensagem codificada que contém os dados criptografados, a chave simétrica criptografada com as chaves públicas do destinatário e as estruturas de dados de informações do destinatário. A combinação de conteúdo criptografado e uma chave simétrica criptografada para um destinatário é um envelope digital para esse destinatário. Qualquer tipo de conteúdo pode ser envolvido em vários destinatários.

Exemplo de programa C: codificando uma mensagem envelunciada e assinada