Tiny Encryption Algorithm (TEA) es un cifrado de bloques notable por su simplicidad de descripcion e implementacion, tipicamente unas pocas lineas de codigo. Fue diseñado por David Wheeler y Roger Needham en el Laboratorio de Computacion de Cambridge, y presentado por primera vez en el taller Fast Software Encryption en 1994. Este cifrado no esta sujeto a patentes.
TEA opera con bloques de 64 bits y usa una clave de 128 bits. Tiene una estructura Feistel con 64 rondas (sugeridas), tipicamente implementada en pares llamados ciclos. Tiene un extremadamente sencillo procesamiento de la clave, mezclando todo el material clave en exactamente la misma forma en todos los ciclos. Diferentes multiplos de una constante magica son utilizados para prevenir ataques simples basados en la simetria de los rondas.
TEA tiene una debilidad. Notablemente, sufre de claves equivalentes, cada clave es equivalente a otras tres (3), lo que significa que el tamaño efectivo de la clave es solamente 126 bits. Como resultado, TEA es especialmente malo como funcion de hash cryptografico. Esta debilidad fue lo que permitio un hack a la consola de juegos de Microsoft, la Xbox, donde el cifrado TEA fue utilizado como funcion hash. TEA es tambien susceptible al ataque de clave-relacionada (related-key) que requiere 223 textos planos seleccionados bajo un par de related-key.
El considerablemente pequeño tamaño del algoritmo TEA lo convierte en una opcion viable en situaciones donde existen condiciones extremas, como por ejemplo sistemas hardware (embebidos quizas) donde la cantidad de RAM disponible es minima.
El codigo para encriptar y desencriptar en lenguaje C, lo pueden obtener de wikipedia. Se los dejo aqui:
void encrypt (unsigned long* v, unsigned long* k) {
unsigned long v0=v[0], v1=v[1], sum=0, i; /* set up */
unsigned long delta=0x9e3779b9; /* a key schedule constant */
unsigned long k0=k[0], k1=k[1], k2=k[2], k3=k[3]; /* cache key */
for (i=0; i < 32; i++) { /* basic cycle start */
sum += delta;
v0 += ((v1<>5) + k1);
v1 += ((v0<>5) + k3); /* end cycle */
}
v[0]=v0; v[1]=v1;
}
void decrypt (unsigned long* v, unsigned long* k) {
unsigned long v0=v[0], v1=v[1], sum=0xC6EF3720, i; /* set up */
unsigned long delta=0x9e3779b9; /* a key schedule constant */
unsigned long k0=k[0], k1=k[1], k2=k[2], k3=k[3]; /* cache key */
for (i=0; i<32; i++) { /* basic cycle start */
v1 -= ((v0<>5) + k3);
v0 -= ((v1<>5) + k1);
sum -= delta; /* end cycle */
}
v[0]=v0; v[1]=v1;
}
Con estas dos funciones en mano, y recordando un poco de C, construi este simple y limitado programa que cifra o descrifa el archivo que le pasamos como parametro en la ejecucion. La clave esta hard-coded en el codigo del programa, esa es una muy grave limitacion que les dejo como tarea resolver/agregar.
#include
#include
#include
int
main(int argc, char **argv) {
unsigned long v[2];
unsigned long k[4];
/*
* Esta es la clave,
* necesito cambiar esto
*/
k[0] = 1979;
k[1] = 1980;
k[2] = 1981;
k[3] = 1982;
if(argc != 3) {
fprintf(stderr, "tinyEnc [e|d] 'file'\n");
exit(EXIT_FAILURE);
}
if((strcmp(argv[1], "e") != 0) && (strcmp(argv[1], "d") != 0))
{
fprintf(stderr, "Opcion no valida: %s\n", argv[1]);
exit(EXIT_FAILURE);
}
FILE *fp = fopen(argv[2], "r");
if(!fp) {
perror("fopen");
exit(EXIT_FAILURE);
}
FILE *tinyfp = fopen("output.tiny", "w");
if(!tinyfp) {
perror("fopen");
exit(EXIT_FAILURE);
}
printf("Input File: %s\n", argv[2]);
printf("Output File: output.tiny\n");
while (fread(&v, sizeof(unsigned long), 2, fp)){
if ((strcmp(argv[1], "e")) == 0){
encrypt(v, k);
} else if ((strcmp(argv[1], "d")) == 0){
decrypt(v, k);
}
fwrite(&v, sizeof(unsigned long), 2, tinyfp);
v[0] = 0x0;
v[1] = 0x0;
}
fclose(fp);
fclose(tinyfp);
exit(EXIT_SUCCESS);
}
Sugerencias y correcciones son bievenidas!
PEpe09 Said:
on August 13, 2008 at 7:04 pm
Sorry, but I’m new with c, what means “argc”? ‘Cause it says that if argc != 3 the program will be closed, and obviously argc its not 3
kalmbach Said:
on August 13, 2008 at 7:20 pm
Hi PEpe09:
argc contains the number of arguments that were passed to the program on the command line, and it includes the program itself. If you run the program without parameters, argc will be equal to 1 and argv[0] will contain the name of the program excecuted. Then, if you pass 2 arguments to the program, argc will be equal to 3 in runtime. For example, if you run:
$ tea e myfile.txt
argc=3
argv[0] == tea
argv[1] == e
argc[2] == myfile.txt
Regards.