21
TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática Curso 2009-2010 Práctica adicional, convocatoria de febrero 1 OBJETIVOS Los objetivos de esta práctica adicional son los siguientes: 1. Estudiar y comprender los mecanismos de cifrado y de firma modernos. A modo de ejemplo, y con los conocimientos adquiridos, implementar un criptosistema basado en la aplicación conjunta de criptografía de clave pública (RSA) y de clave secreta (DES). 2. Estudiar y comprender el propósito y el funcionamiento de una PKI. A modo de ejemplo, implementar los siguientes componentes software: a. Un sistema de certificación digital, que permita generar certificados digitales. b. Una aplicación repositorio de certificados digitales, para almacenar y distribuir los certificados generados. 3. Implementar una aplicación de transferencia segura de ficheros, que permita el intercambio seguro de archivos entre usuarios a través de una red de comunicaciones. PRÁCTICA El guión de la práctica se estructura en cuatro apartados, en cada uno de los cuales se propone la implementación de un conjunto de componentes software. Se recomienda realizar los apartados propuestos en el orden establecido. NOTAS: La práctica podrá realizarse de forma individual o a lo sumo en grupos de dos. La práctica es opcional y permite optar a un máximo de 1 punto más en la nota global de la asignatura. No realizarla no supone una penalización en la nota de prácticas (las prácticas se siguen calificando sobre 1 punto y esta práctica permite obtener hasta un punto adicional). Ante cualquier aspecto no especificado en este enunciado el alumno deberá tomar las decisiones de implementación que considere oportunas. Dichas decisiones deberán ser justificadas en la evaluación presencial del programa que el profesor responsable realizará con el autor o autores del mismo. Se recomienda realizar las prácticas 1, 2 y 3 de la asignatura como paso previo a la realización de esta práctica adicional. La implementación se realizará obligatoriamente en lenguaje de programación C. Se utilizará obligatoriamente Linux como Sistema Operativo (la evaluación y prueba de la práctica se realizará en los equipos del laboratorio).

TÉCNICAS DE CODIFICACIÓN - it.uc3m.esividal/tc/Avanzada.pdf · práctica se realizará en los equipos del laboratorio). TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

  • Upload
    vuliem

  • View
    215

  • Download
    0

Embed Size (px)

Citation preview

Page 1: TÉCNICAS DE CODIFICACIÓN - it.uc3m.esividal/tc/Avanzada.pdf · práctica se realizará en los equipos del laboratorio). TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

Curso 2009-2010

Práctica adicional, convocatoria de febrero 1

OBJETIVOS

Los objetivos de esta práctica adicional son los siguientes:

1. Estudiar y comprender los mecanismos de cifrado y de firma modernos. A modo de

ejemplo, y con los conocimientos adquiridos, implementar un criptosistema basado en la aplicación conjunta de criptografía de clave pública (RSA) y de clave secreta (DES).

2. Estudiar y comprender el propósito y el funcionamiento de una PKI. A modo de ejemplo,

implementar los siguientes componentes software:

a. Un sistema de certificación digital, que permita generar certificados digitales. b. Una aplicación repositorio de certificados digitales, para almacenar y distribuir los

certificados generados.

3. Implementar una aplicación de transferencia segura de ficheros, que permita el intercambio seguro de archivos entre usuarios a través de una red de comunicaciones.

PRÁCTICA

El guión de la práctica se estructura en cuatro apartados, en cada uno de los cuales se propone la implementación de un conjunto de componentes software. Se recomienda realizar los apartados propuestos en el orden establecido. NOTAS:

La práctica podrá realizarse de forma individual o a lo sumo en grupos de dos.

La práctica es opcional y permite optar a un máximo de 1 punto más en la nota global de la asignatura. No realizarla no supone una penalización en la nota de prácticas (las prácticas se siguen calificando sobre 1 punto y esta práctica permite obtener hasta un punto adicional).

Ante cualquier aspecto no especificado en este enunciado el alumno deberá tomar las

decisiones de implementación que considere oportunas. Dichas decisiones deberán ser justificadas en la evaluación presencial del programa que el profesor responsable realizará con el autor o autores del mismo.

Se recomienda realizar las prácticas 1, 2 y 3 de la asignatura como paso previo a la

realización de esta práctica adicional.

La implementación se realizará obligatoriamente en lenguaje de programación C. Se utilizará obligatoriamente Linux como Sistema Operativo (la evaluación y prueba de la

práctica se realizará en los equipos del laboratorio).

Page 2: TÉCNICAS DE CODIFICACIÓN - it.uc3m.esividal/tc/Avanzada.pdf · práctica se realizará en los equipos del laboratorio). TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

Curso 2009-2010

Práctica adicional, convocatoria de febrero 2

Apartado 1: librería de cifrado simétrico

En este apartado se implementará una librería C que proporcione funciones para cifrar y descifrar textos de longitud arbitraria utilizando para ello el algoritmo simétrico DES (Data Encryption Standard) en algún modo de operación. Así, esta librería proporcionará la siguiente funcionalidad:

• Cifrado de textos de longitud arbitraria. Esta funcionalidad permitirá cifrar textos de cualquier longitud utilizando DES en modo de operación CFB (Output Feedback Mode) con tamaño de bloque de 32 bits. Puesto que los algoritmos de cifrado simétrico basados en la técnica de cifrado de bloques permiten cifrar bloques de texto plano de longitud fija, será necesario aplicar alguna técnica de relleno (padding) al fichero de entrada, de modo que su longitud sea múltiplo del tamaño de bloque utilizado. En este caso, se implementará la técnica de padding PKCS#5 [1].

• Descifrado de textos de longitud arbitraria. Esta funcionalidad será complementaria de la

anterior, permitiendo descifrar textos de cualquier longitud que han sido cifrados con DES en modo de operación OFB (Output FeedBack Mode) con tamaño de bloque de 16 bits.

Tras el proceso de descifrado se eliminará el padding introducido en el proceso de cifrado.

