24.3.09

Tempest

Hace mucho mucho tiempo leí el criptonomicon donde se habla entre otras muchas muchas cosas de Phracking van Eck, una técnica que se basa en usar las ondas electromagnéticas que emanan de un monitor para capturar la información que se esta mostrando, esto parece un poco guerra de las galaxias pero ... funciona.

A todo este tipo de tecnología rara le llaman a modo genérico Tempest, y funciona mejor de lo que cabria pensar, el señor van Eck escribió sus cosas en 1985 y lo que se ve en el vídeo esta al alcance general, se muestran cosas bastante caras etc pero lo que se maneja en gobiernos, espionaje etc tiene que ser flipante.




Enlaces curiosos para frikear un rato
Tempest Wikipedia
Van Eck Phreacking

15.3.09

Buena documentacion

When you feel compelled to add a comment, consider rewriting the code to make it clearer.

Si te sientes obligado a añadir un comentario considera reescribir el codigo para hacerlo mas claro.

(visto en la documentacion de Java ... cuanta razon tienen)

8.3.09

libreria de cadenas de C (II)

strcmp: devuelve 0 si las dos cadenas son iguales, un numero menor que 0 si la segunda es "mayor" que la primera y mayor que cero si la primera es "mayor" que la segunda.

int
strcmp(char *s1, char *s2)
{
unsigned c1, c2;

for(;;) {
c1 = *s1++;
c2 = *s2++;
if(c1 != c2) {
if(c1 > c2)
return 1;
return -1;
}
if(c1 == 0)
return 0;
}
}

Lo interesante del código es que casi no necesita explicación, y seria bastante difícil hacerlo de una forma mejor o mas corta, solo si c1 es igual a c2 se pasará al segundo if, si además c1==0 también c2==0, es decir que las dos cadenas han terminado y son iguales.

Una curiosidad es que se suele poner el tipo que devuelve la función en una linea separada y así poder buscar mas fácilmente con grep.

La libreria de cadenas cd C (I)

Cuando aprendí a programar siempre me pedian que escribiera funciones de prueba que, compararan cadenas, copiaran cadenas etc. y siempre me pregunté como lo harian los que de verdad sabian o mejor dicho como lo harian las librerias del sistema.

Ultimamente me he estado pegando con plan9 y he visto el codigo de varias funciones de cadenas del sistema, asi que ahi va una explicación rapida.

strchr: devuelve un puntero a la primera posicion de ch si este está en s1, o NULL si no está.

char*
strchr(char *s, int c)
{
char c0 = c;
char c1;

if(c == 0){
while(*s++)
;
return s-1;
}

while(c1 = *s++)
if(c1 == c0)
return s-1;
return 0;
}
Lo primero es que si el carácter que estamos buscando es el carácter 0, esto es NULL (en C se pone un NULL al final de cada cadena) entonces lo único que hacemos es avanzar el puntero de la cadena hasta encontrar ese NULL.

Como se usa un post incremento s++, hay que devolver s-1 ya que s era NULL y además le hemos avanzado una posición mas.

En caso contrario se va avanzando el puntero de la cadena y a la vez asignándoselo a una variable que se compara con el carácter pedido, si aun así no se ha encontrado se devuelve NULL (0).

Éste código ha salido de plan9

12.11.08

Cosas raras

Cuando estudias informática te das cuenta de que hay cosas que tu haces que el resto del mundo no suele hacer y por lo que te llamarian friki generalmente, hoy me ha ocurrido una de esas cosas, tuve que escribir un programa para una practica:

- Currito Programador: Un programa en un lenguaje orientado a objetos
- Programador de Verdad: Un programa en C?
- Programador de verdad intentando que las cosas vayan rapido: Ensamblador
- Ingeniero: Programando con 1's y 0's para el Microprocesador que has diseñado tu mismo!

Aqui el programa que calcula Fibonacci del numero que esté en la primera direccion de memoria de datos y luego comprueba si es primo:

