Extended Tiny Encryption Algorithm

Extended Tiny Encryption Algorithm (XTEA (eXtended TEA) es un algoritmo criptográfico utilizado para el cifrado por bloques, al igual que el algoritmo TEA (presentado en 1994), pero corrigiendo las deficiencias de este último.

Sus diseñadores fueron David Wheeler y Roger Needham del Laboratorio de Informática de Cambridge, los cuales presentaron un informe técnico sobre el algoritmo que fue publicado en 1997 (Needham y Wheeler, 1997). Este algoritmo no está sujeto a ninguna patente.

Descripción editar

Al igual que TEA, XTEA está basado en una estructura de red de Feistel con 64 rondas. Además, también opera sobre bloques de 64 bits utilizando una clave de 128 bits. Las diferencias que posee con respecto a TEA es que incluye una generación de claves más compleja y reordenación de los turnos o rondas, la operación XOR y adiciones.

Junto con XTEA, se ha presentado un algoritmo de cifrado de bloque variable denominado Block TEA, el cual utiliza la función de redondeo de XTEA pero aplicada cíclicamente a través del mensaje completo en varias iteraciones. Debido a que opera sobre todo el mensaje, una de las propiedades que tiene Block TEA es que no es necesario utilizar cifrado por bloques. Posteriormente, se encontró un ataque sobre todo el Block TEA descrito en (Saarinen, 1998), donde también se detalla las debilidades del sucesor de Block TEA, XXTEA.

Uno de los mejores ataques que ha sufrido XTEA, ha sido relacionado con la clave que fue derribada en 27 de las 64 rondas que tiene XTEA y para ello se necesitaron 220.5 textos planos y una complejidad temporal de 2115.15.

Implementación en C editar

Este código en C, es una adaptación de la versión del código de referencia del dominio público de David Wheeler y Roger Needham. La funcionalidad que posee es la de cifrar y descifrar usando XTEA:

#include <stdint.h>

/* Se tienen 64 bits de datos en v[0] y v[1] y 128 bits de clave en k[0] - k[3] */

void Cifrar(unsigned int num_rounds, uint32_t v[2], uint32_t const k[4]) {
    unsigned int i;
    uint32_t v0=v[0], v1=v[1], sum=0, delta=0x9E3779B9;
    for (i=0; i < num_rounds; i++) {
        v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);
        sum += delta;
        v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]);
    }
    v[0]=v0; v[1]=v1;
}

void Descifrar(unsigned int num_rounds, uint32_t v[2], uint32_t const k[4]) {
    unsigned int i;
    uint32_t v0=v[0], v1=v[1], delta=0x9E3779B9, sum=delta*num_rounds;
    for (i=0; i < num_rounds; i++) {
        v1 = (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]);
        sum = delta;
        v0 = (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);
    }
    v[0]=v0; v[1]=v1;
}

La diferencia existente entre este código y el original es la utilización de uint32_t en vez de unsinged long (64 bits) o la utilización de const. Además, en el original se omitían paréntesis redundantes.

Véase también editar

Referencias editar

  • XTEA(enlace en inglés)