NOTAS:

Para simplificar la codificación de esta librería se proporciona como material complementario una librería C que implementa la funcionalidad básica de un cifrador DES. En el apéndice A se incluye información detallada sobre esta librería así como varios ejemplos de uso.

La codificación de los modos de operación de DES deberá ser realizada obligatoriamente por

el alumno, pudiendo utilizar únicamente a tal efecto la librería de cifrado DES que se proporciona como material complementario. El alumno no podrá utilizar en ningún caso ninguna implementación C existente de DES/OFB.

Apartado 2: librería de cifrado asimétrico En este apartado se implementará una librería C que proporcione funciones de cifrado y descifrado de textos de longitud arbitraria utilizando para ello el algoritmo asimétrico RSA (Rivest, Shamir, Adleman). Así, esta librería proporcionará la siguiente funcionalidad:

• Generación de claves RSA de 1024 bits. En la librería de cifrado asimétrico se implementará una función C que permita generar un par de claves RSA, una pública y su correspondiente clave privada. Cada una de estas claves será de 1024 bits.

• Funciones criptográficas RSA. Se implementarán funciones que permitan cifrar y descifrar

un texto de entrada de tamaño arbitrario, utilizando para ello el algoritmo RSA y una clave RSA.

Page 3: TÉCNICAS DE CODIFICACIÓN - it.uc3m.esividal/tc/Avanzada.pdf · práctica se realizará en los equipos del laboratorio). TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

Curso 2009-2010

Práctica adicional, convocatoria de febrero 3

NOTAS: La implementación de la función de generación de claves RSA se realizará siguiendo las

indicaciones contenidas en el apéndice B, en el apartado “Generación de claves RSA”.

La implementación de las funciones criptográficas RSA se realizará siguiendo las indicaciones contenidas en el apéndice B, en el apartado “Algoritmo de cifrado/descifrado RSA”.

La aplicación del algoritmo RSA a textos de longitud arbitraria se realizará siguiendo las

indicaciones contenidas en el apéndice B, en el apartado “Implementación en la práctica del algoritmo RSA”.

Para la generación de números primos se utilizará obligatoriamente y en cualquier caso el test

de primalidad de Rabin-Miller, siguiendo las indicaciones contenidas en el apéndice C.

Dado que la implementación del algoritmo RSA requiere realizar operaciones aritméticas con números enteros arbitrariamente grandes se recomienda utilizar la librería bn (multiprecision integer arithmetics) de C a tal efecto. Esta librería, además, proporciona un conjunto funciones de gran utilidad para la implementación del algoritmo RSA. El uso de esta librería requiere incluir la opción “–lssl” en las opciones de compilación de “gcc”.

No se podrán utilizar, en ningún caso, las funciones de la librería bn que son específicas para

la generación de números primos (sí se podrán utilizar el resto de funciones).

Apartado 3: aplicación de transferencia segura de archivos Finalmente, con el soporte de cifrado simétrico y asimétrico proporcionado por las dos librerías anteriores, se implementará una aplicación similar a scp (Secure Copy de Linux), que permita transferir archivos de forma segura entre equipos a través de una red de comunicaciones insegura, utilizando para ello un modelo cliente/servidor. La aplicación enviará todos los ficheros cifrados y firmados, garantizando de este modo confidencialidad, autenticación, integridad y no repudio de los datos transferidos. La aplicación de transferencia segura de archivos deberá cumplir obligatoriamente con los siguientes requisitos:

• El programa cliente consistirá en un único binario ejecutable, scopy, que se ejecutará a través de la línea de comandos con la siguiente sintaxis:

scopy sourceUser:sourceFile destUser@destHost:destFile

Dónde:

- sourceUser: cadena de texto que identifica al usuario que ejecuta el programa cliente.

Este campo típicamente consistirá en una cadena de texto alfanumérica sin espacios. - sourceFile: cadena de texto que contiene la localización en disco del fichero local que

se desea transmitir.

Page 4: TÉCNICAS DE CODIFICACIÓN - it.uc3m.esividal/tc/Avanzada.pdf · práctica se realizará en los equipos del laboratorio). TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

Curso 2009-2010

Práctica adicional, convocatoria de febrero 4

- destUser: cadena de texto que identifica al usuario al que se desea enviar el fichero

Este campo típicamente consistirá en una cadena de texto alfanumérica sin espacios. - destHost: dirección IP del host destino al que se transferirá el fichero.

- destFile: cadena de texto con la localización en disco en la que se almacenará el

fichero en el equipo remoto.

Los caracteres delimitadores ‘:’ y ‘@’ deberán aparecer de forma textual, tal y como se detallan en la especificación anterior.

• La aplicación servidor consistirá en un único binario ejecutable, scopyd, que ejecutará el

demonio servidor a través de la línea de comandos sin opciones. Así, a modo de ejemplo, supongamos que un usuario ‘john’ desea transmitir el fichero ‘example.txt’, que se encuentra almacenado en el directorio ‘/var’ de su máquina, al usuario ‘sarah’, que trabaja en la máquina 10.0.128.7. El fichero se almacenará en el equipo de Sarah, dentro del directorio ‘/home/sarah’. Para ello:

1. Sarah ejecuta el demonio servidor de la aplicación en el equipo 10.0.128.7:

2. John ejecuta el programa cliente en su equipo, con los parámetros indicados:

Como resultado de la ejecución del programa cliente, el fichero ‘example.txt’ se transfiere cifrado y firmado al equipo 10.0.128.7. En dicho equipo, el demonio servidor procesa la información recibida, descifrando el fichero y verificando la firma del mismo, y en ausencia de errores almacena el fichero ‘example.txt’ en el directorio destino ‘/home/sarah’. A continuación se especifican con detalle los esquemas de cifrado y de firma que deberán ser implementados por el programa cliente, así como los esquemas de descifrado y de verificación de firma que deberá implementar el demonio servidor. Asimismo, se especifican también los procedimientos a implementar para la gestión y el almacenamiento de las claves criptográficas necesarias en los procesos de cifrado y de firma digital. Gestión de claves criptográficas Al igual que en PGP [4], la aplicación de transferencia segura de archivos contará con dos ficheros en los que almacenará las claves de sus usuarios:

