Todos los sistemas que he usado hacen lo siguiente
- Calcule un hash del mensaje usando un algoritmo de hashing.
- Cree una firma digital del valor de hash utilizando criptografía de clave pública.
- esencialmente este es el valor cifrado del hash
- Agregue la firma al mensaje (o viceversa) en un contenedor.
Esto proporciona una prueba de la identidad del remitente y la integridad del mensaje sin proporcionar confidencialidad.
El destinatario entonces
- use la clave pública del remitente para descifrar la firma y obtener el valor hash,
- calcula de forma independiente el valor de hash del texto del mensaje
- compare los dos valores hash para verificar la autoría y la integridad del mensaje
Un ejemplo de esto es XML-DSIG
Un mensaje XML firmado podría tener este tipo de estructura.
<Envelope>
<Header>
<Signature>
...
</Signature>
</Header>
<Body>
<From>Sue</From>
<Text>Meet at Foo HQ at 12:30!</Text>
</Body>
</Envelope>
El contenido del mensaje no es reproducible a partir de la firma. Las dos cosas están separadas.
Ideas similares se aplican a otros usos de firmas digitales.
Una razón es que la criptografía de clave pública es lenta, por lo que la aplica a la menor cantidad de datos necesarios para su propósito.
Si necesita confidencialidad, puede cifrar el cuerpo del mensaje utilizando una criptografía simétrica (clave compartida) más rápida. Luego, el remitente puede incluir la clave simétrica con el hash del cuerpo y otra materia cifrada mediante la criptografía de clave pública. El hash se cifra con la clave privada del remitente, pero la clave compartida se cifrará con la clave pública del destinatario. La clave compartida y el hash del mensaje generalmente serán mucho más cortos que el contenido promedio del cuerpo del mensaje, por lo que este enfoque es más rápido y hace un mejor uso de los recursos informáticos.