Seguridad en Correo Electrónico con PGP



Autores: Jesus Sanz de las Heras y Rubén Martínez
Creación: Noviembre 1995
Status: Divulgativo.

Introducción.

PGP es una aplicación de propósito general independiente del S.O.

Fue introducido en 1991 y su crecimiento explosivo ha sido debido a:

  • Software de dominio público.
  • PGP corre en una gran variedad de plataformas.
  • Está basado en algoritmos extremadamente seguros:

RSA: para cifrado de claves.
IDEA: para cifrado del documento propiamente dicho.
MD5: hash seguro para crear firmas digitales.

PGP ofrece tres servicios:

  1. Confidencialidad. Permite a un usuario, mediante cifrado, garantizar que solamente el destinatario podrá leer el mensaje.
  2. Autentificación. Permite a un usuario firmar un documento antes de enviarlo, lo cual permite:
    • Tener certeza de que el documento no ha sido modificado puesto que ha sido firmado. Si se alterara el mensaje la firma no sería válida.
    • Verificar que el documento ha sido firmado por una determinada persona.
  3. Integridad. La firma antes mencionada tiene la particularidad de que depende no sólo de la identidad del remitente sino también del contenido del mensaje, por lo que si éste es alterado, la firma ya no es válida.

Cifrado convencional (simétrico).

Ejemplo: Si Pedro quiere enviar un mensaje seguro a María , Pedro coloca el mensaje en una caja y la cierra con una llave. La caja es enviada a María, nadie podría ver el mensaje pues la caja está cerrada. Cuando María coge la caja la abre con una copia de la la misma llave con la que la cerró Pedro. El inconveniente es que ambos deben tener la misma llave, por lo que uno tiene que mandársela al otro pudiendo ser robada en el camino.

Cifrado con Clave Pública (asimétrico).

Es asimétrico porque necesita dos claves distintas a diferencia del cifrado convencional.

Ejemplo: Imaginemos una caja con un mecanismo de cierre que use dos tipos de llaves. Una llave que gira hacia la izquierda y la otra llave que gira hacia la derecha . Es decir, para abrir la caja es necesario girar a derecha e izquierda, dejando el mecanismo en el centro. Si se gira sólo hacia la derecha (o izquierda) no podrá abrirse, si se cierra con la derecha se podrá abrir con la izquierda y viceversa.

Supongamos que Pedro quiere enviar un mensaje seguro a María, y que Pedro tiene la llave D (derecha) y María la I (izquierda). Pedro coloca el mensaje en la caja y lo cierra con su llave D, la caja es enviada y nadie podrá abrirla excepto María que tiene la llave I.

Y supongamos que en una comunidad sus miembros se compran una caja con dos llaves D e I y que cada uno de ellos se queda con su llave D (privada) y que las llaves I son compartidas por todos (públicas) y colocadas en un cajetín, cada llave I con el nombre de su dueño/a. De esta forma se tiene una confidencialidad total, ya que si Pedro quiere enviar un mensaje seguro a María lo mete en la caja con la llave I (izquierda) de María (llave pública de María) de esta forma solo María podría abrir la caja con su llave D (derecha).

Los pasos esenciales son los siguientes:

  • Cada usuario genera una par de claves usadas para el cifrado y descifrado de mensajes.
  • Cada usuario pone a disposición pública una de las claves (clave pública), la otra es la clave privada.
  • Si Pedro desea enviar un mensaje privado a María, debe de cifrarlo con la clave pública de María, para que sólo ella pueda abrirlo.
  • Cuando María recibe el mensaje lo descifra usando su clave privada. Ningún otro receptor puede descifrar el mensaje.

Ventajas del cifrado asimétrico respecto al convencional.

Con el cifrado convencional se requiere que ambas partes compartan una clave secreta. Cada par emisor/receptor debe compartir una clave secreta, por lo tanto una de las mayores desventajas es la necesidad de un medio de distribución segura de las claves entre emisor/receptor. En el cifrado asimétrico este problema desaparece, porque no es necesario distribuir la clave privada. El único problema adicional es la seguridad de que una clave pública sea de verdad de quien dice ser el propietario. Mas adelante veremos cómo se resuelve ese problema.

Firmas Digitales.

Hemos visto cómo resolver el problema de la confidencialidad, veamos ahora cómo la criptografía de clave pública resuelve los problemas de autentificación e integridad.

Esta "Firma digital" se genera utilizando dos cosas: clave privada del remitente, y un extracto del mensaje obtenido mediante hashing, de manera que depende del contenido de todo el mensaje. Este extracto es cifrado con la clave privada y el resultado (firma digital) es incluido al final del mensaje.

Ejemplo: supongamos que Pedro desea enviar un mensaje seguro a María. Pedro genera una "firma digital" de su mensaje, la adjunta al final del mismo y se lo envía a María.