• El fichero de nombre “public.keys” es un fichero de texto que será utilizado para almacenar las claves públicas RSA de los usuarios conocidos. El formato de este fichero cumplirá obligatoriamente con los siguientes requisitos:

sarah:~> scopyd sarah:~>

john:~> scopy john:/var/example.txt [email protected]:/home/sarah/example.txt john:~>

Page 5: TÉCNICAS DE CODIFICACIÓN - it.uc3m.esividal/tc/Avanzada.pdf · práctica se realizará en los equipos del laboratorio). TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

Curso 2009-2010

Práctica adicional, convocatoria de febrero 5

- Contendrá una línea por cada clave pública.

- La sintaxis de cada línea será la siguiente:

‘user-id’ ‘ESPACIO’ ‘e’ ‘ESPACIO’ ‘n’ ‘ESPACIO’ ‘certificate-file’

donde: o ‘user-id’: cadena de texto que identifica al usuario al que pertenece la clave pública

especificada en esa línea del fichero. Este campo típicamente consistirá en una cadena de texto alfanumérica sin espacios.

o ‘ESPACIO’: es el carácter delimitador ‘ ‘. o ‘e’ y ‘n’: son los números enteros que representan la clave pública RSA, según se

indica en el apéndice B, del usuario ‘user-id’.

o ‘certificate-file’: cadena de texto que representa la localización en disco del fichero que contiene un certificado digital válido para la clave pública del usuario ‘user-id’.

• El fichero de nombre “secret.keys” será utilizado para almacenar las claves privadas RSA de

los usuarios que utilizan la aplicación en el equipo. Como veremos a continuación, éste no es un fichero de texto. El formato de este fichero cumplirá obligatoriamente con los siguientes requisitos:

- Contendrá una entrada por cada clave privada. - Cada entrada contendrá dos campos:

o ‘user-id’: cadena de texto que identifica al usuario al que pertenece la clave privada

especificada en esa entrada del fichero. Este campo típicamente consistirá en una cadena de texto alfanumérica sin espacios.

o ‘encrypted-key’: es el cifrado DES/OFB16 de la clave privada RSA del usuario con

una clave DES que solo él conoce. Dado que la salida del cifrador DES no tiene por que ser necesariamente representable por pantalla, la existencia de este campo implica que el fichero ‘secret.keys’ no es un fichero de texto.

Por otro lado, se implementará una aplicación que permita generar un par de claves RSA, una pública y su correspondiente clave privada. Esta aplicación consistirá en un único binario ejecutable, get-rsa-keys, que se ejecutará a través de la línea de comandos con la siguiente sintaxis:

get-rsa-keys user-id passphrase Dónde:

- user-id: identificador del usuario para el que se genera el par de claves RSA. Este identificador consistirá típicamente en una cadena de texto alfanumérica sin espacios.

- passphrase: cadena de texto que será utilizada como clave DES para cifrar la clave privada RSA del usuario en el fichero “secret.keys”. Típicamente, este campo tendrá una longitud de entre 1 y 8 caracteres y NO será almacenado en disco en ningún caso (es una contraseña que el usuario debe decordar).

Page 6: TÉCNICAS DE CODIFICACIÓN - it.uc3m.esividal/tc/Avanzada.pdf · práctica se realizará en los equipos del laboratorio). TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

Curso 2009-2010

Práctica adicional, convocatoria de febrero 6

Como resultado de la ejecución del programa ‘get-rsa-keys’ ocurrirá lo siguiente:

1. La aplicación genera dos claves RSA para el usuario ‘user-id’, una pública (e, n) y una privada (d, n).

2. Se añade una entrada al fichero “secret.keys” con el ‘user-id’ del usuario y la clave privada

RSA cifrada con el algoritmo DES/OFB16 y la passphrase indicada a través de la línea de comandos.

3. Se genera un fichero de salida (distinto del “public.keys”) en el que se almacena el ‘user-id’

del usuario y su clave pública RSA correspondiente (e, n). NOTA: en el proceso de generación de claves NO se almacena información en el fichero “public.keys”. En el apartado 4 veremos como se actualiza el contenido de este fichero. Operación de cifrado El mecanismo de cifrado a implementar será similar al implementado por PGP, particularizado para el uso de RSA como algoritmo de cifrado asimétrico y de DES como algoritmo de cifrado simétrico. El esquema de cifrado será implementado en el programa cliente y se presenta en la siguiente figura:

Básicamente, el esquema de cifrado consiste en los siguientes pasos:

1. Cifrado del texto de entrada, utilizando para ello el algoritmo de cifrado simétrico DES en modo de operación OFB. Para el cifrado se utilizará una clave DES elegida de forma aleatoria.

2. Cifrado de la clave DES utilizada en el cifrado del paso 1. Para ello se utilizará el algoritmo

asimétrico RSA con la clave pública RSA del usuario destinatario.

3. El cifrado final resultante consistirá en la concatenación del cifrado obtenido en el paso 2 y del cifrado obtenido en el paso 1 en un único texto cifrado de salida.

Operación de descifrado Esta operación permitirá descifrar los textos cifrados mediante la operación de cifrado. El esquema de descifrado será implementado por el demonio servidor y se presenta en la siguiente figura:

Page 7: TÉCNICAS DE CODIFICACIÓN - it.uc3m.esividal/tc/Avanzada.pdf · práctica se realizará en los equipos del laboratorio). TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

Curso 2009-2010

Práctica adicional, convocatoria de febrero 7

Básicamente, el esquema de descifrado consiste en los siguientes pasos:

1. El texto cifrado de entrada se divide en dos partes: el texto cifrado correspondiente a la clave de sesión y el texto cifrado correspondiente al texto plano original.

