Preliminares.

Cada práctica está desglosada en partes.
Una parte puede contener ejercicios opcionales que no están pensados para ser realizados en las sesiones de prácticas (aunque por supuesto pueden realizarse si sobra tiempo). El comienzo de los ejercicios optativos se indica mediante una línea horizontal gruesa como esta:


Las prácticas se realizarán bajo Linux salvo que se indique lo contrario. Debes arrancar el Linux del PC y elegir la opción Usuario autenticado en Anubis. Con esta forma de trabajar estás corriendo los procesos en el PC, pero tu directorio home es el mismo que el de anubis, de modo que todo lo que modificas se queda guardado allí.
Si lo deseas, puedes trabajar directamente sobre anubis, ejecutando desde un terminal la orden ssh -X anubis que abrirá un shell en anubis y permitirá ejecutar aplicaciones X de anubis sobre el terminal gráfico de tu Linux. Si no entiendes todo esto consúltalo con el profesor antes de empezar.

Consejos:

Métodos criptográficos elementales.

  1. Descarga el programa precompilado pc (con el botón derecho del ratón puedes guardarlo), cámbiale los permisos (chmod a+x pc) y prueba que funciona, ejecutandolo y obteniendo el resultado correcto, según (corta y pega la línea de comando):
    $ echo jajajaja | ./pc
    10      1 0.11111
      a      4 0.44444
      j      4 0.44444
    Total 9, Entropía 1.392147
    El programa te muestra el caracter (o su código ascii), el número de veces que aparece y la probabilidad. La ejecución pc -o muestra el resultado ordenado por frecuencia.
  2. Descarga el programa (texto fuente) cesar.c, compílalo (cc -s -o cesar cesar.c) y comprueba que funciona correctemente según:
    $ echo comorrr! | ./cesar -e 3 | hexdump -c
    Cifrando con clave 3
    0000000   f   r   p   r   u   u   u   $  \r
    0000009
  3. Descarga el archivo binario quijote.bin. Es el resultado de un cifrado de cesar con llave desconocida. ¿Qué crees que puede contener este archivo?.
  4. %%% Parece lógico pensar que "El quijote". %%%
  5. Teniendo en cuenta que la letra que más aparece en el castellano es la "e", descifra el texto contenido en quijote.bin y averigua la llave empleada.
    %%% Estamos trabajando sobre el código ASCII, por lo que lo que más va a a aparecer es el espacio en blanco, no la letra "e". %%%
  6. Estudia el código fuente de cesar.c.
    Observa que no abre ficheros, sino que usa la entrada estándar, lo que es mucho más comodo de programar y más facil de usar si se sabe un poco de shell.
  7. Escribe un programa similar basándote en cesar.c, pero que implemente el método de Vigenère. Como se usan distintos alfabetos desplazados, en lugar de pasarle como parámetro una colección de números, le pasaremos una cadena de caracteres y los desplazamientos serán los códigos ascii de cada carácter de la cadena. Si llamas vig.c a tu programa, después de compilarlo (cc -o vig -s vig.c), puedes comprobar que funciona comparando con estos resultados:
  8. echo comorrr! | ./vig -e jorl | hexdump
    Cifrando con clave jorl
    0000000 decd dbdf e1dc 8de4 0074
    0000009
    %%%
    !!!vig.c!!!
    %%%
  9. Descifra el archivo quijote.bin usando la clave que has obtenido + 32 (ojo que sale binario). Razona el resultado. Lo mismo con la clave - 32. %%%
    ./cesar -d 66 <quijote.bin | less
    Se lee más o menos el quijote (con los ojos). Es debido a que pasa las minúsculas a mayúsculas (distancia 32 en el código ascii).
    Con clave 34-32=2 sólo se leen las mayúsculas, apareciendo como minúsculas. %%%
  10. Intenta descifrar el quijote.bin, pero a base de fuerza bruta. %%%
    for ((i=1; i<255; i++)); do
    if ./cesar -d $i <quijote.bin 2>/dev/null | grep Quijote >/dev/null; then
    echo La clave es $i
    fi
    done
    %%%
  11. Diseña y escribe un programa (trans) que permita cifrar y descifrar por transposición en bloques de n caracteres. La secuencia de transposición podrá elegirse en tiempo de ejecución. La sintaxis de uso puede ser algo como
    trans -e 9=1-4-8,6-7
    que realiza la transposición de modo que el 1 va al 4, el 4 al 8, el 8 al 1, el 6 al 7 y el 7 al 6 en un bloque de 9 caracteres. El parsing de esta línea de parámetros puede resultar complicado, pero puedes usar este trozo de código C para ayudarte.
  12. Una ejecución del programa puede ser:
    echo comorrr, cuidadito! | trans -e 9=1-4-8,6-7 | more
    8-2-3-1-5-7-6-4-9-
    ,omcrrro tuicaiddoÿ
    ÿ!ÿÿÿÿÿ
    Los caracteres raros se deben a haber empleado relleno para completar el bloque.
    %%%
    !!!trans.c!!!
    %%%
  13. Escribe un programa que realice el cifrado y descifrado por transposición por columnas.
  14. %%% Que rollo. %%%
  15. Descifra el siguiente texto:
  16. elsardinatoselelsardinauniconotamotoelnotasardinaasnojabonosoeldoncellaelpiojosaasnozocoyula.
    El texto contiene una cierta información subliminal. Averíguala. No comentes los resultados con tus compañeros, porque sólo les fastidiará.
    %%% Veo que en la ristra hay palabras identificables, las escribo en vertical en un papel.
    Leo en vertical la primera letra y obtengo:
    Este es un mensaje de paz.
    El texto contiene más información. Cada palabra permite averiguar como se codifica en morse la letra inicial, si cada sílaba que contiene la letra o se traduce a raya y el resto de sílabas a punto. La información añadida es tanto la información de cómo se codifica como el hecho mismo de dar la codificación. No hay que ser adivino para esto: basta con buscar las palabras mas raras en google y se ve el misterio. %%%
  17. Razona e implementa si cabe estos dos métodos de cifrado (clave k):
    1. Cada carácter se cifra sumándole el carácter siguiente de la secuencia de entrada. El último se cifra sumándole k.
    2. Cada carácter se cifra sumándole el último carácter cifrado (es decir, el cifrado del carácter anterior en la secuencia de entrada). El primero se cifra sumándole k. ¿Cómo llamarías a este método?.
    %%%
    1. El primer método es absurdo pues no se podría descifrar con comodidad.
    2. El segundo es simple, se trata de un césar-CBC:
    %%%