01100100000000010000000000000000
11001100000000000001000000000001
10110000000000110000000000000001
11001100000000000010100000000001
10001000101000010000000000000110
11001100000000110010000000000001
11001100011000100001100000000001
11001100000001000001000000000001
10110000101001010000000000000001
10000100101000110000000000000000
11001000000000000000000000000100
11001100011000000000100000000001
10110000101010100000000000000001
10110000000001000000000000000010
10110000000001110000000000000001
11001100001000000001000000000001
11001100000001000001100000000001
10001000001001000000000000001001
10001000010000000000000000001000
11001100001000000001000000000001
11001100000001000001100000000001
11001100010000110010100000001010
10001000101001110000000000000100
11001100010000110001000000000010
11001000000000000000000000010101
10110000100001000000000000000001
11001000000000000000000000001111
11001100000000100011000000001010
10000101010001100000000000000000

Despues de un duro dia solo queda decir: ¡Mi Cerebro va a estallar!

3.11.08

Cifras Monoalfabéticas

Una cifra monoalfabética es aquella en la que una letra de un alfabeto es cifrada por la misma letra, se puede representar una cifra monoalfabética escribiendo el alfabeto origen y el destino en una tabla:

Aunque la mayoria de cifras se realiza sobre el mismo alfabeto no tiene por que ser asi, podriamos cifrar cada letra por un caracter chino y seguiria siendo una cifra monoalfabética.

De esta forma podemos obtener un numero de cifras enorme, en concreto 26!

Cifras Afines

Para cifrar usando un ordenador representamos las letras como números, así seria a=1, b=2, ..., z=0, así las cifras aditivas serian una suma a estas letras, en este caso un desplazamiento de s posiciones (s mod 26).

Pasos:
  • Se codifica la letra en un numero
  • Se aplica el desplazamiento de s posiciones
  • Si el resultado es mayor de 25 nos quedamos con el resto de dividirlo por 26.
Ejemplo: Queremos codificar la v con una cifra aditiva de desplazamiento 5.
  • 'v' = 22
  • 22 + 5 = 27
  • 27 mod 25 = 1 = 'A'
Si podemos usar la suma... podemos usar también la multiplicación?

Para la cifra multiplicativa tenemos que multiplicar el numero correspondiente a la letra por un número t, esto de nuevo puede ser mayor que 25 por lo que el resultado será el resto de dividirlo por 26 (aplicar mod 26).

Por ejemplo la cifra multiplicativa 2 seria:

Aquí tenemos un problema, ya que las letras de la cifra estan repetidas no podriamos recuperar el texto original por lo que esta cifra no se puede utilizar.

Que pasa con la cifra multiplicativa 3:


En este caso encontramos una cifra monoalfabética que si podemos usar, el caso es que son cifras monoalfabéticas: 1,3,5,7,9,11,15,17,19,21,23,25, esto hace un "gran total" de solo 12 cifras multiplicativas, lo que no es mucho aunque de todas formas se pueden combinar con las cifras aditivas.

A una letra de texto claro le sumamos un numero s y a este resultado lo multiplicamos por t, esto se escribe [s,t] y es lo que se llama una cifra afín, de este tipo hay 12x26 = 312 posibles cifras afines.

31.10.08

Criptoanalisis (I)

Imaginamos ahora que estamos en el lado del malo, por esas cosas de la vida nos hemos enterado de que el texto cifrado con el que nos hemos encontrado ha sido cifrado mediante una cifra aditiva, hay dos formas principales con las que nos podemos enfrentar con el problema:

1) Ataque de fuerza bruta o (Exhaustión de todas las posibilidades):

Solo hay 26 posibles claves, asi que si las aplicamos todas habra un texto que tendra sentido, la razon de que esto funciona es que la mayoria de las combinaciones de letras no tienen sentido, el problema es que probar si un texto "tiene sentido" no es algo que podamos automatizar mediante un programa, o por lo menos tendriamos que tener un programa que conozca muchas palabras por lo que sería matar moscas a cañonazos.