2. Descifrado de la clave de sesión. Para ello se utilizará el algoritmo asimétrico RSA con la

clave privada RSA del usuario destinatario. El demonio servidor solicitará al usuario destinatario la passphrase necesaria para descifrar su clave privada RSA.

3. Descifrado del texto cifrado, utilizando para ello el algoritmo de descifrado simétrico DES en

modo de operación OFB. Para el proceso de descifrado se utilizará la clave DES obtenida como resultado del paso 2.

Operación de generación de firma La operación de generación de firma permitirá generar la firma digital correspondiente a un fichero de entrada, utilizando para ello el algoritmo RSA. El esquema de firma será implementado por el programa cliente y se presenta en la siguiente figura:

Básicamente, el esquema de generación de firma consiste en los siguientes pasos:

1. Se realiza un hash del texto plano de entrada. Para ello se utilizará un algoritmo de hash MD5.

Page 8: TÉCNICAS DE CODIFICACIÓN - it.uc3m.esividal/tc/Avanzada.pdf · práctica se realizará en los equipos del laboratorio). TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

Curso 2009-2010

Práctica adicional, convocatoria de febrero 8

2. Cifrado del hash resultante del paso 1. Para ello se utilizará el algoritmo asimétrico RSA con

la clave privada RSA del usuario remitente. De este modo:

signedtext = RSA source-private-key { hash (plaintext) }

El programa cliente solicitará al usuario remitente la passphrase necesaria para descifrar su clave privada RSA.

NOTA:

Para simplificar la codificación se proporciona como material complementario de la práctica una librería C que implementa la funcionalidad de un algoritmo de hash MD5. En el apéndice A se incluye información detallada sobre esta librería así como varios ejemplos de uso.

Operación de verificación de firma Esta operación permitirá verificar si la firma correspondiente a un fichero de entrada es una firma válida. El esquema de verificación de firma será implementado por el demonio servidor, y consiste en los siguientes pasos:

1. Descifrado del texto firmado, utilizando para ello el algoritmo asimétrico RSA con la clave pública RSA del usuario remitente. Como resultado, debería obtenerse el hash MD5 correspondiente al fichero original

2. Se realiza un hash del texto plano de entrada. Para ello se utilizará un algoritmo de hash MD5

(ver notas finales correspondientes a este apartado). 3. Comparación de los hashes obtenidos en los pasos 1 y 2. Si éstos son iguales la firma del

texto de entrada será válida, en caso contrario la firma será inválida.

Apartado 4: implementación de una PKI En este apartado se implementará una infraestructura PKI sencilla, consistente en los siguientes componentes:

- Autoridad de certificación, para generar certificados digitales de las claves públicas de los usuarios.

- Aplicación repositorio de certificados digitales. Este componente dará soporte a la

distribución de los certificados digitales a las partes participantes en la comunicación. A continuación se especifican con detalle los aspectos de implementación correspondientes a cada uno de estos componentes Autoridad de certificación

Page 9: TÉCNICAS DE CODIFICACIÓN - it.uc3m.esividal/tc/Avanzada.pdf · práctica se realizará en los equipos del laboratorio). TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

Curso 2009-2010

Práctica adicional, convocatoria de febrero 9

La autoridad de certificación (CA, Certification Authority) es la entidad encargada de la generación de los certificados digitales. Cuando un usuario solicita la generación de un certificado digital para una clave pública, la CA realiza las siguientes funciones:

1. Validación de la identidad del usuario, es decir, la CA verifica que el usuario es quien dice ser.

2. Validación de la clave pública del usuario, es decir, la CA verifica que la clave pública

realmente pertenece al usuario.

3. Generación del certificado digital. Éste no es más que un documento electrónico que recoge, entre otras cosas, la identidad del usuario, su clave pública y una firma del documento generado con la clave privada de la CA.

En esta práctica nos centraremos principalmente en el tercer punto. A continuación se definen el formato de los certificados digitales, los ficheros de configuración de la CA y los procesos generación de certificados que deberán ser implementados para proporcionar la funcionalidad requerida para la CA. Formato de los certificados digitales Un certificado digital es un documento electrónico firmado por un tercero de confianza (CA) que permite asociar una identificación de usuario con su clave pública correspondiente. El estándar al uso para certificados digitales es X.509 v3, sin embargo en esta práctica utilizaremos un formato de certificados mucho más sencillo. Se utilizará, para representar un certificado digital, un fichero con el siguiente contenido:

- Identificador de usuario: cadena de texto que identifica al usuario al que pertenece la clave pública. Este campo típicamente consistirá en una cadena de texto alfanumérica sin espacios.

- Clave pública del usuario: consiste en los dos números enteros (e, n) que componen la clave

pública RSA.

- Fingerprint del certificado: este es un campo habitual en un certificado digital. Será labor del alumno estudiar en qué consiste un fingerprint de certificado y en implementar funciones que permitan calcular su valor para cada certificado generado en esta práctica.

- Identificador de la autoridad de certificación: cadena de texto que identifica a la autoridad de

certificación que ha generado el certificado. - Firma de la autoridad de certificación: esta es una firma del contenido del certificado

realizado con la clave privada RSA de la autoridad de certificación. Ficheros de configuración de la autoridad de certificación

Page 10: TÉCNICAS DE CODIFICACIÓN - it.uc3m.esividal/tc/Avanzada.pdf · práctica se realizará en los equipos del laboratorio). TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

Curso 2009-2010

Práctica adicional, convocatoria de febrero 10

La autoridad de certificación, al igual que cualquier usuario en la PKI, mantendrá dos ficheros de claves RSA:

- Fichero “public.keys”. En este fichero se almacenarán las claves públicas de los usuarios y los enlaces a sus correspondientes certificados, según el formato anteriormente especificado para un fichero de claves públicas. Asimismo, el fichero “public.keys” de la CA almacenará sus propias claves públicas y los enlaces a sus correspondientes certificados digitales.