Criptografía de llave privada con Openssl.

El comando openssl te permite realizar múltiples operaciones criptográficas.
Ejecuta openssl nosabo para obtener una lista de funciones.
Ejercicios:
  1. Prueba el DES, por ejemplo (el comando no es correcto por dos razones piénsalo bien antes de ejecutarlo):
  2. openssl des -k jelou -in /usr/local/bin/openssl
  3. Descarga el archivo casita.png.
  4. Este es el efecfo del DES sobre el archivo cuando DES se aplica mal.
  5. Prova el efecto tu mismo, usando el comando:
    convert -depth 8 casita.png rgb:- | openssl des ...... | head -c $[476*205*3] | display -depth 8 -size 476x205 rgb:- 
    No debes modificar la invocación de convert ni de display, sólo debes pensar lo que debes pasar como argumentos a openssl des. Para ello, averigua que parámetros admite el  comando openssl des y usa los que necesites. Cuando lo consigas, prueba distintas llaves y observa el efecto de la llave sobre el resultado.
    %%% openssl des -k "me da igual" -des-ecb %%%
  6. Prueba otros cifradores, como CAST, Blowfish, IDEA, RC5, con sus variantes.
  7. Repite varias veces la misma ejecución con la misma llave. Intenta averiguar por qué salen los colores diferentes.
  8. Observa el efecto del des u otro cifrador sobre ésta imagen. Es similar el efecto sobre ésta.
    Razona el resultado. Intenta reproducirlo con un comando similar al anterior.
    %%% Sólo se aprecian los trozos que tienen un color muy uniforme. El resto de la foto al tener cada pixel muy diferente del siguiente, no se ve afectada por el síndrome.
    Con el comando identify puedes averiguar el tamaño de las imágenes y construir el comando equivalente al empleado con la casita. %%%
  9. Escribe un programa usando la librería OpenSSL (libcrypto) que genere una par de llaves RSA y muestre por pantalla los exponentes e y d, el módulo n, y los primos p y q.

