S / MIME se basa en CMS (el nombre estándar de lo que anteriormente se conocía como "PKCS # 7"). Un correo electrónico cifrado es realmente un objeto envelope-data de CMS. La mayor parte de los datos están cifrados simétricamente, con una clave que se deriva / intercambia utilizando uno de los mecanismos de transporte detallados en la sección 6.2 :
-
KeyTransRecipientInfo es básicamente un cifrado asimétrico con la clave pública del destinatario. Eso es lo que se usa cuando el destinatario tiene una clave RSA apta para el cifrado (es decir, no una clave RSA etiquetada en su certificado como "solo firma").
-
KeyAgreeRecipientInfo es para algoritmos de intercambio de claves que no son cifrado asimétrico. Lo usarás si el destinatario tiene una clave Diffie-Hellman.
-
KEKRecipientInfo se usa cuando hay una clave simétrica compartida (alta entropía) entre el remitente y el destinatario.
-
PasswordRecipientInfo se usa cuando hay una contraseña compartida entre el remitente y el destinatario ( que, por lo tanto, requiere un extenso hashing de contraseña para compensar la debilidad inherente de la contraseña).
-
OtherRecipientInfo es para todos los demás casos, que no encajan en las categorías arriba.
El punto crítico es que tanto para KeyTransRecipientInfo como para KeyAgreeRecipientInfo, la clave pública del destinatario (ya sea RSA, Diffie-Hellman ...) puede identificarse de dos maneras:
RecipientIdentifier ::= CHOICE {
issuerAndSerialNumber IssuerAndSerialNumber,
subjectKeyIdentifier [0] SubjectKeyIdentifier }
KeyAgreeRecipientIdentifier ::= CHOICE {
issuerAndSerialNumber IssuerAndSerialNumber,
rKeyId [0] IMPLICIT RecipientKeyIdentifier }
RecipientKeyIdentifier ::= SEQUENCE {
subjectKeyIdentifier SubjectKeyIdentifier,
date GeneralizedTime OPTIONAL,
other OtherKeyAttribute OPTIONAL }
SubjectKeyIdentifier ::= OCTET STRING
Cuando la clave pública proviene de un certificado, entonces la clave pública se puede identificar usando "issuerAndSerialNumber" (una copia de los campos "issuerDN" y "serialNumber" del certificado), o con el "identificador de clave del sujeto" . Este último es un conjunto de bytes que pueden opcionalmente incluirse en un certificado (como Extensión del identificador de clave del sujeto ). Cualquiera de las dos informaciones se extrae fácilmente del certificado. Nunca necesita el certificado completo, pero necesita partes de él.
S / MIME también admite claves públicas que no se obtienen de los certificados, sino de "Preferencias S / MIME". La idea es (o tal vez fue? No lo he visto en mucho tiempo) que un usuario puede tener solo un certificado de firma (por ejemplo, con una clave DSA). En ese caso, ese usuario podría generar su propio par de claves para el cifrado asimétrico o el intercambio de claves, firmar la parte pública e incluirla en los mensajes que envíe. Las personas que desean responder pueden usar esa clave pública para el transporte clave o el acuerdo clave. Dado que esa clave no está contenida en un certificado, no se puede identificar con campos del certificado. En su lugar, se identificará con un "identificador de clave" similar al "identificador de clave de sujeto", es decir, un grupo de bytes.
Resumen: todo el cifrado usa solo la clave , pero el formato del mensaje debe incluir una designación de la clave que se usó, y esa designación usará campos extraídos de el certificado del destinatario (si la clave pública del destinatario proviene de un certificado).