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.
- 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
Crie ou recupere o conteúdo.
Obter um provedor criptográfico.
Obtenha um certificado de destinatário.
Inicialize a estrutura de CMSG_ENVELOPED_ENCODE_INFO .
Chame CryptMsgCalculateEncodedLength para obter o tamanho do BLOB de mensagem codificado. Alocar memória para ele.
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.
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.
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.
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.
Tópicos relacionados