IOL GYMMUAY XIYM HIN LYGUCH MYWLYN

Si aplicamos el razonamiento solo a la palabra HIN vemos que usando un desplazamiento 6 obtenemos la palabra "not" la unica que tiene sentido.

Ejemplo sacado de Cryptology

2) Análisis estadístico

En casi todos los lenguajes las letras del alfabeto no aparecen con la misma frecuencia y es curioso lo poco que cambian estas distribuciones entre distintos textos aunque si cambian entre diferentes idiomas.

Wikipedia Español
H4ck1t

Si ciframos un texto y le aplicamos un análisis estadistico veremos que la frecuencia de aparición de ciertas letras será similar a las originales a las que representan, en el ejemplo anterior tenemos:

Como la letra con mas apariciones es la Y, asumimos que representa a la "e" (que es la letra mas común en Ingles), esto hay que comprobarlo ya que está basado en estadísticas, siempre podríamos encontrarnos con un texto que hable de "Pañales dañados en España" y la ñ ocuparia una posición que no le corresponde. La evidencia la encontrámos en que las siguientes letras "Y" y "Z" tienen poca frecuencia al igual que la "f" y la "g" en el inglés.

La buena noticia es que esto es facil de automatizar, la mala es que al ser un método estadistico podemos fallar al hacer ciertas suposiciones y hay que tener cuidado con lo que suponemos, sobre todo en textos cortos.

(Ahora se para que sirve la estadistica que me enseñaron en la universidad)

Cifras Aditivas

Uno de los primeros usuarios de los que se tiene noticia de las cifras aditivas fue Cayo Julio Cesar (100-44 a.c), la cifra de cesar consistía en sumar tres posiciones a cada letra:

Texto Claro: ABCDEFGHIJKLMNOPQRSTUVWXYZ
Texto Cifrado: DEFGHIJKLMNOPQRSTUVWXYZABC

Se encripta substituyendo las letras que se encuentran en el texto en claro por las del cifrado, así cifra se convierte en FLIUD, para descifrar se restan tres posiciones a cada letra. Hay 26 posibles claves que se pueden usar con este método que serian las posiciones a desplazar en nuestro alfabeto.

Cifrar con las tablas de arriba es fácil pero tedioso para textos largos, así que en 1470 el arquitecto Leone Battista Alberti inventó una maquina hecha con dos discos que mecanizaba el proceso, el disco interior podía rotar generando la cifra aditiva.


El algoritmo y la clave tienen funciones diferentes, el algoritmo es grande y complicado, en consecuencia no se debe mantener en secreto, la seguridad del algoritmo debe recaer en la clave.

26.10.08

La Scitala Espartana

Scitala de la Wikipedia
Todo viene de hace 2500 años, por lo menos segun lo cuenta Plutarco, el gobierno de Esparta enviaba mensajes secretos a sus generales usando un curioso método, la idea era que emisor y receptor tenian un cilindro cada uno de el mismo radio en el que el emisor enrollaba una tira de tela y escribia sobre la tira en sentido horizontal. Asi quedaba oculto el mensaje que se enviaba y solo se podia recuperar si se disponia de un cilindro igual al que tenia el emisor.

La Scitala usada tiene una circunferencia c, que se puede medir en número de letras, asi que lo que hay que descubrir el la circunferencia.

Para el siguiente mensaje:

SYBLCRESEERACHTAYPUOHIPHRUEMTYILSOO!TDOFG

c=5
S R R A H U I ! G
Y E A Y I E L T
B S C P P M S D
L E H U H T O O
C E T O R Y O F

c=6
S E C U R I T
Y S H O U L D
B E T H E S O
L E A I M O F
C R Y P T O G
R A P H Y !

La Scitala es un metodo de cifra por transposición, las letras permanecen iguales y el cambio se produce en la posicion, este método (transposición) se sigue usando combinado con otros como la substitucion.

Para saber mas:

Wikipedia