- Fichero “secret.keys”. En este fichero se almacenarán las claves privadas de la CA, según el

formato anteriormente especificado para el fichero de claves privadas. Nótese que es posible que la CA posea varias claves públicas y sus correspondientes claves privadas. Esto podría ser de utilidad, por ejemplo, para generar certificados digitales con diferentes niveles de seguridad, según los procesos de validación de los usuarios que se hayan utilizado en cada caso. Proceso de generación de certificados El proceso de generación de certificados digitales permitirá crear el certificado digital correspondiente a la clave pública RSA de un usuario. Se codificará una nueva herramienta para dar soporte a la CA para la generación de certificados digitales. Dicha herramienta cumplirá obligatoriamente con los siguientes requisitos:

• Se creará un único binario ejecutable, pki-certificate, que permitirá ejecutar la herramienta a través de la línea de comandos con la siguiente sintaxis:

pki-certificate ca-id public-key-file certificate-file

Donde:

- ca-id: cadena de texto que identifica la clave privada de la CA que se utilizará para generar el certificado digital. Este campo típicamente consistirá en una cadena de texto alfanumérica sin espacios.

- public-key-file: nombre del fichero que contiene la clave pública del usuario para el

que se desea generar el certificado digital. Este fichero deberá tener el mismo formato que el especificado para el fichero de salida de la aplicación ‘get-rsa-keys’.

- certificate-file: nombre del fichero de salida en el que se almacenará una

representación del certificado digital.

• La generación del certificado digital comprenderá los siguientes pasos:

1. Firma del conjunto {user-id, e, n, ca-id} utilizando para ello el algoritmo de cifrado asimétrico RSA con la clave privada de la CA. Para ello, la aplicación pki-certificate solicitará al usuario la passphrase necesaria para descifrar la clave privada RSA.

2. Cálculo del fingerprint para el certificado.

3. El certificado será una estructura de datos con los siguientes campos:

certificate = { user-id, e, n, fingerprint, ca-id, signature }

Page 11: TÉCNICAS DE CODIFICACIÓN - it.uc3m.esividal/tc/Avanzada.pdf · práctica se realizará en los equipos del laboratorio). TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

Curso 2009-2010

Práctica adicional, convocatoria de febrero 11

Como resultado de la ejecución del programa el certificado generado se almacenará en el fichero ‘certificate-file’ y se añadirá una entrada en el fichero “public.keys” de la CA para la clave pública del usuario.

Aplicación repositorio de certificados digitales La aplicación repositorio de certificados digitales permitirá distribuir los certificados digitales generados por la CA a los usuarios de la PKI cuando así lo requieran, utilizando para ello un modelo cliente/servidor. La aplicación repositorio que deberá ser implementada cumplirá obligatoriamente con los siguientes requisitos:

• Los usuarios de la PKI ejecutarán un programa cliente, que consistirá en un único binario ejecutable, pki-management. Este programa permitirá gestionar las claves públicas del fichero local “public.keys” en el equipo del cliente y sus correspondientes certificados digitales.

Al ejecutar el programa, el usuario tendrá acceso a un menú de opciones que le permitirá ejecutar las siguientes acciones:

o Mostrar información sobre las claves públicas contenidas en el fichero “public.keys”

local, así como información sobre sus correspondientes certificados digitales. o Borrar entradas del fichero “public.keys” local y sus correspondientes certificados

digitales. o Solicitar al demonio servidor de la aplicación repositorio el certificado digital

correspondiente a cualquier usuario, verificar la validez del certificado obtenido y en caso de ser éste válido incorporar la información correspondiente al fichero “public.keys” local y almacenar el certificado digital en el disco duro local.

o Salir del programa pki-management.

• El demonio servidor consistirá en un único binario ejecutable, pki-repository, cuyas

principales características se indican a continuación:

o Se ejecutará en el mismo equipo en el que se ejecuten las utilidades correspondientes a la autoridad de certificación.

o Atenderá las peticiones de certificados digitales realizadas por los usuarios a través

del programa cliente pki-management. El demonio servidor obtendrá los certificados a partir de la información contenida en el fichero “public.keys” de la CA.

Page 12: TÉCNICAS DE CODIFICACIÓN - it.uc3m.esividal/tc/Avanzada.pdf · práctica se realizará en los equipos del laboratorio). TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

Curso 2009-2010

Práctica adicional, convocatoria de febrero 12

REFERENCIAS [1] B. Kaliski. “PKCS #5: Password-Based Cryptography Specification. Version 2.0”. RFC

2898. RSA Laboratories, Septiembre 2000. [2] Manuel José Lucena López. “Criptografía y seguridad en computadores”. Versión 2.10, 3ª

edición, Mayo 2003. http://wwwdi.ujaen.es/~mlucena/ [3] Williams Stallings. “Cryptography and network security. Principles and Practice”. Segunda

edición, Prentice may, 1999. http://williamstallings.com/Security2e.html (Enlace biblioteca: http://biblioteca.uc3m.es/uhtbin/cgisirsi/uJWzdkf7tq/287960034/18/X245/XTITLE/Cryptography+and+network+security )

[4] PGP (Pretty Good Privacy). http://www.pgp.com [5] Alfred J. Menezes, Paul C. van Oorschot and Scott A. Vanstone. “Handbook of applied

cryptography”. 2001. http://www.cacr.math.uwaterloo.ca/hac/

Page 13: TÉCNICAS DE CODIFICACIÓN - it.uc3m.esividal/tc/Avanzada.pdf · práctica se realizará en los equipos del laboratorio). TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

Curso 2009-2010

Práctica adicional, convocatoria de febrero 13

APÉNDICE A

