sábado, 14 de marzo de 2015

criptografía - criptosistemas simétricos

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 éste ú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.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 TEAXXTEA.
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.5textos planos y una complejidad temporal de 2115.15.
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 
 
/* 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.

Visión de conjunto

El cifrado Tiny extendida Algoritmo (XTEA) es un bloque de algoritmo de encriptación de cifrado que es muy simple de implementar, tiene rápido tiempo de ejecución, y toma el espacio de almacenamiento mínimo. Fue diseñado para mejorar las debilidades del algoritmo XTEA. El ejemplo se incluye para ser compilado y utilizado en un objetivo LabVIEW FPGA.

Tabla de contenido

  1. Algoritmo y Utilización
  2. LabVIEW Diseño
  3. Uso Ejemplo de código
  4. Referencias

1. Algoritmo y Utilización

XTEA fue diseñado David Wheeler y Roger Needhamof el Laboratorio de Informática de la Universidad de Cambridge y puesto a disposición en 1996. Está diseñado para cifrar los datos a través de muchos ciclos de iteración en lugar de memoria que consume matrices de datos. XTEA no está sujeta a ninguna patente.
La rutina de cifrar, escrito en C, se describe a continuación del papel del autor en XTEA y asume 32 tamaño de bit de la palabra.Además, la clave se almacena como k [0 ... 3] y los datos son v [0] y v [1].
vacío encipher (num_rounds unsigned int, unsigned long * v, unsigned long * k) {
    v0 largo sin signo = v [0], v1 = v [1], i;
    largo sin signo de suma = 0, delta = 0x9E3779B9;
    for (i = 0; i
       v0 + = (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (suma + k [suma y 3]);
        suma + = delta;
        v1 + = (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (suma + k [(suma >> 11) y 3]);
    }
    v [0] = v0; v [1] = v1;
}
Debido al tamaño pequeño, el algoritmo es ideal para aplicaciones embebidas y puede ser fácilmente implementado en hardware, tal como un FPGA. De seguridad adicional se puede añadir al aumentar el número de iteraciones. El número predeterminado de iteraciones es 32, pero puede ser configurable y debe ser múltiplos de 32.

2. LabVIEW Diseño

El código para LabVIEW FPGA ha sido creado usando 2 VIs - Encrpt.vi y Decrypt.vi.
Para utilizar el Cifrar VI, las entradas son dos valores de datos U32 de 32 bits, el número de iteraciones para ejecutar el VI y el valor de clave de 128 bits. La clave se representa como un cuatro valores hexadecimales de 32 bits. Los valores clave pueden ser creados utilizando un generador de claves de 128 bits. La salida del sistema es dos valores de 32 bits que son la versión cifrada de la entrada.
                                                                                                             
Encrpt.vi
Para utilizar el VI descifrar las entradas son dos valores de 32 bits de datos U32, el número de iteraciones, y el valor de clave de 128 bits. La clave se representa como cuatro valores hexadecimales de 32 bits. Los datos de entrada deben ser los datos cifrados de la Encrypt.vi y el mismo valor de clave de 128 bits utilizado en para el cifrado.
Decrypt.vi
Una carpeta adicional sub-VI se incluye en el proyecto y se utiliza para implementar la lógica de los algoritmos. No es necesario realizar modificaciones.

3. Uso Ejemplo de código

Añadir la, carpeta Descifrar VIs y subVI Cifrar en la meta FPGA.
El siguiente diagrama de bloques ilustra cómo los algoritmos de cifrar y descifrar pueden ser utilizados en un proyecto.

No hay comentarios:

Publicar un comentario