Formato de los mensajes PGP

Formato de los mensajes PGP

Los datos que procesa PGP se codifican con unas estructuras de datos llamadas paquetes PGP. Un mensaje PGP está formado, pues, por uno o más paquetes PGP.

Un paquete PGP es una secuencia de bytes, con una cabecera que indica de qué tipo de paquete se trata y su longitud y, a continuación, unos campos de datos que dependen del tipo de paquete.

El formato V3 define diez tipos de paquetes, mientras que el formato V4 define catorce. A continuación veremos los principales tipos de paquetes PGP.

1) Paquete de datos literales

Sirve para representar datos en claro, sin cifrar (sería el análogo del contenido Data en PKCS #7).

En un paquete de este tipo existe un campo que da el valor de los datos, y otro que indica si este valor se debe procesar como texto o como datos binarios. En el primer caso, las secuencias <CR><LF> que haya en el texto corresponden a finales de línea y se pueden convertir a la representación local cuando se tengan que visualizar o guardar en fichero, mientras que en el segundo caso no se tienen que modificar.

2) Paquete de datos comprimidos

En este tipo de paquete hay un campo que indica el algoritmo de compresión, y otro que contiene una secuencia de bytes comprimida. Cuando se descomprimen estos bytes, el resultado debe ser uno o más paquetes PGP. Normalmente lo que se comprime es un paquete de datos literales, opcionalmente precedido por un paquete de firma (que veremos a continuación).

Algoritmos de compresión

El algoritmo de compresión que utiliza PGP es el ZIP (RFC 1951), y OpenPGP utiliza también el algoritmo ZLIB (RFC 1950).

3) Paquete de datos cifrados con clave simétrica

El contenido de este paquete es directamente una secuencia de bytes cifra-dos con un algoritmo simétrico. El resultado de descifrarlos tiene que ser un o más paquetes PGP.

Cifrado simétrico en PGP

PGP utiliza el modo CFB para el cifrado simétrico. En lugar de especificar aparte el vector de inicialización (VI) se usa un VI igual a cero, pero a los datos que hay que cifrar se les antepone una cadena de 10 bytes: los 8 primeros son aleatorios, y los otros 2 son redundantes (iguales al 7o y 8o) y sirven para que el destinatario compruebe si ha usado la clave correcta para descifrar.

Típicamente lo que se cifra simétricamente son paquetes de datos en claro o paquetes de datos comprimidos. Los paquetes de este tipo se usan para enviar un mensaje de correo cifrado con sobre digital, o bien cuando el usuario quiere simplemente cifrar un fichero. En el primer caso, es preciso adjuntar al mensaje la clave simétrica cifrada de tal forma que sólo la pueda descifrar el destinatario o destinatarios.

Esto se realiza con paquetes cifrados con clave pública (el tipo de paquete PGP que veremos a continuación). En el segundo caso, la clave no se guarda en ningún sitio sino que el usuario la tiene que recordar cuando quiera descifrar el fichero. En realidad, el usuario no da directamente la clave de cifrado si no una passphrase, a partir de la cual se obtiene la clave simétrica aplicándole una función de hash.

4) Paquete de datos cifrados con clave pública

En este tipo de paquete hay un campo que sirve para identificar la clave pública utilizada, otro que indica el algoritmo de cifrado, y otro con los datos cifrados.

Habitualmente este paquete se utilizaba para cifrar una clave de sesión, con la cual se habrá generado un paquete de datos cifrados simétricamente, para enviar un mensaje con sobre digital. La clave pública utilizada en este caso es la de cada uno de los destinatarios del mensaje.

5) Paquete de firma

Un paquete de este tipo contiene campos con la siguiente información:

• Clase de firma, que puede ser:
– Firma de datos binarios.
– Firma de texto canónico.
– Certificado, es decir, asociación de clave pública con nombre de usuario.
– Revocación de clave pública.
– Revocación de certificado.
– Fechado (timestamp).

• Fecha y hora en que se creó la firma.

• Identificador de la clave con la que se ha creado.

• Algoritmos utilizados para el hash y el cifrado asimétrico.

• La firma, que se obtiene aplicando los algoritmos especificados en los datos que hay que firmar, concatenados con los campos autenticados. En el formato V3 estos campos autenticados son la clase de firma y la fecha de creación. En el formato V4 se puede especificar que otros campos se autentican.

• Otros campos añadidos en el formato V4, entre los cuales hay:
– Fecha de caducidad de la firma y de la clave.
– Comentarios del autor de la firma.
– Motivo de revocación (en el caso de las firmas de revocación).

El modo de saber a qué datos corresponde una firma depende del contexto. Si es la firma de un mensaje de correo, en el mismo mensaje tiene que haber el paquete con los datos (normalmente datos literales) después del de firma. Si es un certificado o una revocación, la firma tiene que ir después de los paquetes de clave pública y de nombre de usuario correspondientes (a continuación veremos estos dos tipos de paquetes PGP).