Librería básica de operaciones criptográficas Como material complementario se proporciona al alumno una librería C que proporciona funciones criptográficas básicas que deberán ser utilizadas para la realización de esta práctica. La librería proporciona la implementacíón de un cifrador básico DES y del algoritmo de hash MD5. En este apéndice se describen las principales funciones contenidas en esta librería. Asimismo, se proporcionan algunos ejemplos de uso. Constantes predefinidas En el fichero “encrypt.h” se han declarado una serie de constantes mediante directivas de preprocesador. Estas constantes definen los valores de salida que devuelven las funciones de la librería, y se muestran en la siguiente tabla:

Constante Valor OK 0 HASH_PROCESS_ERROR -1001 CANNOT_OPEN_FIN -1002 CANNOT_CREATE_FOUT -1003 MD2_ERROR -1005 DES_ERROR -1006

Funciones int hashMD5 (char *inputFile, char *outputFile); La función hashMD5 genera un fichero de salida en el que almacena el hash MD5 correspondiente a un fichero de entrada. Argumentos:

- inputFile: nombre del fichero de entrada de cuyo contenido se desea calcular el hash MD5. - outputFile: nombre del fichero de salida en el que la aplicación guardará el hash MD5. La

aplicación abre el fichero de salida con el modificador “w+”. Resultados:

- OK, si el hash ha sido generado con éxito. - CANNOT_OPEN_FIN, si no es posible abrir el fichero inputFile en modo lectura, por

ejemplo porque éste no existe. - CANNOT_CREATE_FOUT, si no es posible crear el fichero de salida outputFile. - HASH_PROCESS_ERROR, si no ha sido posible ejecutar el proceso de generación del

código hash.

Page 14: TÉCNICAS DE CODIFICACIÓN - it.uc3m.esividal/tc/Avanzada.pdf · práctica se realizará en los equipos del laboratorio). TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

Curso 2009-2010

Práctica adicional, convocatoria de febrero 14

- MD2_ERROR, si el sistema operativo no soporta la implementación del código hash programado en esta librería.

Ejemplo:

- Suponga que desea generar el hash MD5 correspondiente al contenido del fichero “input.txt”. Asimismo, queremos guardar el hash resultante en el fichero “input.txt.hash”. El código a implementar sería el siguiente:

int result;

// Declaración del nombre del fichero de entrada char *input = “input.txt”;

// Declaración del nombre del fichero de salida char *output = “input.txt.hash”;

// Generación del hash MD5 del fichero de entrada. El resultado se almacena // en el fichero de salida y la variable result contiene el resultado de la ejecución. result = hashMD5(input, output);

int encryptDES (char *input, char *output, char *key); La función encryptDES implementa el algoritmo de cifrado de clave simétrica DES. Esta función recibe a su entrada un único bloque de texto claro de 64 bits y proporciona a su salida un único bloque de texto cifrado de 64 bits. Sólo es posible cifrar un bloque de 64 bits en cada llamada. Argumentos:

- input: puntero a la secuencia de caracteres que contiene el bloque de texto claro que se desea cifrar. La secuencia input debe contener como mínimo 8 bytes; si input contiene más de 8 bytes únicamente se cifrarán los 8 primeros.

- output: puntero a la zona de memoria en la que se almacenará el bloque de texto cifrado. El puntero output debe apuntar a una zona de memoria reservada de al menos 8 bytes.

- key: cadena de texto que contendrá la clave DES que se utilizará en el proceso de cifrado. Esta cadena deberá terminar obligatoriamente por el carácter ‘\0’. No existe ninguna restricción en el tamaño de la cadena; la función encryptDES procesará la cadena key para obtener una clave DES de 56 bits.

Resultados:

- OK, si la operación de cifrado DES se ha realizado con éxito. - DES_ERROR, si se ha producido algún error en el proceso de cifrado.

Ejemplo:

- Suponga que desea cifrar el bloque de texto claro “Claro123”, utilizando para ello el algoritmo DES con la clave “kR4jH”. El código a implementar sería el siguiente:

int result;

Page 15: TÉCNICAS DE CODIFICACIÓN - it.uc3m.esividal/tc/Avanzada.pdf · práctica se realizará en los equipos del laboratorio). TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

Curso 2009-2010

Práctica adicional, convocatoria de febrero 15

// Reserva de memoria y asignación del bloque de texto claro char inputText[8] = { ‘C’, ‘l’, ‘a’, ‘r’, ‘o’, ‘1’, ‘2’, ‘3’};

// Reserva de memoria para el bloque de texto cifrado char cipherText[8];

// Declaración de la clave de cifrado char* key = “kR4jH”;

// Ejecución del proceso de cifrado result = encryptDES(inputText, cipherText, key);

int decryptDES (char *input, char *output, char *key); La función decryptDES implementa el algoritmo de descifrado DES. Esta función recibe a su entrada un único bloque de texto cifrado de 64 bits y proporciona a su salida un único bloque de texto claro de 64 bits. Sólo es posible descifrar un bloque de 64 bits en cada llamada. Argumentos:

- input: puntero a la secuencia de caracteres que contiene el bloque de texto cifrado que se desea descifrar. La secuencia input debe contener como mínimo 8 bytes; si input contiene más de 8 bytes únicamente se descifrarán los 8 primeros.

- output: puntero a la zona de memoria en la que se almacenará el bloque de texto claro descifrado. El puntero output debe apuntar a una zona de memoria reservada de al menos 8 bytes.

- key: cadena de texto que contendrá la clave DES que se utilizará en el proceso de descifrado. Al igual que en el proceso de cifrado, esta cadena deberá terminar obligatoriamente por el carácter ‘\0’. No existe ninguna restricción en el tamaño de la cadena; la función decryptDES procesará la cadena key para obtener una clave DES de 56 bits.

Resultados:

- OK, si la operación de descifrado se ha realizado con éxito. - DES_ERROR, si se ha producido algún error en el proceso de descifrado.

Ejemplo:

- Suponga que desea descifrar el bloque de texto cifrado que ha obtenido en el ejemplo anterior. El código a implementar sería el siguiente:

// Reserva de memoria para el bloque de texto claro descifrado char clearText[8];

