Requisitios para Votaciones Electrónicas (seguras)

Junio 30, 2009, 9:00 pm

Hace un tiempo kuasar me habló sobre una iniciativa llamada Partido de Internet (PdI en corto). La idea es crear un partido político que votaría cada proposición de ley y cada iniciativa en el parlamento en base a los resultados de unas elecciones electrónicas. Así pues, los afiliados votarían para cada iniciativa via Internet, y los representantes del PdI en el parlamento votarían de acuerdo a los resultados.

Dejando a un lado las implicaciones políticas y si yo (o tú) pienso que es una buena idea o no, quiero hablar aquí sobre votaciones electrónicas. Tan pronto como me lo mencionó, empecé a pensar “mmm espera, esto no es tan sencillo. Queremos elecciones electrónicas seguras, uno no quiere que todo el mundo sepa qué ha votado, pero quiere que se cuente su voto correctamente… hay varios requisitios que no son tan fáciles de cumplir”.

Así que le pregunté sobre cómo pensaban implementarlo… y la respuesta fue con el e-DNI, el documento de identidad electrónico español, que por supuerto proporciona firma digital. Sí, correcto, podrías usar un dispositivo como ese para implementar un esquema de voto electrónico… pero hay bastante que pensar al respecto para hacerlo bien!

Empecemos aquí una serie de posts para comentar sobre e-voting. Empecaré escribiendo lo que yo (y la literatura que tengo de las asignaturas del año pasado sobre protocolos criptográficos ;-) ) pienso que un esquema de voto electrónico debe proporcionar. Estos son los requisitos que yo puedo ver, pero puede que tu veas otros así que siéntente libre de comentar al respecto!

  • Privacivad or Anonimato: Un votante quiere que su voto se mantenga anónimo. Debería ser absolutamente imposible relacionar un votante con su voto, ya sea por otros votantes o por las autoridades electorales.
  • Eligibilidad: Sólo los votantes inscritos en el censo deberían poder votar, y sólo una vez. Un votante legítimo no debería poder entregar dos votos distintos, y por supuesto un votante no legítimo no debería poder votar.
  • Justo: Los resultados solo deben obtenerse al final de la votación, para no influenciar a otros votantes.
  • Verificable: La salida de las elecciones debe ser justa, es decir que los resultados deben ser idénticos a los votos emitidos por los votantes.
  • Verificabilidad individual: Un votante debe poder verificar que su voto fue contado correctamente.
  • Carente de recibo: Un votante no debe poder demostrar que ha votado a un partido en concreto. De esta forma nos evitamos que un votante sea forzado a votar por un partido determinado.

Algunos de estos requisitos son más importantes que otros, algunos son realmente necesarios para cualquier sistema de votaciones electrónicas justo, y otros son simplemente deseables. En próximos posts veremos algunos protocolos para votaciones electrónicas y trataremos de ver qué requisitos cumplen.

Antes de acabar, hay algo que está claro: cumplir los requisitos no es trivial. Por ejemplo, privacidad del voto y verificabilidad parecen contradictorios… cómo es que uno puede votar solo si está en las listas, pero su voto no puede ser revelado a absolutamente nadie? Veremos algunas maneras de conseguir estos dentro de un tiempo ;-).

TuXeD Sin especificar , ,

Cripto Serie: Advanced Encryption Standard

Junio 28, 2009, 9:00 pm

La última vez escribí sobre el cifrado DES, así que hoy (sí, lo adivinaste) toca escribir sobre cómo funciona AES. AES se creó como resultado de un concurso abierto propuesto por el NIST. En 1997, el NIST anunció su deseo de tener un nuevo estándar de cifrado que sustituiría al  Data Encryption Standard y que se llamaría AES: Advanced Encryption Standard.

Varios grupos de investigadores enviaron sus propuestas al concurso AES, pero el candidato ganador fue un cifrado llamado Rijndael. El cifrado fue creado por dos criptógrafos belgas, Joan Daemen y Vincent Rijmen, quienes lo enviaron al proceso de selección de AES.

Los otros finalistas fueron Twofish (Bruce Schneier y otros), Serpent (Ross Anderson y otros), MARS (un equipo que incluía a Don Coppersmit) y RC6 (Ron Rivest [la R en RSA :-p ] y otros).

Tras el concurso, el NIST publicó AES como un estándar FIPS, y desde entonces el cifrado AES ha sido ampliamente usado y analizado. En el resto de esta entrada veremos cómo funciona AES, tal como hicimos con DES en la entrada anterior.

