Codificación de datos sobres

Los datos sobres constan de contenido cifrado de cualquier tipo y claves de sesión de cifrado de contenido cifradas para uno o varios destinatarios. Los mensajes sobres mantienen el contenido del secreto del mensaje y permiten que solo las personas o entidades especificadas recuperen el contenido.

La sintaxis de mensajes criptográficos (CMS) se puede usar para codificar mensajes sobres. CMS admite tres técnicas de administración de claves: transporte de claves, acuerdo de claves y claves de cifrado de claves (KEK) previamente distribuidas. La KEK simétrica distribuida anteriormente también se conoce como distribución de claves de lista de distribución de correo.

En cada una de estas tres técnicas, se genera una clave de sesión única para cifrar el mensaje sobre. Los problemas de administración de claves tratan la forma en que el remitente cifra la clave de sesión y la descifra un receptor. Un único mensaje cifrado se puede distribuir a muchos destinatarios mediante una combinación de las técnicas de administración de claves.

La administración de claves de transporte de claves usa la clave pública de un receptor previsto para cifrar la clave de sesión. El receptor descifra la clave de sesión mediante la clave privada asociada a la clave pública que se usó para cifrar. A continuación, el receptor usa la clave de sesión descifrada para descifrar los datos sobres. Cuando se usa el transporte de claves, el receptor no ha confirmado información sobre la identidad del remitente.

En la administración de contratos de claves, se genera una clave privada temporal efímera Diffie-Hellman y se usa para cifrar la clave de sesión. La clave pública correspondiente a la clave privada efímera se incluye como parte de la información del destinatario del mensaje. El destinatario descifra la clave de sesión mediante la clave efímera recibida y usa esta clave de sesión descifrada para descifrar el mensaje sobre. Con el acuerdo de clave efímera junto con la clave privada del receptor, el receptor del mensaje tiene información confirmada sobre la identidad del remitente.

Para la administración de claves mediante claves simétricas distribuidas previamente, cada mensaje incluye la clave de cifrado de contenido que se ha cifrado con una clave de cifrado de clave distribuida previamente. Los receptores usan la clave de cifrado de clave distribuida previamente para descifrar la clave de cifrado de contenido y, a continuación, usan la clave de cifrado de contenido descifrada para descifrar el mensaje sobre.

En la ilustración siguiente se muestra una secuencia típica de eventos CMS para codificar datos sobres.

codificación de datos sobres

  • Se recupera un puntero al mensaje de texto no cifrado .
  • Se genera una clave simétrica (sesión).
  • La clave simétrica y el algoritmo de cifrado especificados se usan para cifrar los datos del mensaje.
  • Se abre un almacén de certificados .
  • El certificado del destinatario se recupera del almacén.
  • La clave pública se recupera del certificado del destinatario.
  • Con la clave pública del destinatario, la clave simétrica se cifra.
  • Desde el certificado del destinatario, se recupera el identificador del destinatario.
  • La siguiente información se incluye en el mensaje sobre digitalmente: el algoritmo de cifrado de datos, los datos cifrados, la clave simétrica cifrada y la estructura de información del destinatario.

Para usar funciones de mensaje de bajo nivel para realizar las tareas típicas que acaba de enumerar, use el procedimiento siguiente.

Para codificar un mensaje sobre

  1. Cree o recupere el contenido.

  2. Obtenga un proveedor criptográfico.

  3. Obtenga un certificado de destinatario.

  4. Inicialice la estructura CMSG_ENVELOPED_ENCODE_INFO .

  5. Llame a CryptMsgCalculateEncodedLength para obtener el tamaño del blob del mensaje codificado. Asigne memoria para ella.

  6. Llame a CryptMsgOpenToEncode, pasando CMSG_ENVELOPED para dwMsgType y un puntero a CMSG_ENVELOPED_ENCODE_INFO para pvMsgEncodeInfo. Como resultado de esta llamada, obtendrá un identificador para el mensaje abierto.

  7. Llame a CryptMsgUpdate, pasando el identificador recuperado en el paso 6 y un puntero a los datos que se van a cifrar, envolver y codificar. Se puede llamar a esta función tantas veces como sea necesario para completar el proceso de codificación.

  8. Llame a CryptMsgGetParam, pasando el identificador recuperado en el paso 6 y los tipos de parámetro adecuados para acceder a los datos deseados codificados. Por ejemplo, pase CMSG_CONTENT_PARAM para obtener un puntero al mensaje completo de PKCS #7.

    Si el resultado de esta codificación se va a usar como datos internos para otro mensaje codificado, como un mensaje sobre, se debe pasar el parámetro CMSG_BARE_CONTENT_PARAM. Para obtener un ejemplo, vea Código alternativo para codificar un mensaje sobre.

  9. Cierre el mensaje llamando a CryptMsgClose.

El resultado de este procedimiento es un mensaje codificado que contiene los datos cifrados, la clave simétrica cifrada con las claves públicas del destinatario y las estructuras de datos de información del destinatario. La combinación de contenido cifrado y una clave simétrica cifrada para un destinatario es un sobre digital para ese destinatario. Cualquier tipo de contenido se puede sobrer para varios destinatarios.

Programa C de ejemplo: codificación de un mensaje sobre y firmado