// Ejecución del proceso de descifrado result = decryptDES(cipherText, clearText, key);

Page 16: TÉCNICAS DE CODIFICACIÓN - it.uc3m.esividal/tc/Avanzada.pdf · práctica se realizará en los equipos del laboratorio). TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

Curso 2009-2010

Práctica adicional, convocatoria de febrero 16

APÉNDICE B

Algoritmo de cifrado asimétrico RSA En este apéndice se muestra un breve resumen sobre el algoritmo de cifrado asimétrico RSA, en el que se recoge la información relevante para la realización de esta práctica. Se recomienda consultar la bibliografía recomendada ([2] y [3]) para profundizar en los conceptos relacionados con la criptografía de clave pública y en concreto sobre el algoritmo RSA. RSA es uno de los algoritmos de clave asimétrica más sencillos de implementar y posee además una característica que lo hace particularmente interesante para la realización de esta práctica, y es que las claves RSA se pueden utilizar indistintamente tanto en los procesos de cifrado como en los de generación de firmas digitales. El acrónimo RSA proviene de las iniciales de sus tres inventores (Rivest, Shamir y Adelman) y la seguridad del algoritmo se basa en la dificultad de factorizar grandes números. En los tres siguientes apartados veremos como es el proceso de generación de claves RSA, cómo son los procesos de cifrado y de descifrado y, finalmente, cómo se aplica en la práctica el algoritmo RSA a textos arbitrariamente grandes. Generación de claves RSA Para generar un par de claves RSA, una clave pública y su correspondiente clave privada, se realiza el siguiente proceso:

1. Se eligen aleatoriamente dos números primos grandes, p y q. 2. Se calcula el producto de ambos números, n = p · q.

3. Se escoge un número e, primo relativo con (p - 1) · (q - 1).

4. El par {e, n} será la clave pública.

5. Se calcula la inversa de e módulo (p - 1) · (q - 1). Esto es, se calcula el número d que verifica

la siguiente expresión: d · e ≡ 1 mod ( (p - 1) · (q - 1) )

6. El par {d, n} será la clave privada.

Algoritmo de cifrado/descifrado RSA El cifrado de un bloque de texto plano m se realiza según la siguiente expresión:

c = me (mod n) El descifrado de un bloque de texto cifrado c se realiza según la siguiente expresión;

m = cd (mod n)

Page 17: TÉCNICAS DE CODIFICACIÓN - it.uc3m.esividal/tc/Avanzada.pdf · práctica se realizará en los equipos del laboratorio). TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

Curso 2009-2010

Práctica adicional, convocatoria de febrero 17

Sabiendo que d es la inversa de e módulo (p - 1) · (q - 1), resulta sencillo deducir la validez de la expresión correspondiente al proceso de descifrado. Implementación en la práctica del algoritmo RSA En la práctica, se eligen p y q suficientemente grandes, esto es, con un número suficientemente elevado de bits. Supongamos, por ejemplo, que p y q tienen b bits. En este caso, n tendrá 2 · b bits. El término “longitud de la clave RSA” se utiliza habitualmente para referirse a este valor, es decir, a la longitud en bits del término n. De ahora en adelante nos referiremos a este valor como length (n). Para cifrar un mensaje de longitud arbitraria se realiza el siguiente proceso:

1. Se divide el mensaje en bloques de k bits, con k menor que length (n). Queda como ejercicio para el alumno determinar el motivo de esta restricción.

2. Se cifra cada bloque de k bits por separado, utilizando para ello la expresión de cifrado que

hemos visto en el apartado anterior. Como resultado, obtendremos un texto cifrado de mayor tamaño, puesto que el cifrado correspondiente a cada bloque de texto plano tendrá length (n) bits. Igualmente, queda como ejercicio para el alumno comprender el porqué de este resultado.

Para descifrar un mensaje de longitud arbitraria se realiza el siguiente proceso:

1. Se divide el texto cifrado en bloques de length (n) bits. 2. Se descifra cada bloque de length (n) bits por separado, utilizando para ello la expresión de

descifrado que hemos visto en el apartado anterior. Como resultado obtendremos bloques de texto plano de k bits.

Page 18: TÉCNICAS DE CODIFICACIÓN - it.uc3m.esividal/tc/Avanzada.pdf · práctica se realizará en los equipos del laboratorio). TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

Curso 2009-2010

Práctica adicional, convocatoria de febrero 18

APÉNDICE C

Test de primalidad de Rabin-Miller En este apéndice se recoge la descripción del test de primalidad de Rabin-Miller, utilizado en la práctica para verificar si un número es o no primo. A continuación se cita textualmente la información contenida en [2]. El alumno puede consultar esta referencia para una mejor comprensión de los conceptos aquí expuestos. Método de Rabin-Miller Es el algoritmo más empleado, debido a su facilidad de implementación. Sea p el número que queremos saber si es primo. Se calcula b, siendo b el número de veces que 2 divide a (p − 1), es decir, 2 b es la mayor potencia de 2 que divide a (p − 1). Calculamos entonces m, tal que p = 1 + 2b · m.

1. Escoger un número aleatorio a < p. 2. Sea j = 0 y z = am (mod p). 3. Si z = 1, o z = p − 1, entonces p pasa el test y puede ser primo. 4. Si j > 0 y z = 1, p no es primo. 5. Sea j = j + 1. Si j = b y z ≠ p − 1, p no es primo. 6. Si j < b y z ≠ p − 1, z = z2 (mod p). Volver al paso (4). 7. Si j < b y z = p − 1, entonces p pasa el test y puede ser primo. 8. p no es primo.

La probabilidad de que un número compuesto pase este algoritmo para un número a es del 25 %. Consideraciones prácticas A efectos prácticos, el algoritmo que se suele emplear para generar aleatoriamente un número primo p es el siguiente:

1. Generar un número aleatorio p de n bits. 2. Poner a uno el bit más significativo —garantizamos que el número es de n bits— y el menos