PKI con OpenSSL.

El comando openssl req realiza las operaciones: El comando openssl x509 permite: El comando openssl pkcs12 permite:

Se pide:

  1. Genera un certificado autofirmado (C1+K1) con una llave RSA de 2048 bits, válido para 360 días, y muéstralo en modo texto (req).
    Asegúrate de que generas un certificado mirando la cabecera PEM.
    %%%
    openssl req -newkey rsa:2048 -x509 -out C1 -keyout K1 -nodes
    %%%
  2. Empaquétalo en un objeto pkcs12 (P1) y muéstralo en modo texto (pkcs12).
  3. %%%
    openssl pkcs12 -export -out P1 -inkey K1 -in C1
    openssl pkcs12 -nodes -in P1
    %%%
  4. Genera un objeto pkcs10 (R2) + clave privada (K2) y muéstralo en modo texto (req).
    Anota los primeros bytes del módulo de la llave (mira en K2 o en R2, obviamente es el mismo por ser los pkcs10 siempre autofirmados).
    Asegúrate de que generas una petición certificado mirando la cabecera PEM de R2.
  5. %%%
    openssl req -new -keyout K2 -out R2 -nodes
    %%%
  6. Genera otra clave privada (K3) y anota su módulo (genrsa,rsa).
  7. %%%
    openssl genrsa -out K3
    %%%
  8. Firma con K3 el objeto R2, generando un autofirmado C2 (para 360 días) y muéstralo como texto (x509).
    Asegúrate de que has generado un cert y no un pkcs10.
  9. %%%
    openssl x509 -req -in R2 -signkey K3 -out C2
    %%%
  10. Observa el módulo de C2 y compáralo con los que has anotado.
    Dado C2, ¿qué ha pasado con K2?. ¿Cual es la clave pública que va con C2?. ¿Cómo ha llegado ahí?. ¿Para qué ha servido R2?.
  11. %%%
    K2 ha desaparecido. La asociada a K3, va con ella. R2 sólo datos personales.
    %%%
  12. Firma con K3 el objeto R2, pero que no sea autofirmado (C3) manteniendo la clave pública de R2 (req).
    ¿Que papel estás haciendo?.
  13. %%%
    openssl req -x509 -key K3 -in R2 -out C3
    Estoy haciendo un papel similar al de una CA. %%%
  14. Con C2 y la clave privada correspondiente, genera un objeto pkcs12 (P2) y analiza su contenido.
  15. %%%
    openssl pkcs12 -export -out P2 -inkey K3 -in C2
    openssl pkcs12 -nodes -in P2
    %%%
  16. Con C3 y la clave privada correspondiente, genera un objeto pkcs12 (P3) y analiza su contenido.
  17. %%%
    openssl pkcs12 -export -out P3 -inkey K2 -in C3
    openssl pkcs12 -nodes -in P3
    %%%
  18. Guarda P1 y P2 para los ejecricios optativos de la práctica del correo.
  19. El comando openssl ca permite administrar una autoridad certificadora.
    Para usarlo es necesario cierto setup que puede conseguirse usando el script CA.sh.
    1. Crea un directorio y entra en él.
    2. Lee atentamente el script CA.sh en lo referente a la creación de la CA.
    3. Crea una CA como lo hace CA.sh, pero:
      1. Genera tu propio fichero de configuración que puedes copiar del original.
      2. Al generar el certificado raíz, no protejas la clave privada. Esto es posiblemente una barbaridad, pero estamos en prácticas.
    4. Escribe un script que genere una colección de objetos pkcs12, cada uno conteniendo un certificado, una clave privada y el certificado de tu autoridad, para cada uno de los usuarios de /etc/password, conteniendo su dirección de mail en spisa y su CN tomados de /etc/password.

    5. Sugerencia unix:
      while read -r lin
        do
          mail=$(echo $lin | cut -d: -f1)
            CN=$(echo $lin | cut -d: -f5)
          ...........
      done </etc/passwd
      %%% Ejemplo. %%%

Varios.


  1. Estudia la seguridad del calendario de prácticas y comunica tus conclusiones por email al profesor antes de la siguiente sesión de prácticas.
    Por fines estadísticos, no realizes esto en colaboración con otros compañeros/as.
  2. %%% %%%