También es posible firmar el contenido de un fichero y dejar el paquete de firma en un fichero separado. Esto se suele hacer cuando se distribuyen programas (como, por ejemplo, el propio PGP) para garantizar que una versión es auténtica y no constituye un “caballo de Troya”. En este caso la asociación entre datos y firma se puede establecer mediante los nombres
de los ficheros: por ejemplo, el fichero con la firma se puede llamar como el original, pero con la extensión .sig.

6) Paquete de clave pública

Este tipo de paquete contiene la siguiente información relativa a una clave pública:

• La fecha de creación de la clave.
• El algoritmo al que corresponde la clave.
• Los valores de los componentes de la clave. Si el algoritmo es RSA, estos valores son el módulo n y el exponente público e.

Otros campos del paquete de clave pública

En el formato V3 hay un campo que indica el período de validez de la clave, pero todas las implementaciones lo ponen a 0, que indica que las claves son válidas para siempre. En el formato V4 esta información se especifica en los paquetes de firma. Por otro lado, en V4 están previstos componentes de la clave pública para otros algoritmos además del RSA.

La clave pública de un usuario se utiliza para enviarle datos cifrados o para verificar las firmas que genere. Pero los paquetes correspondientes (datos cifrados con clave pública o firma, respectivamente) no contienen el valor de la clave pública utilizada, sino solamente su identificador de clave.

El identificador de una clave pública es un número de ocho bytes que se puede utilizar para buscar el valor de la clave en una base de datos.

Identificadores de claves PGP repetidos

Las implementaciones no tienen que suponer que los identificadores de clave sean únicos: podría haber dos claves PGP distintas con el mismo identificador. Sin embargo, la probabilidad de que pase esto es muy baja (a no ser que se haga deliberadamente), porque puede haber 264 (> 1019) identificadores distintos. Si, por ejemplo, una firma está generada con una clave que tiene un determinado identificador, y resulta que hay dos claves con este identificador, es preciso verificarla con cada una de las claves para comprobar si es válida.

Valor del identificador de clave

En las claves V3 (que son siempre claves RSA) el identificador es igual a los 8 bytes de menos peso del módulo público n. En
las claves V4 es igual a los 8 bytes de menos peso de la huella (más adelante veremos que son las huellas PGP).

7) Paquete de nombre de usuario

El contenido de un paquete de este tipo es simplemente una cadena de caracteres, que se utiliza para identificar el propietario de una clave pública.

Por tanto, tiene la misma función que el DN del sujeto en los certificados X.509, pero sin ninguna estructura predefinida.
Aunque su formato es libre, se suele seguir el convenio de identificar a los usuarios con direcciones de correo electrónico RFC 822 como, por ejemplo:

. Philip R. Zimmermann <prz@acm.org>

8) Paquete de clave privada

Este tipo de paquete sirve para guardar los componentes de la clave privada de un usuario. Nunca existe ningún motivo para enviarlo a otro usuario y, por lo tanto, el formato exacto del paquete puede depender de la implementación.

Para asegurar la confidencialidad, en el fichero donde se guarde este paquete los componentes secretos de la clave deberían estar cifrados, normalmente con una clave simétrica derivada de una passphrase. De este modo, cada vez que el usuario quiera descifrar o firmar un mensaje con su clave privada, deberá indicar esta passphrase para poder obtener los valores necesarios.
Un usuario puede tener varias claves, asociadas al mismo o a distintos nombres. En el fichero en el que hayan los paquetes de clave privada, a continuación de cada uno habrá el paquete o paquetes de nombre de usuario correspondientes.

9) Paquete de nivel de confianza en una clave

Este tipo de paquete tampoco se envía nunca sino que solamente se guarda en el almacén de claves propio de cada usuario, ya que únicamente tiene significado para quien lo ha generado. Sirve para indicar el grado de fiabilidad de una clave certificadora, es decir, se utiliza para asociar otras claves con nombres de usuarios.

En el formato V3 hay otro tipo de paquete que sirve para incluir comentarios, pero se ha suprimido en el formato V4 porque no lo utilizaba ninguna implementación.

El formato V4 también utiliza otros cinco tipos de paquetes, entre ellos los relacionados con las llamadas subclaves. Una clave puede tener asociadas una o más subclaves: normalmente, la clave principal se utiliza para firmar y las subclaves, para cifrar.

 

Fuente:

Aspectos avanzados de seguridad en redes
UOC
Jordi Herrera Joancomartí (coord.)
Joaquín García Alfaro
XP04/90789/00892
Xavier Perramón Tornil

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Subir

Canal de aprender-libre.com

Reciba todas las publicaciones desde nuestro canal en Telegram

UNIRSE
CERRAR