significativo —debe ser impar para poder ser primo—. 3. Intentar dividir p por una tabla de primos precalculados (usualmente aquellos que sean

menores que 2000). Esto elimina gran cantidad de números no primos de una forma muy rápida. Baste decir a título informativo que más del 99.8% de los números impares no primos es divisible por algún número primo menor que 2000.

4. Ejecutar el test de Rabin-Miller sobre p como mínimo cinco veces. 5. Si el test falla, incrementar p en dos unidades y volver al paso 3.

Listado de números primos menores de 2000 El archivo “primos.txt”, que se proporciona como material complementario de esta práctica, recoge el listado de los números primos menores que 2000.

Page 19: TÉCNICAS DE CODIFICACIÓN - it.uc3m.esividal/tc/Avanzada.pdf · práctica se realizará en los equipos del laboratorio). TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

Curso 2009-2010

Práctica adicional, convocatoria de febrero 19

APÉNDICE D

Funcionamiento general del sistema a implementar A continuación se describe el funcionamiento general del sistema cuya implementación se ha propuesto en esta práctica. Se mostrará como utilizar las herramientas descritas para inicializar las diferentes entidades que participan en el sistema, así como el modo en que los usuarios podrán intercambiar ficheros de forma segura a través de una red de comunicaciones. Básicamente, en el sistema habrá las siguientes entidades:

• Una autoridad de certificación. • Una aplicación repositorio de certificados digitales. • Dos o más usuarios entre los cuales se desea transmitir ficheros de forma segura.

Los procesos correspondientes a la autoridad de certificación y el demonio servidor de la aplicación repositorio se ejecutarán sobre el mismo equipo tipo PC. Supondremos que a cada usuario le corresponde un único equipo tipo PC. Procesos de inicialización de la CA y de la aplicación repositorio La inicialización de la CA comprende los siguientes pasos:

1. Generación de un par de claves RSA para la CA. Para ello se utilizará la aplicación get-rsa-keys.

2. Generación de un certificado digital para la clave pública RSA obtenida como resultado del

paso 1 e importación del certificado en el fichero “public.keys” de la CA. Para ello se utilizará la aplicación pki-certificate.

Tras inicializar la CA, iniciaremos la aplicación repositorio. Para ello lanzaremos el programa pki-repository. El proceso de inicialización de la CA y de la aplicación repositorio se realizará una única vez. Procesos de inicialización de usuario Cualquier usuario de la PKI deberá ejecutar el siguiente proceso de inicialización como paso previo a la transferencia segura de archivos:

1. Importación del certificado digital de la CA. Para ello se utilizará el programa cliente pki-management, mediante el cual se solicitará al demonio servidor del repositorio el envío de dicho certificado digital.

2. Generación de un par de claves RSA para el usuario. Para ello se utilizará la aplicación get-

rsa-keys. 3. Solicitud de generación de un certificado digital a la CA para la clave pública RSA. Este paso

no es necesario implementarlo. Supondremos que el usuario, de algún modo, hace llegar a la

Page 20: TÉCNICAS DE CODIFICACIÓN - it.uc3m.esividal/tc/Avanzada.pdf · práctica se realizará en los equipos del laboratorio). TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

Curso 2009-2010

Práctica adicional, convocatoria de febrero 20

CA una solicitud de generación de un certificado digital, indicando su identidad y la clave pública que ha obtenido como resultado del paso 2.

4. La CA valida la identidad del usuario y la clave pública presentada. Los métodos de

validación empleados pueden ser de diversos tipos, en función del nivel de seguridad que se desea para el certificado. El valor económico del certificado digital dependerá en general del nivel de seguridad requerido. Este paso no es necesario implementarlo, supondremos que será realizado por el personal administrativo de la CA.

3. La CA genera el certificado de la clave pública del usuario. Para ello, la CA utiliza la

aplicación pki-certificate. 4. LA CA indica al usuario que su certificado digital ya se encuentra disponible. De nuevo, este

paso no es necesario implementarlo. 5. El usuario obtiene el certificado digital correspondiente a su clave pública RSA y actualiza el

contenido de su fichero “public.keys”. Para ello utilizará el programa cliente pki-management, mediante el cual solicitará al demonio servidor del repositorio el envío del certificado digital.

Transferencia segura de archivos entre usuarios Supongamos que un usuario A desea transmitir un fichero a otro usuario B de forma segura. Supongamos, además, que A y B han ejecutado sus correspondientes procesos de inicialización según se indica en el apartado anterior. El proceso de transferencia segura comprende los siguientes pasos:

1. El usuario A obtiene el certificado digital de la clave pública RSA del usuario B. Esta clave será necesaria para que A pueda cifrar la información que envía a B.

2. El usuario B obtiene el certificado digital de la clave pública RSA del usuario A. Esta clave

será necesaria para que B pueda validar las firmas digitales generadas por A.

3. El usuario B ejecuta el demonio servidor de la aplicación de transferencia segura de archivos

4. El usuario A ejecuta el programa cliente de la aplicación de transferencia segura de archivos con los parámetros adecuados.

5. Como resultado, el archivo origen se transfiere a su destino cifrado y firmado, garantizando

de este modo confidencialidad, autenticación del origen de la información, integridad y no repudio.

En la figura siguiente se muestra, de forma simplificada, el intercambio de mensajes resultante de la ejecución de este proceso:

Page 21: TÉCNICAS DE CODIFICACIÓN - it.uc3m.esividal/tc/Avanzada.pdf · práctica se realizará en los equipos del laboratorio). TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

TÉCNICAS DE CODIFICACIÓN Departamento de Ingeniería Telemática

Curso 2009-2010

Práctica adicional, convocatoria de febrero 21

Usuario A

Usuario B

Aplicación repositorio

Red Insegura

(1) (2)

(5) Transferencia en curso

CA

Disco local

(4) Programa cliente (3) Demonio servidor

Equipo de la CA