NOTA: De la misma forma que en la entrada anterior, las imágenes están enlazadas a Wikipedia. Si intentas leer este hilo y  ya no funcionan comentádmelo.

Leer más…

TuXeD Seguridad

Cripto Serie: Cifrado de Bloques - Data Encryption Standard (DES)

Junio 23, 2009, 9:12 pm

El cifrado DES (Data Encryption Standard) fue diseñado por IBM en 1973 como una de los envíos para el call for proposals de la NBS (National Bureu of Standards) estadounidense. Hubo cierta controversia debido a la implicación de la NSA en el desarrollo del cifrado, especialmente en las misteriosas cajas S (S-boxes) y el tamaño reducido de la clave, pero años más tarde se demostró que las S-boxes usadas eran más resistentes al criptoanálisis diferencial que si hubiesen sido seleccionadas aleatoriamente.

El algoritmo se aprobó como un estándar FIPS en 1976, y ha sido revisado hasta tres veces en 1988, 1993 y 1999. La última versión, FIPS-46-3, describe la extensión 3DES como un método para alargar el tamaño de clave del cifrado DES usando 3 operaciones DES consecutivas, cifrando, descfirando y cifrando de nuevo. Esto se hizo como consecuencia de un ataque de fuerza bruta publicado en 1998.

Después de la pausa (click en Leer más!) veremos cómo funciona el algoritmo y sus componentes principales.

NOTA: Las imágenes de esta entrada están enlazadas a Wikipedia. Si no funcionan, dejad un comentario y subiré mis propias imagenes. Leer más…

TuXeD Criptografía

Cripto Serie: Cifrados de bloque

Junio 15, 2009, 8:00 am

En esta entrada introducimos los cifrados de bloque de forma genérica, así como sus modos de funcionamiento. Además, también veremos cómo generar códigos de autenticación de mensajes (MAC) mediante cifrados de bloque.

Cifrados de bloque

Como ya dijimos en la entrada anterior, los cifrados de bloque son cifrados simétricos que cifran bloques de longitud fija. Así pues, un cifrado de bloques generalmente realiza una serie de operaciones combinando el bloque de entrada con la clave (que no tiene por qué ser del tamaño del bloque) para obtener el bloque de salida.

c=E_K(m)

Puesto que son cifrados simétricos, la operación de descifrado utiliza la misma clave que la operación de cifrado, y realiza las operaciones necesarias para obtener a su salida el texto en claro:

m^\prime=E^{-1}_K(E_K(m))=m

La mayoría de cifrados de bloque son del tipo llamado cifrados de producto o cifrados de bloque iterativos, basados en una serie de operaciones básicas (rondas) que se repiten un número de veces. Estas rondas se encargan de proporcionar confusión y difusión al cifrado, dos conceptos acuñados por Shannon en su famoso tratado sobre la teoría de la comunicación.

El término confusión está relacionado con intentar romper la relación entre texto cifrado y clave tanto como sea posible, mientras que difusión se refiere a intentar eliminar las características estadísticas de la fuente. Shannon identificó estos términos y estableció su necesidad para que un cifrado se pudiera considerar seguro.

Este tipo de cifrados generalmente son redes de sustitución-permutación, en las que varias permutaciones del mensaje original (es decir, desordenarlo) y sustituciones (cambiar un valor por otro) se suceden, haciendo uso de una clave, para intentar conseguir el objetivo: destruir las propiedades estadísticas de la fuente y conseguir un cifrado seguro.

En próximos artículos veremos cómo funcionan DES y AES, dos estándares de cifrado de bloques muy usados en la actualidad. En lo restante de este artículo nos concentramos en los modos de operación de cifrados de bloques y en cómo autenticar mensajes mediante el uso de este tipo de cifrados.

Leer más…

TuXeD Criptografía, Seguridad

Cripto Serie: Introducción a la criptografía moderna

Junio 5, 2009, 8:00 am

Dejemos ya de lado los algoritmos de lápiz y papel y adentrémonos en la criptografía moderna.  Como la mayoría conoceréis, la criptografía moderna se divide en dos grandes bloques, en función del tipo de clave utilizado.

Por un lado, tenemos la criptografía (de clave) simétrica. Como su nombre indica, se utiliza una clave simétrica, compartida entre transmisor y receptor. Esto supone que para cada par de entidades comunicandose en un sistema, se necesita una clave secreta distinta.