María al ver la "firma digital" tiene la oportunidad de verificar que el mensaje ha sido enviado por Pedro. Primero, María actuando sobre el contenido del mensaje, usa la misma función "hash" que Pedro para obtener la firma de ese mensaje. Segundo, descifra la firma digital recibida usando la clave pública de Pedro, obteniendo así la firma del mensaje original. Si ambas coinciden tiene la prueba de que el mensaje no ha sido modificado. Además, dado que ha podido usar la clave pública de Pedro, tiene la garantía de que sólo él podrá haber haber cifrado la firma con su clave privada (todo este proceso es realizado automáticamente sin intervención por parte del usuario)

  • NO se puede robar la "firma digital" de un mensaje en tránsito.

    Pues aunque se pueda generar una firma "hash" del mismo no se podría cifrar ya que no se conoce la clave privada del emisor.

  • NO se puede eliminar o modificar el contenido de un mensaje con "firma digital".

    Porque el nuevo mensaje tendrá una firma "hash" diferente que el viejo y fallará la verificación.

  • SÍ se puede ver el contenido del mensaje.

    La "firma digital" proporciona autentificación y garantía de integridad, pero no confidencialidad. Para obtener confidencialidad también habría que seguir los pasos descritos arriba en el apartado de "cifrado asimétrico" además de los descritos aquí.

Enviando y recibiendo mensajes PGP.

El envío de mensajes consiste basicamente de 4 pasos:

  1. Firma digital.

    Este primer paso es opcional. Partiendo de un texto normal lo primero que hace PGP es la creación de una "firma digital", la cual garantiza tanto la integridad del mensaje como la autenticidad de su origen, como se ha explicado.

  2. Compresión.

    Este paso es automáticamente ejecutado por PGP a no ser que el usuario no desee hacerlo. Se obtiene una reducción notable del tamaño del mensaje, sobre todo si es texto. PGP usa ZIP para la compresión. Por defecto, sólo las partes cifradas son comprimidas.

  3. Cifrado del mensaje.

    Este paso también es opcional. PGP utiliza el algoritmo IDEA para cifrar, combinado con RSA. Se genera una clave de sesión. Mediante el algoritmo IDEA y esta clave de sesión, se cifra el mensaje. La clave se cifra a su vez mediante el algoritmo RSA y la clave pública del receptor. El motivo de no usar RSA para todo el mensaje es que no sería eficiente, especialmente si tiene varios receptores (habría que incluir un mensaje cifrado completo por receptor, mientras que con el sistema elegido sólo hay que incluir un cifrado de la clave de sesión por receptor).

  4. Codificación.

    Firma, compresión y cifrado no generan un fichero de texto sino binarios. Como la aplicación principal de PGP es el correo, que requiere caracteres ASCII, PGP puede codificar el documento resultante mediante el algoritmo BASE64 automáticamente.

Para la recepción de mensajes PGP simplemente se invierten todos los pasos del proceso de envío:

  1. Paso de ASCII a binario, si el mensaje fue codificado.
  2. Si el mensaje está cifrado PGP recupera la clave de sesión, la cual fue cifrada usando RSA con la clave pública del receptor. Por lo tanto el receptor usará su clave privada para obtener la clave de sesión. Con la clave de sesión PGP descifra el mensaje usando el algoritmo de descifrado IDEA.
  3. Descompresión del mensaje, si estaba comprimido.
  4. Si el mensaje fue firmado PGP verifica la firma, la cual fue cifrada con la clave privada del emisor del mensaje por lo que PGP usara la clave pública de este usuario. Se extrae el "hash" del mensaje y PGP lo compara con el que ha calculado; si los dos encajan la firma es verificada.

Ejemplo de uso de PGP en la práctica.

PGP mantiene para cada usuario dos ficheros, pubring.pgp (con todas las claves públicas que este usuario conoce) y secring.pgp (con su clave privada). El procedimiento para la generación de las claves se ejecuta una vez por usuario.

Los siguientes ejemplos asumen un entorno UNIX. Las versiones disponibles para Windows o Macintosh incluyen interfaces de usuario para realizar las mismas funciones.

  • Generación de claves.

    Ejecutar "pgp -kg". Se nos pedirá una identificación (normalmente es nombre mas dirección de email), y un password. Generara un par de claves, asociadas a esa identificación y protegidas con el password.

  • Recepción de un mensaje.

    Ejecutar "pgp fichero". Automaticamente se ejecutaran los siguientes pasos:

    • Si contiene claves públicas son incluidas en pubring.pgp.
    • Si contiene firmas digitales son comprobadas, indicando si son válidas o no, y de quién son (siempre que conozca sus claves públicas correspondientes).
    • Si contiene algún texto cifrado lo descifra (siempre que conozca sus claves públicas correspondientes).

  • Emisión de un mensaje.

    Ejecutar alguna de las tres opciones siguientes (se necesita el password utilizado durante la generación de las claves)

    • Cifrado: "pgp -e fichero"
    • Firmado: "pgp -s fichero"
    • Ambas cosas: "pgp -es fichero"

