sábado, 6 de marzo de 2010

El día que un CRC cambió mi vida parte II

El fundamento matemático del CRC nos habla de códigos de bloques lineales expresados como polinomios en cuerpos de Galois, pero si profundizamos por este camino nos podría dar una hemorragia cerebral.

En vez de eso, comenzaremos por dar un ejemplo sencillo, pasando de lo particular a lo general.

Imaginemos que nuestro mejor amigo nos manda el mensaje “SOS” por cualquier medio, indicándonos que se encuentra en peligro. Pero por desgracia durante la transmisión del mensaje ha habido interferencias electromagnéticas que han alterado el contenido del mensaje y lo que recibimos es “OSO”. 
No solamente no prestamos ayuda a nuestro amigo, sino que además nos cabreamos con él por llamarnos OSO.

Para evitar lo anterior y asegurarnos que el mensaje que nos llega está inalterado, nuestro amigo le aplicará un CRC, es decir, le añadirá al mensaje otro símbolo (de ahí viene lo de redundancia) que nos indicará si el mensaje ha sido alterado o no.

Ese símbolo extra no es más que el resto de dividir el mensaje por un valor previamente pactado en ambas partes.

Veamos el proceso:

Según el estándar ASCII el mensaje “SOS” se codifica como:

‘S’ es codificado con el valor 83.
‘O’ es codificado con el valor 79.

El mensaje sería 837983 y lo vamos a dividir por el símbolo ‘P’ que en ASCII es 80, el resto de esta división se concatena al mensaje origen:

837983 MOD 80 = 63

63 equivale a el símbolo ‘?’, por lo tanto el mensaje listo para enviar sería “SOS?”. 
Cuando recibamos el mensaje, como pactamos el CRC con nuestro amigo, repetimos el proceso y comprobamos si coincide.
Si el mensaje recibido hubiese sido “OSO?”, calcularíamos el CRC de “OSO”:

798379 MOD 80 = 59

59 equivale al símbolo ‘;’ que es distinto de ‘?’, luego ya estamos en condiciones de advertir que el mensaje no es fiable.

Para que los dispositivos electrónicos operen justamente como nosotros acabamos de hacer, los matemáticos, esos grandes inventores de realidades, idearon una manera magistral de entender y analizar los códigos cíclicos mediante polinomios.

Un patrón de 0 y 1 se representa como un polinomio con coeficientes de valor 0 y 1.

La potencia de cada término del polinomio muestra la posición del bit y el coeficiente el valor del bit.

Por ejemplo, el polinomio:



se representa como 10000010000010001. 

Como se observa el beneficio es inmediato ya que un patrón de 17 bits se representa con un polinomio de 4 términos.

Sin embargo hay que recalcar que la elección del divisor, llamado polinomio generador, no es trivial, pero nuevamente nuestros amigos matemáticos han elaborado algunos polinomios generadores estandarizados y que se aproximan al 100% de la detección del error en mensajes grandes.
Alguno de estos son:    
  • CRC-12.
  • CRC-16.
  • CRC-CCITT.
  • CRC-32.
Puede veniros bien profundizar en el cálculo del resto de una divisón de polinomios mediante operaciones lógicas XOR para entender luego el código que publicaré en sucesivas entregas. 


Aconsejo visitar:
Como veis la teoría es fácil, pero en la práctica, un fichero se compone de millones de bits y calcular el resto de una división de tal calibre es impensable.

En lugar de esto lo que se suele hacer es una mezcla de checksum con CRC, pero esto lo veremos en la próxima entrega, donde nos meteremos de lleno con un código que calcula el CRC de un fichero.

El día que un CRC cambió mi vida

Tal día como hoy, traceando el código desensamblado de una aplicación, me encontré, con sorpresa, un ingenioso método de técnica anti-depuración. El creador de la aplicación comprobaba la integridad de una parte de su código mediante un algoritmo CRC, algo que no se me abría ocurrido en la vida.
Debido a este hallazgo me puse a repasar los libros de la carrera en donde nos explicaban la técnica del CRC, pero con asombro vi que una cosa es la teoría y otra muy diferente es la práctica.
Pues bien, con este y otros artículos próximos quiero hacer que el CRC sea lo más entendible posible, ya que en la red hay infinidad de artículos, pero que se aproximen de los general a lo particular no hay tantos.
Comencemos entonces.
¿Qué es CRC?
CRC es el acrónimo de Código de Redundancia Cíclica o en inglés Cyclic Redundancy Check y es una técnica que se utiliza para comprobar si un flujo binario ha sufrido alguna modificación en el paso de un origen a un destino.
Algunos pensaran ¿flujo qué…?, ¿paso qué…?, vale, vale, un poco más despacio.
Todos sabemos que nuestro mundo está rodeado de dispositivos electrónicos y en donde la información generalmente se codifica con señales electromagnéticas, que habitualmente suelen ser ceros y unos lógicos a los que llamamos bits.
El traspaso de un punto a otro de estos bits es lo que se denomina flujo. Como algunos ejemplos cotidianos podríamos destacar:
  • Descomprimir archivos. Paso de un fichero comprimido (origen) a uno sin comprimir (destino).
  • Ver fotos en nuestros dispositivos. Paso de un fichero binario (origen) a un programa (destino) que interprete esa foto y la visualice.
  • Intercambiar archivos con nuestros móviles por cualquier medio.
  • Mandar un correo.
  • Navegar por la web.
·     Y en general todo lo que implique traspaso de información de un punto a otro.
Ahora pensad ¿qué ocurriría si ese flujo fuese alterado? bien por problemas en el medio de transmisión (cable, ondas, luz, …) o bien intencionadamente por algún personajillo que le guste lo ajeno. Pues que sencillamente nadie podría garantizar la integridad de los datos recibidos y eso en determinados contextos puede ser fatal.
Y es aquí donde entran en juego técnicas como el CRC para comprobar la integridad de un mensaje o flujo de datos.
En la próxima entrega de la saga explicaré el fundamento que hace esto posible.

