miércoles, 14 de mayo de 2008

Génesis / Algoritmo de encriptación perfecto

En mis movidas mentales se me ocurren cosas bastante tontas, pero alguna veces me vienen cosas interesantes. Hoy mismo me han venido a la cabeza dos cosas que quiero compartir con vosotros.

Génesis de la programación

La primera de estas trata acerca del génesis de la programación, la pregunta de: ¿Cómo se programó el primer compilador?. Esto es un poco como lo de: ¿Qué fue primero?¿El huevo o la gallina? solo que en este caso debería haber una respuesta. Claro, la lógica indicaría que primero se debió hacer un compilador de ensamblador que pasara a código máquina y que después pudiendo programar en ensamblador yo ya haría otro que me compiliara un lenguaje de alto nivel. Pero aún así, ¿Cómo se programaría el compilador de ensamblador? (No se si debería llamarse compilador, pero asumiremos que lo que traduce texto de órdenes de ensamblador a lenguaje máquina también se llama compilador) Este compilador se tendría que haber programado con unos y ceros, pero, aunque fuera sencillo sería una tarea bastante ardua. Me imagino ahí a un ejército de gente traduciendo instruccciones de ensamblador a código máquina. Pero además, ¿Cómo se escribirían los programas? Porque nadie habría programado ningún editor de texto.

Y la verdad es que no puedo satisfacer mi curiosidad, he buscado pero no he encontrado una respuesta concreta. Ahora bien, he encontrado algunas cosas interesantes:

- Compilador de C++

The first C++ compiler (Cfront) was written in C++.


- La siguiente suena a bulo pero la idea mola. Compilador cerebal

Crean el primer compilador cerebral.

La compañía americana Sun microsystems ha desarrollado el primer compilador cerebral. Se trata de un API del lenguaje Java muy especial ya que permite al programador, teniendo ciertos pensamientos, crear directamente un ejecutable binario sin necesidad de escribir una sola linea de código.

- Historia de los compiladores

El primer compilador de la historia se llamaba A-0

Pone por ahí que el primer compilador de Fortran costó 18 años / hombre

Pues eso, que ahí queda.

-----------------------------------------------------------------

Un algoritmo de encriptación perfecto

Hoy en la clase de redes, mientras aprendía tanto (sobre todo las fórmulas) se me ha pasado por la cabeza un método de encriptación que pienso que sería bastante dificil de romper, os cuento un poco la idea.
Imaginemos, por ejemplo, que yo me monto un servidor para acceder remotamente y este acceso se hace con un login y un pass.
Yo, me defino mi pass en el servidor. Además de esto, yo sincronizo mi reloj de pulsera con el servidor (ahora veréis para qué).
A la hora de conectarme a mi servidor, yo le envió el login y con el pass hago lo siguiente.
A partir de la hora de mi reloj y mi contraseña, yo calculo a través de la función que me dé la gana, un código.

Por ejemplo:

12 : 34 "lalala" --------> "1234lalala"

(Estimamos al minuto por el tiempo de transmisión. También podría ser un intervalo de minutos, etc)
Le envío este pass al servidor. El con la hora y con lo que le envío comprueba que todo sea correcto, es decir, que haga la transformada inversa.
Claro, si lo pensamos bien, esto sería un pass que cambia con el tiempo. Si cambia cada minuto y yo hago que sea suficientemente largo (de modo que por fuerza bruta, en un minuto, se puedan probar el 10^-10 % de claves posibles) no se podría descifrar por fuerza bruta, además de fuerza bruta habría que tener suerte.
La única pega de esto es que tienes que llevar tu reloj, pero vamos, que si aceptara todas las contraseñas de un rango de 10 minutos no habría problemas.
¿Qué me decis? ¿Os convence? Si no me poneis pegas tal vez lo patente :)

3 comentarios:

señor clorofila dijo...

Wenas¡¡

Ey, es verdad, que me lo has dicho esta mañana en cafetería antes de comer ;). Eh, pues no está mal... pero te olvidas de que el objetivo es garantizar seguridad entre dos o mas entidades. Si solo tienes tu un reloj, pues no tiene gracia la cosa ^^.