Si se requiere cifrado se nos preguntará el destinatario, y se requerirá tener ya su clave pública.

Gestión de claves

Dado que las claves públicas están (por definición) disponibles para todo el mundo, se necesita alguna forma de asegurar su autenticidad. Es por eso que las claves pueden ser firmadas, como los mensajes. Cuando PGP detecta una clave nueva, nos muestra todas las firmas que contiene, y nos pregunta si queremos firmarla con nuestra propia firma. Solo en el caso de que no exista NINGUNA duda acerca de la autenticidad de la clave debemos hacerlo.

Para facilitar la comprobación de claves a través de otros canales (por ejemplo, por teléfono o en persona), es posible obtener la "huella digital" (fingerprint) de una clave. Esto consiste en 16 números determinados por la clave secreta, de manera que la probabilidad de que otra clave distinta tenga los mismos números es muy baja.

Hay veces en las que, aunque nosotros mismos no podamos garantizar la autenticidad de una firma, las firmas que la avalan tienen prestigio suficiente como para que no dudemos. Cada vez que PGP detecta una firma nueva, nos pregunta también hasta que punto nos fiaríamos de la misma para que actuara de "sponsor" de otras firmas. Hay varios niveles de credibilidad: desconfianza, desconocimiento, confianza marginal y confianza absoluta. Es posible configurar PGP para definir que es lo que entendemos por una firma fiable: por ejemplo, puedo decidir que una firma será fiable si tiene al menos un "sponsor" de confianza absoluta o al menos 3 de confianza marginal.

Supongamos ahora que nos llega una clave nueva de un tal señor X, y a su vez va avalada por la firma de los señores Y y Z. Si decidimos incluir esta nueva clave pueden pasar varias cosas:

  • Supongamos que tenemos ya la clave pública de Y, como "de toda confianza" y la de Z, como "confianza marginal". Dado que hay un aval de confianza, la clave de X será aceptada sin mas.
  • Supongamos que la clave de Y es tambien de "confianza marginal". Si tenemos configurado PGP para aceptar dos confirmaciones marginales, la clave será aceptada. Si exigimos tres o mas, se nos pedirá confirmación:

    Key is not completely verified.

    Generally trusted verification from Y 'identificacion de Y...'

    Generally trusted verification from Z 'identificacion de Y...'

  • Supongamos que la clave de Y y Z, o bien no son conocidas o su nivel de confianza es "desconocido'". También se nos pedirá confirmación, por ejemplo:

    Key is not completely verified.

    Questionable verification from 'unknown signator, can't be checked'

    Questionable verification from Z 'identificacion de Z...'

En este caso, PGP no tiene la clave pública de Y, y aunque tiene la de Z, el nivel de confianza asignado a la misma es "desconocido".

Distribución de claves

Se puede dar el caso de que recibamos un documento avalado por PGP pero no tengamos la clave pública necesaria para comprobarlo. Hay varios formas de conseguir una clave, y la mas sencilla es recurrir a un servidor de claves. Un servidor de claves esta basado en correo electrónico, y entiende comandos simples en la línea "Subject:":

  • Subject: add
    Mensaje: claves públicas
    Acción: el keyserver las incluirá en su base de datos

  • Subject: get
    Acción: nos devolverá un mensaje con la clave correspondiente a la identificación.

  • Subject: mget
    Acción: nos devolverá un mensaje con todas las claves cuya identificación concuerde con esa expresión regular (*=todas las del servidor)

Esto es un ejemplo, la sintaxis puede variar en otros servidores; en cualquier caso un mensaje con 'help' en el subject informara de los comandos existentes.

Hay que tener en cuenta que cualquiera puede mandar claves a un keyserver, así que este no garantiza de por si su autenticidad (para eso está el mecanismo de verificación que las propias claves incluyen). El keyserver actúa como base de datos, organizador y distribuidor, y al mismo tiempo intercambia claves con otros keyservers, de manera que la información de todos ellos sea coherente.

Supongamos que una organización se dedica a firmar claves de usuarios, garantizando que estas son autenticas. Eso es lo que se conoce como una "autoridad de certificación" (CA), sus funciones van mas allá que las del simple servidor de claves, que no deja de ser un servicio pasivo. Las CA se organizan jerárquicamente, y aunque en principio pueden asumir cualquier sistema basado en la criptografía de clave pública, su mayor utilidad es para aquellos que al contrario que PGP no incluyen un mecanismo interno de certificación de claves. El establecimiento de CA normalmente no parte de iniciativas individuales, sino que se realiza de forma coordinada con otras CA ya existentes, integrándose en la jerarquía.

Finalmente, otro medio utilizado por algunas personas es el grupo de News 'alt.pgp.keydist'.

Esta página ha sido firmada digitalmente usando PGP