En este grupo de cifrados tenemos tanto los cifrados de bloque como DES/3DES y AES, como los cifrados de flujo (por ejemplo, RC4). Los primeros dividen el texto en claro en bloques de un tamaño fijo, y cifran bloque a bloque. Los segundos generalmente parten de una clave y van generando una secuencia de bits o bytes a partir de ella, que será mezclada mediante OR EXCLUSIVA con el texto en claro.

Además, existen los llamados modos de operación de los cifrados de bloque, que permiten convertir un cifrado de bloques en un ‘cifrado de flujo’. Esto es así debido a que para un cifrado de bloques en su modo elemental, dos bloques iguales darían el mismo criptograma bajo la misma clave, revelando así parte de la estructura del texto. Más adelante dedicaremos una entrada a estos modos de operación.

Sin embargo, el gran problema de la criptografía simétrica está en la gestión de claves. Como hemos dicho antes, para cada par de usuarios se necesita una clave propia compartida entre ellos. Esto significa que para una red con 3 usuarios necesitamos 3 claves, para una red con 4 usuarios necesitamos 6 claves, y en general, para n usuarios necesitamos n·(n-1)/2 claves distintas.

Como se puede ver, el número de claves a manejar es de orden cuadrático con el número de usuarios a comunicar. Por lo tanto, con tan solo 100 usuarios necesitaríamos nada más y nada menos que 4950 claves distintas.

Para resolver este problema, aparece la llamada Criptografía asimétrica o de clave pública. Este tipo de criptografía se basa en tener un par de claves por usuario. Cada uno de los usuarios mantiene la clave privada en secreto, mientras que la clave pública es conocida por el resto de usuarios (de ahí el nombre ;-) ).

Cuando el usuario A quiere mandar un mensaje al usuario B, simplemente busca la clave pública de B, K_{e_B}. Con ésta, el usuario A puede cifrar un texto para el usuario B mediante la operación de cifrado c = E_{K_{e_B}}(m) . Para descifrar el texto, B simplemente usa su clave privada y la operación de descifrado: m^\prime = D_{K_{d_B}}(m) .

Hasta aquí parece seguro, y además tenemos simplemente n claves públicas, una por usuario. Sin embargo, la gestión de claves sigue suponiendo un problema: cómo aseguramos que una clave pública pertenece a un determinado usuario? En un entorno cerrado, esto es fácil: las claves se intercambian en persona y arreglado. Sin embargo, cómo lo resolvemos en Internet?

La solución se encuentra en un sistema para determinar la confianza en las claves públicas. Por un lado, una posible solución es la basada en certificados digitales, implementando lo que se conoce como una infraestructura de clave pública (Public Key Infrastructure, PKI). Otra opción, adoptada por el sistema PGP, se basa en anillos de confianza… o en la famosa frase “los amigos de mis amigos son mis amigos” :-).

Finalmente, comentar que usando estos conceptos (criptografía simétrica y asimétrica), se implementan mecanismos para proteger la autenticidad de los mensajes: los llamados Message Authentication Code (MAC) emplean criptografía simétrica, mientras que las firmas digitales son posibles gracias a la criptografía asimétrica.

También dedicaremos entradas a todas estas cuestiones más adelante.

TuXeD Sin especificar

Cripto Series: Introducción a Cryptool

Junio 2, 2009, 7:45 am

En este post vamos a ver algunas de las opciones que proporciona Cryptool para analizar cifrados clásicos, así como usar el mismo para romper un texto cifrado con Vigenère.

El primer paso, obviamente, consiste en instalar Cryptool. Para ello, yo he optado por usar una máquina virtual en VMWare con Windows XP. La instalación es sencilla, típica de aplicaciones para Windows: Siguente, Siguiente… Usaremos la versión en Inglés pues es la que tengo instalada, pero no debería ser muy difícil seguir los mismos pasos en español.

Una vez instalado, la ventana principal tiene el siguiente aspecto:

Ventana principal de Cryptool

Ventana principal de Cryptool

Si observamos los menús, podemos ver que Cryptool nos ofrece (entre otras) la posibilidad de cifrar y descifrar textos, herramientas para criptoanálisis y tutoriales guiados. En este texto veremos cómo usar Cryptool para analizar textos cifrados. Empecemos por uno fácil:


Gznyrém xlmlxrwz xlnl Fmrevihrwzw Klorgéxmrxz wv Ezovmxrz, l vo
Klor kziz olh znrtlh, vh fm lhxfil oftzi oovml wv vhgfwrl b kvievihróm.
Hlyivglwl, klijfv glwl zjféo ol hfurxrvmgvnvmgv olxl xlnl kziz vmgizi
vm vooz, gvmwiá jfv szxvi zotl wv ol zmgvirlinvmgv xrgzwl kziz hzori
zrilhl wv vooz. Vmgiv olh oftzivh náh xlmxfiirwlh, hv vmxfvmgizm oz
Xzhz wvo Zofnml (szyrgfzonvmgv fhzwz kziz wlinri olh qfvevh wv
nzwiftzwz, kvil gznyrém kziz qftzi z yroozi l ufgyloím, zfmjfv mlh
jfrgzm vhgv vm éklxz wv vcánvmvh), oz Yryorlgvxz (wlmwv oz tvmgv hv
wrervigv vhgfwrzmwl), b ozh krhgzh wv gvmrh b káwvo.

El texto se ha obtenido del reto de criptografa del IEEE, por Javi Moreno y Amine Tourisa. De hecho, la solución ya se encuentra en el blog de Javi, pero vamos a ver cómo lo hacemos en Cryptool:

  • Creamos un documento nuevo ( File | New )
  • Copiamos el texto del reto
  • Vamos a Analysis | Tools for Analysis | Histogram

Así obtenemos el siguiente diagrama de frecuencias para el texto:

Analisis de frecuencias dle criptograma

Análisis de frecuencias del criptograma

Si comparamos ese diagrama con el típico del español o el inglés, podemos ver que simplemente se le ha dado la vuelta… fácil, no? La respuesta es, como ya supondréis, ATBASH. Aplicando un descifrado con ATBASH (Crypt/Decrypt | Symmetric (Classic) | Substitution/Atbash … ), obtenemos el texto en claro:

También conocida como Universidad Politécnica de Valencia, o el Poli para los amigos, es un oscuro lugar lleno de estudio y perversión. Sobretodo, porque todo aquél lo suficientemente loco como para entrar en ella, tendrá que hacer algo de lo anteriormente citado para salir airoso de ella. Entre los lugares más concurridos, se encuentran la Casa del Alumno (habitualmente usada para dormir los jueves de madrugada, pero también para jugar a billar o futbolín, aunque nos quitan este en época de exámenes), la Biblioteca (donde la gente se divierte estudiando), y las pistas de tenis y pádel.

Ahora veremos cómo resolver un texto cifrado con Vigenère. Tomemos como ejemplo el siguiente texto:

Leer más…

TuXeD Criptografía, Seguridad

Timing attack en la librería Google Keyczar

Junio 1, 2009, 10:35 pm

Javi me lo mandó el otro día al correo, y ahora lo he vuelto a encontrar revisando mis feeds habituales. Nate Lawson encontró y describió en su blog un ataque lateral basado en temporización en las librerías Keyczar de Google.

Echadle un ojo a su post, se trata de un problema típico en las comparaciones de cadenas, y a tener en cuenta cuando se programan dispositivos empotrados y cualquier código con funciones de seguridad en general.

PD: Dije muy pronto, no? :P

TuXeD Sin especificar ,

Conferencias, transparencias y documentos

, 9:51 pm

Sí, lo sé, he estado ausente un tiempo laaaargoooo. Lo siento, pero he estado liado entre visitas de amigos y familiares, mudanza a una habitación nueva y demás. Hoy os traigo unos enlaces a documentos de conferencias, y prometo estar de vuelta muy pronto.

Archives Black Hat Europe 2009

CanSecWest 2009

Curso de análisis de malware de F-Secure en la Universidad de Helsinki. Las transparencias del curso están disponibles para todo el mundo.

Enjoy!

TuXeD Sin especificar

Solución al reto del FBI por vierito5

Abril 26, 2009, 6:38 pm

Al poco de publicar la entrada sobre el FBI Challenge, Javi me envió un e-mail con la solución. Un tiempo después me envió otra forma de resolverlo, y finalmente lo publicó en su blog.

Aquí tenéis su solución al citado reto.

TuXeD Sin especificar

Cripto Serie: WWII - Enigma

Abril 15, 2009, 8:00 am