Más que un algoritmo de cifrado, yo lo veo más como algo que autentifica al usuario que intenta acceder al sistema. Es como una especie de contraseña que cambia con el tiempo. En este sentido, lo que tienes al fin y al cabo es una llave que abre lo que quieres, solo que tú sabes que ésa es tu llave. Aún así, es muchisimo mejor que una contraseña normal, dado que si alguien quiere acceder a tu sistema necesita:
1. Conocer la palabra "lalala"
2. Tener el reloj
3. Saber utilizar el reloj


Si quisieras proponer tu sistema para elaborar un algoritmo de cifrado, tendrías el problema de siempre, que para poder comunicarte con seguridad con alguien necesitas previamente acordar una clave (en este caso la movida del reloj), y deberás hacerlo con todos con los que te quieras comunicar. Luego, el momento vulnerable de la comunicacion es cuando estas repartiendo relojes (claves) a todo quisqui, dado que es ahi donde puede haber lo que se llama Evesdropper, cuya traducción es "quien escucha en secreto". Luego, quien quiera romper el codigo, tan solo tendría que escuchar, adivinar la clave, y robar un reloj.

Para salvar el problema anterior, existen modelos basados en claves públicas y privadas. Y si os interesa frikear aun más, miraos algo sobre criptografía cuantica, que utiliza el principio de incertidumbre de Heissenberg. Aunque leí que un grupo del MIT logró capturar informacion en una red protegida por criptografía cuántica en un entorno de prueba... asi que, parece que ya nada es seguro ^^.

Javier dijo...

flipo con la compilacion cerebral esa ...

la verdad es que mas de uno de nosotros no podiamos ponernos ese gorro de piscina con cables para programar porque con lo retorcidos que somos daria error nada mas conectarlo... xD

Y lo del algoritmo de encriptacion te dire que con tu texto a mi por lo menos me has dejado encriptado, xD

Anónimo dijo...

Buenas!

No puedo resistirme a contestar, sueltas una serie de cosas por las que te ganas suspender este año...

Primero: El ensamblador "clasico" no compila ni de lejos. Ni siquiera traduce nada. Solo sustituye cadenas de texto por códigos hexa y etiquetas por direcciones de memoria.

Fíjate, en muy poquitos bytes puedes hacer un ensamblador muy básico sin comprobaciones de ningún tipo. Una vez tienes este "protoensamblador" puedes ir mejorándolo utilizándolo a sí mismo.

¿Que crees que es muy tedioso? Qué va. ¿Cuántas instrucciones puedes ensamblar tu a mano en una jornada sin mucho esfuerzo? ¿1000? Ese esfuerzo inicial es más que asumible, por muy coñazo que sea.

De hecho, te recuerdo que los primeros computadores personales sólo tenian un teclado hexadecimal para ir metiendo tu mismo las instrucciones a mano que previamente te habías puesto en un papel. Y de salida, una pantalla de cristal líquido con media docena de dígitos.

Espero que eso también te responda acerca de tu duda sobre métodos de I/O sin teclado, ratón y pantalla.

Sobre tu fabulosa idea del reloj, mejor no se la cuentes a ningún especialista en seguridad informática porque se te reirá en las narices por dos razones:

La primera porque la hora es la misma en todas partes. Y si la hora es aleatoria y única en tu equipo y en tu reloj, es poco inteligente llevar un dispositivo con unos grandes números que te dan el desfase horario entre tu reloj y el GMT y que cualquiera puede ver.

Después, los relojes fallan cual escopetas de feria. Cada X tiempo tendrías que resincronizarte tu reloj y, además, usar uno especial que cuando se le quite la pila/batería mantenga la hora sincronizada...

Tu idea del reloj me da que no estás muy puesto. Si quieres una solución "parecida", que es completamente funcional, que es muchismo jodida de encriptar y que además no necesita llevar relojes encima, te invito a que te mires cómo funciona Kerberos. Que, por cierto, es el sistema usado por Microsoft para autenticarse en Active Directory.

Y como te han dicho, si además te empapas de cómo va el mundo de las claves públicas y privadas descubrirás cómo asegurar la autenticidad del remitente y la seguridad de la comunicación sin tener que escribir ningún password (eso sí, necesitando una entidad de confianza que escupa las claves del compañero o pasándolas a mano).

Salud!