martes, 2 de marzo de 2010

Como un niño con juguete nuevo

Hace apenas unas horas me he matriculado en un curso semipresencial que no tiene desperdicio "Avances en seguridad en Internet".

Para empezar trata de temas que son mi auténtica pasión y para finalizar se realiza en Salamanca, una ciudad que emana cultura por todos sus rincones o como bien puntualiza mi hermana 'huele a libro'.

Sólo me queda decir a todos los que estudiáis conmigo que aun estáis a tiempo de matricularos ya que el plazo termina el 10 de Marzo y el curso promete.

El temario es:

1. Seguridad en la web, problemática, sistemas y políticas de seguridad (2 horas)

2. Fundamentos de la criptología: (3 horas)
  • Base teórica y fundamentos: criptografía y criptoanálisis

3. Tipos de sistemas criptográficos: (3 horas)
  • Criptosistemas de clave privada: IDEA, DES, TRIPLE DES, AES
  • Criptosistemas de clave pública: RSA, Diffie-Hellman
  • Protocolo SSL

4. Aplicaciones Seguras: (3 horas)
  • Autenticación, Firmas digitales.
  • Funciones resumen: MD5, DSA.
  • Trusted Third Parties.
  • Certificados X.509, Correo electrónico seguro. PGP.
  • Medios de Pago: SSL, SET.
  • Dinero electrónico. Banca electrónica.

5. Técnicas de ataque: (3 horas)
  • Herramientas de recogida de información, Herramientas de búsqueda de debilidades.

6. Técnica de Spoofing: (3 horas)
  • Técnica de sniffer, troyanos, firewalls

7. Auditoría Informática (3 horas)
8. Certificación Profesional (3 horas)
9. Legislación Vigente (2 horas)
10. e-Forensis (2 horas)
11. Programación de Exploits (2 horas)
12. Análisis de ficheros binarios (1 horas)

martes, 23 de febrero de 2010

Práctica de Programación III de ITIS por la UNED curso 2008/09

Práctica que realicé de la asignatura de Programación III cursada en el año 2008/09.
Asignatura durísima al igual que su práctica, pero que a mi modo de ver es de las más importantes de la carrera.

Se empiezan a ver algoritmos realmente prácticos y efectivos en resolución de problemas.

En esta práctica se nos pedía resolver sikakus, algo que por aquellos días me sonaba a 'chino' y que después de terminarla fue para mí como el abecedario.

Como siempre, todo aquel que quiera el código fuente ya sabe donde pedirlo.


Descargar Memoria práctica

sábado, 20 de febrero de 2010

Estoy en la nube

Desde hace relativamente poco tiempo y desde mi última visita al Simo Network del 2009, aparece un nuevo vocablo en mi jerga informática que no deja de perseguirme, “la nube”.

Muchos de vosotros ya tenéis claro este concepto, pero seguro que para otros es completamente nuevo. Pues bien para ello es mi reflexión.
Este concepto será el futuro inmediato de todo lo que nos rodea a nivel informático, tanto a usuarios, como a profesionales, y sin olvidarnos de las empresas.
Podemos decir que “informática en la nube” o "cloud computing" es la conexión de todos los recursos que se disponen en la red sin ningún tipo de restricción sobre la máquina en donde nos encontremos.
Es decir, tan solo nos bastará con disponer de un terminal con una capacidad de procesamiento y almacenamiento relativamente pequeña para poder realizar todas nuestras tareas cotidianas, como por ejemplo, crear documentos, hojas de cálculo, desarrollo de software, creación, edición y visionados multimedia como música, imagen y vídeo…y todo lo que se nos ocurra.
Seguro estoy que la mayoría de vosotros ya usáis este concepto sin saberlo. ¿Qué no me crees?, entonces dime que son servicios como iCloud, eyOS, Windows Azure, Dropbox, Filebox, skyDrive, Gmail, iTunes, Spotyfi, Google maps, Google street, Google Earth, Google SketchUp, Google Picasa, .... y así podríamos continuar hasta acabar en el infinito y mas allá.
Todo esto plantea muchas ventajas y a la vez muchas dudas.
Las ventajas son evidentes, simplemente si nos hace falta un servicio y ya está en la nube, haremos uso de él sin preocuparnos por instalaciones, almacenamiento, capacidad de procesamiento y mucho menos del mantenimiento.
Las desventajas, también son evidentes, ¿Qué ocurre con nuestros datos?, ¿Estarán seguros de terceras personas?...
Una de las personas más importantes de este siglo  Richard Stallman asegura que la nube pone en peligro las libertades de los usuarios.
Como podéis observar la polémica está servida.
Por mi parte yo sí que haré uso de ella, siempre y cuando lo necesite. Véase como ejemplo mi descubrimiento de Dropbox (gracias kiko) o filebox, que me permite subir copias de respaldo de mis datos digitales de manera tal, que me despreocupa de posibles borrados accidentales o cosas similares debidos a mi integral despiste. Imagínate que pasaría si se te estropea el disco duro que alberga todas tus fotos, documentos o programas más importantes.
Todo lo anterior ha sido dando una visión superficial a nivel de usuario, imaginaros si nos adentramos a los que nos compete la creación de software, pero eso por el momento lo pospongo.
Para terminar, si os ha picado la curiosidad os invito a que hagáis uso de la nube y visitéis la definición en Wikipedia que no tiene desperdicio.
Saludos y hasta mi próxima reflexión.