Vamos a dejar ya los cifrados clásicos de lápiz y papel y adentrarnos en los cifrados mecánicos usados en la época de la Segunda Guerra Mundial. Vamos a ver la más famosas de las máquinas de cifrado, la máquina Enigma de la Alemania nazi. El análisis que haremos está basado en el libro Applied Cryptanalysis de Mark Stamp y Richard M. Low. Un libro muy recomendable si estáis interesados en el criptoanálisis, de verdad.

La máquina Enigma


La máquina Enigma fue desarrollada y patentada por Arthur Scherbius en 1918, y fue adoptada por la Alemania nazi para uso militar y diplomático. Criptoanalistas polacos rompieron el cifrado Enigma a finales de la década de 1930, y los bandos aliados explotaron estos conocimientos durante la Segunda Guerra Mundial.

Máquina Enigma

Máquina Enigma

Se dice que gracias a que la Enigma fue rota sin que los Alemanes lo supieran (gracias al uso más o menos cuidadoso de la inteligencia obtenida tras descifrar esos mensajes) se pudo acortar la guerra un año o incluso más. Se ha escrito mucho al respecto, y yo no soy ningún experto en el tema, así que os refiero a Google para más información histórica :)

Cifrando y descifrando con Enigma

Para cifrar con la máquina Enigma, después de haberla inicializado con la clave adecuada (como veremos luego), simplemente había que pulsar el botón de la letra de texto en claro a cifrar, y se iluminaría la letra de criptograma correspondiente en el teclado superior.

Para descifrar, había que poner la máquina en el estado correspondiente y presionar sobre la letra de criptograma recibida. Entonces, en el teclado superior se iluminaba la letra de texto claro.

Características básicas de la máquina Enigma

La máquina Enigma era una máquina electromecánica, basada en el uso de rotores. En la figura anterior, se puede ver fácilmente el teclado mecánico y el teclado retroiluminado, que funcionaban como entrada y salida de la máquina Enigma.

Además de estos, hay un plano de conexiones (stekker en alemán) con cables que conectan unos extremos con otros, y tres rotores en la parte de arriba de la máquina. La configuración de estos rotores y los cables del panel de conexiones conforman la clave inicial de la máquina.

Una vez la máquina estaba inicializada, se podía presionar sobre las teclas de texto claro o de criptograma y obtener el texto cifrado o el texto en claro respectivamente. El funcionamiento era básicamente como sigue:

Al presionar una tecla en el teclado, una señal eléctrica era enviada por al correpondiente patilla del stekker. Gracias a la configuración de cables, esta señal se transmitía a otra letra distinta. Es decir, el stekker funcionaba como un simple mapping del alfabeto, donde a cada letra correspondía otra distinta: una sustitución simple.

Rotores de la máquina Enigma

Rotores de la máquina Enigma

Tras la sustitución, pasaba por los tres rotores, reflejaba en un reflector y volvía a pasar por los rotores (ver figura). Finalmente, desde los rotores pasaba de nuevo por el stekker que volvía a realizar una sustitución simple, y aparecía en el teclado iluminado. El efecto de los rotores y el reflector era el de una permutación: cada letra era convertida en otra distinta.

Sin embargo, si esto fuera todo, no tendríamos más que una sustitución simple complicada mediante el uso de una máquina electromecánica. Lo que añadía la máquina Enigma era una variación en la disposición de esos rotores.

Cada vez que una tecla era pulsada, el rotor de más a la derecha se movia una posición. El rotor del medio se movía cada vez que el rotor de la derecha había dado una vuelta completa, mientras que el rotor de la izquierda se movía cada vez que el rotor central se había movido una vuelta completa.

Además, era posible seleccionar en qué punto de esa vuelta completa se producía el avance del siguiente rotor. Es decir, no tenía por qué ser al cabo de cada vuelta desde la posición inicial del rotor de la derecha, sino que podía ser desde un desplazamiento cualquiera del mismo. Podíamos configurar por ejemplo que el rotor central avanzara la quinta vez que el rotor de la derecha avanzara, y a partir de ahí lo haría cada vuelta.

Así pues, la máquina Enigma era un cifrado donde cada letra era cifrada mediante una sustitución simple del alfabeto diferente… pero con un número enorme de posibles alfabetos.

Para un análisis más pormenorizado de la máquina Enigma, os refiero al libro antes comentado, donde se analiza el funcionamiento de la máquina, se calcula el tamaño del espacio de claves (número de claves posibles) y se presenta un ataque a la misma.

TuXeD Criptografía, Seguridad