miércoles, 24 de octubre de 2012

6th Assignment: Dragon Stream CIpher


For this week, I chose the Dragon stream cipher for the assignment. I will explain how it works, its advantages and the common attacks-vulnerabilities.

How does it work?

The Dragon Stream cipher explained in the PDF(link at the references) is used to generate a keystream using a key and an initialization vector as input. These two are provided at the end of the PDF, including both sboxes that can be used to test some examples. I used a 256-bit key and initialization vector.

F Function

The first thing defined in the PDF is the F function used both in the key setup and generation. As the PDF defines it: 

"The F function is a reversible mapping of 192 bits (six 32-bit words) to 192 bits. It takes six 32-bit words as input and produces six 32-bit words as output."

These six 32-bit input words are normally defined as a, b, c, d, e, f. And the output words are a', b', c', d', e', f'. Also the function has other components called G1, G2, G3, H1, H2, H3. These are used to provide high non-linearity. 

The main operations used in the F function are the xor(+) and the addition modulo 2^32[+]. In python we can do both with decimal integers, but normally we would need the binary representation for each number. For example:

 a = 29
 b = 21    
                   XOR                                                  ADDITION MODULO 2^32 

               a  (+) b  =  ?                                                           a [+] b = ?
               29  (+) 21 = ?                                                  (a + b) % 2^32 = ?
       << Conversion to Binaries >>                                (21 + 29) % 2^32 = ?
             11101 (+) 10101 = 01000                                 (50) % 2^32 = 32
       << Back to Decimal >>
               29 (+) 21 = 8
               a  (+) b = 8
             
This F function is described as follows:

The inputs as mentioned earlier are six 32-bit words and the outputs are also six 32-bit words, but mixed. 

Now the G and H functions are constructed using the 8x32 bit  S1 and S2 sboxes. These sboxes are provided at the end of the PDF as explained early. Also the 32-bit input used in the G and H functions is separated in four bytes: x0, x1, x2 and x3. Then the results for each G and H function are obtained as follows:

That was the F function, which is used in both the initialization and generation, explained bellow.

Initialization

The initialization is used to generate an internal state W, used later in the generation. This internal state is initially filled by concatenating the key(K) and the initialization vector(IV). Then this is divided into eight 128-bit words (W0-W7). Then a 64-bit Memory component is defined.  The next thing is repeating for 16 rounds a series of operations involving W, so we can initialize the internal state, which is going to be used in the keystream generation.

The initialization algorithm as stated in the PDF is:

The input is the key and the initialization vector, and the output is  the eight 32-bit words that define the initialized internal state. Simply explained, the initialization algorithm involves:
  1. Concatenate K + (K xor IV) + ¬(K + IV) + IV which will be a 1024-bit word, and separate it into eight 128-bit words W0 - W7.
  2. Initialize the memory variable M = 0x0000447261676F6E (64-bit).

    Repeat 16 times
  3.  Calculate (W0 xor W6 xor W7) and divide it into four 32-bit words a, b, c, d.
  4. Divide M into two 32-bit words e, f.
  5. Calculate a', b', c', d', e', f' using the F function defined previously.
  6. Join a', b', c', d' and calculate xor with W4, this will be the new W0.
  7. Calculate the new Wi = Wi - 1, looping from i = 7 to 1.
  8. Join e' and f', this will be the new M.
Keystream Generation:


The keystream generation involves generating a keystream using the previously initialized internal state, and the last value of M as input. The internal state is now divided into thirty-two 32-bit words (B0-B31). During each round of the keystream generation, B0, B9, B16, B19, B30, B31 are used as the F function inputs a, b, c, d, e, f. 

Each round of the keystream generation the output is a 64-bit length keystream k, and an updated state B and M, which can be used again to generate more and more keystreams.
The process is described as follows:

The key generation algorithm simply explained:
  1. Split M into two 32-bit words ML (left part) and MR(right part).
  2. Obtain the six 32-bit words, making:
    a = B0, b = B9, c = B16, d = B19, e = B30 xor ML, f = B31 xor MR
  3. Calculate a', b', c', d', e', f' using the F function defined previously.
  4. Make the new B0 and B1 equal to b' and c' respectively.
  5. Calculate the new B's with Bi = Bi-2  looping from i = 32 to i = 2.
  6. Update M = M + 1.
  7. Get the 64-bit keystream joining a' and e'.
  8. Repeat using the last B's and M values.
Example

For an example of this cipher I created python script that used the test data provided in the PDF(256-bit key and IV). The script reads from the sbox1.dat and sbox2.dat files the S1 and S2 sboxes used in the f function, and generates one round of a keystream with the said test data. I use a lot of string operations to convert stuff into binary strings and manipulate them easier (even though it is also possible to do it with decimals). The Python code:





Output(Generating 100 rounds):



Note: There was no information available that I could found about how the keystream is used to encrypt a plaintext, so I didn't create an example for that.

Attacks-Vulnerabilities:

Time-Memory Trade-off Attack

Time-Memory tradeoff attacks  rely on pre-computation to reduce the effort required for a key recovery attack on a keystream. The attack comprises two steps.
  • The first, the preprocessing step, sees the attacker calculating a table of keys or internal states and corresponding keystream prefixes. The table is ordered upon the prefix. 
  • The second step involves observing keystreams and attempting to match each against a prefix in the table. If the match is successful, then with some likelihood the internal state is known by reading the opposing entry in the table
Guess and determine

To calculate keystream words from two rounds of Dragon, the attacker is required to guess more than 256 bits of the internal state. This is worse than exhaustive key search, and makes guess and determine attacks on Dragon unfeasible.

Distinguishing Attacks

If the output sequence of a stream cipher can be statistically distinguished from a random sequence, then the cipher is not strong enough for cryptographic applications. Dragon is designed with a large state and complex initialization and update function. It has no linear masking, and therefore immune to this type of distinguishing attacks

References:

lunes, 22 de octubre de 2012

Tarea 8: Sistemas Concurrentes

Red de Petri

Una red de Petri es un grafo con pesos bipartito usado como representación en la computación concurrente, particularmente los aspectos que involucran programación multi hilos. 

En las redes de petri existen dos sets de nodos, los llamados Places que normalmente se representan como círculos u ovalos, y las Transitions, dibujadas como rectángulos delgados. Debido a que es bipartito, hay aristas desde los Places a Transitions, y vice-versa, pero nunca a uno de igual tipo.

Sistema a modelar: SMART TV

Un sistema algo común para cualquiera. Podemos decir que es concurrente por el simple hecho de que reproduce sonido y audio a la vez, y las televisiones más nuevas hasta tienen internet inalámbrico por lo cual son tres actividades simultaneas(ignorando procesos internos).

El sistema entonces se modelara basandonos en el hecho de que se esté viendo una película por internet en una Smart TV.



Los places en este caso pueden ser: 

P = {Inicio, Internet, Video, Audio, Película}

Entonces el proceso puede ser descrito como sigue:
  • Primero se inicializa todo, ignorando el proceso de encendido y selección de película que son simples transiciones.
  • Para que se pueda reproducir la película primero se descarga parte por parte, y se hace un streaming.
  • Mientras se hace lo anterior se procesa video y audio de dicho streaming para que la televisión pueda reproducirlo.
  • Hecho lo anterior se reproduce la película.
Ésto se puede representar mediante el siguiente diagrama:


Donde:
  • P0: Inicializar
  • P1: Video
  • P2: Audio
  • P3: Internet
  • P5: Datos Descargados
  • P4: Película


Python-Snakes

Utilizando el módulo Python-Snakes para crear la red de petri, nos puede quedar de la siguiente manera:



Código:







Referencias:

miércoles, 17 de octubre de 2012

5th Assignment: Mesh Block Cipher

For this assignment I chose the Mesh Block Cipher to do some research. Because there are several variants are available (MESH-64, MESH-96, MESH-128, I'm going to focus on the MESH-64 variant.

The MESH block cipher

MESH is a block cipher designed in 2002 by Jorge Nakahara, Jr., Vincent Rijmen, Bart Preneel, and Joos Vandewalle. MESH is based directly on IDEA and uses the same basic operations.
The MESH block ciphers designs are based on the same group operations as the IDEA cipher, but with a number of novel features:
  • Flexible block sizes in steps of 32 bits (the block size of IDEA is fixed at 64 bits)
  • Larger MA-boxes
  • Distinct key-mixing layers for odd and even rounds
  • New key schedule algorithms that achieve fast avalanche and avoid the weak keys of IDEA.
The software performance of MESH ciphers are estimated to be better or comparable to that of triple-DES.

Main parameters



Mesh-64 Block Cipher


MESH-64 is a 64-bit block cipher with a 128-bit key and 8.5 rounds. The last 0.5 round is the output transformation. The key schedule for MESH-64 is:


  • First, 16-bit constants ci are defined as: c0 = 1, and ci = 3 · ci−1 , i ≥ 1 with multiplication in GF(2)[x]/p(x), under the primitive polynomial p(x) = x^16 + x^5 + x^3 + x^2 + 1. The constant ‘3’ is represented by the polynomial x + 1 in GF(2).
  • The 128-bit user key is partitioned into eight 16-bit words Ki , 0 ≤ i ≤ 7,  and assigned to Zj+1 = Kj ⊕ cj , 0 ≤ j ≤ 6, and Z1 = K7 ⊕ c7 .
  • Finally, each subsequent 16-bit subkey is defined as follows:


for 8 ≤ i ≤ 59; ‘<<< 7' is left rotation by 7 bits; h(i) = i div 7 + 1, and l(i) = i mod 7 + 1.

Operations used:
  • Bit-wise exclusive or ⊕
  • Addition in Z216 
  • Multiplications in GF(216 + 1)
Attacks

A number of attacks, such as truncated and impossible differentials, linear and Demirci’s attack, shows that more resources are required on the MESH ciphers than for IDEA, and indicates that both ciphers seem to have a large margin of security.

Main known attacks:
  • Truncated  Differential Attack
  • Linear Attack
  • Impossible Differential Attack
  • Demirci's Attack
  • Biryukov-Demirci Attack
Performance

References:
  • The MESH Block Ciphers - Jorge Nakahara Jr , Vincent Rijmen , Bart Preneel, Joos Vandewalle
  • The Biryukov-Demirci Attack on IDEA and MESH Ciphers

martes, 16 de octubre de 2012

Tarea 4: Curva de Respuesta

Para obtener la salida del sistema se usa la función lsim, describida a continuación.



Function File: y= lsim (sys, u, t)

Parámetros
  • sys: Sistema invariante en el tiempo (LTI).
  • u: Vector de señal de entrada. Debe ser del mismo largo de filas que el vector de tiempos y el mismo largo que entradas de columnas.
  • t: Vector de tiempos espaciado uniformemente.

Salida
y: Vector de respuesta de salida. Tiene tantas filas como el largo de t y tantas columnas como salidas.

Proceso:

Creamos un vector con los digitos del numerador, y un vector con los digitos del denominador y creamos un sistema con ellos.
 

Después creamos un vector de tiempos uniformes(0.1 de espacio) y obtenemos el vector entrada de aceleración unitaria en base a éste:


Ahora podemos utilizar la función lsim para obtener la salida del sistema, dando como parametros el sistema, el vector de tiempos y vector de entrada.


Después graficamos los resultados:


Resultado:


lunes, 15 de octubre de 2012

Tarea 7: Aplicación de la Lógica Predicativa

La aplicación de la lógica predicativa que utilizaré de ejemplo será la Prueba de Teoremas.

"Un teorema es una afirmación que puede ser demostrada dentro de un sistema formal."

Para probar teoremas podemos expresar el teorema en lógica de primer orden, es decir pasando los términos a predicados.

Buscando información por Internet encontré un applet MUY interesante que sirve para probar teoremas, expresándolos en un lenguaje especial muy similar a la programación.

Ejemplo 1:

Si queremos probar el teorema: "Emmanuel es mortal", solo sabiendo que los humanos son mortales, y que Emmanuel es un humano, podemos hacer lo siguiente:

Axiomas
  1. Los humanos son mortales.
  2. Emmanuel es un humano.
Teorema
  • Emmanuel es mortal.
Lógica Predicativa


ExpresiónSímbología
X es humanoHumano(X)
X es mortalMortal(X)

  1. x( Humano(x) → Mortal(x))
  (Para todo x, Sí x es humano entonces x es mortal)


  2. Humano(Emmanuel)
  (Emmanuel es humano)

Ahora con lo anterior, reemplazando x por Emmanuel en la primera, podemos concluir:

  Humano(Emmanuel) → Mortal(Emmanuel)
  (Si Emmanuel es Humano, Emmanuel es Mortal)

Como ya habíamos definido anteriormente que Emmanuel es humano, entonces la expresión se hace verdadera y se comprueba que Emmanuel es Mortal.

Utilizando la applet produce el siguiente resultado:




Ejemplo 2:

Si deseáramos probar que los monos son seres vivos, solo sabiendo son mamíferos, y que los mamíferos son seres vivos, podríamos hacer algo así:

Axiomas:

  1. Los monos son mamíferos.
  2. Los mamíferos son Seres Vivos.

Teorema

Los monos son Mamíferos

Lógica de Predicados

ExpresiónSímbología
X es mamíferoMamifero(X)
X es ser vivoSerVivo(X)



  1. Mamifero(Monos)
  (Los monos son mamiferos)

  2. x( Mamifero(x) → SerVivo(x))
  (Para todo x, Sí x es un mamífero x es un ser vivo )

Con lo anterior, podemos concluir:

 Mamífero(Monos)  → SerVivo(Monos)
 (Sí los monos son mamíferos, los monos son seres vivos)

Y como ya habíamos concluido que los monos son mamíferos, se comprueba que los monos son seres vivos.

Aquí una captura de como lo resuelve el applet:





Referencias:

http://www.foundalis.com/mat/atp/Prover.html
http://en.wikipedia.org/wiki/First-order_logic

martes, 9 de octubre de 2012

Reporte 2: Diagrama de Bloques

Debido a que previamente había definido las funciones de entrada y salida como ecuaciones lineales, tuve que cambiarlas por ecuaciones diferenciales en función del tiempo.

Para esto entonces, tomamos en cuenta que la entrada es una temperatura en el sistema(que se convertirá en un voltaje análogo, pero en sí la entrada es la temperatura) y la salida es una velocidad en el ventilador, que será manipulada por un microcontrolador dependiendo de la temperatura de entrada.

Función de entrada:
    • T0(t) es la temperatura actual del cuerpo(sensor).
    • Tenv es una constante de la temperatura ambiente (20).
    • k es una constante de proporcionalidad.
Obteniendo la transformada de Laplace:

Pero como esta temperatura se transforma en voltaje mediante el sensor, podemos usar la fórmula del sensor

Cambiando T a términos de T(s), entonces podemos obtener que el voltaje será:
Después será amplificado por un amplificador, pero esto es solo multiplicar el voltaje.

Función de salida:

Para la salida, tenemos un sistema mecánico que es la velocidad del ventilador. Esta podemos calcularla como Revoluciones por Minuto(RPM), utilizando la velocidad angular:
Función de Transferencia:


Diagrama de Bloques:

Para representar el sistema en un diagrama de bloques se tomarán en cuenta las siguientes propiedades:

Propiedades de los diagramas de bloques:

Paso 1:

Paso 2:
Paso 3:
Paso 4:
Referencias:

lunes, 8 de octubre de 2012

Reporte de Medio Curso - Reconocimiento de Placas

Mis aportaciones individuales hacia el proyecto del equipo fueron en las siguientes áreas:
Pre-Procesamiento de Imágenes y Datos de Entrenamiento

Investigando encontré un par de PDFs muy interesantes sobre proyectos similares al nuestro, reconocimiento de placas. Uno de ellos se enfocaba primordialmente al pre-procesamiento de las imágenes, es decir, prepararlas para poder obtener datos que la neurona puede usar tanto como para su entrenamiento, como para su uso.

Éste pre-procesamiento involucrá operaciones como las que se mencionan en el PDF de la clase, que son:
  • Reducción de colores.
  • Filtrado para reducir ruido.
  • Reducción de resolución.
  • Representación binaria.
Todo lo anterior se hace con el objetivo de poder tener nuestra región de interes(ROI) de la forma más clara posible, debido a que una imágen con múltiples colores y que en algunos casos tiene ruido, dificulta la detección de los carácteres.

Entonces una imágen podemos ir modificandola de la siguiente manera:

El código de esta parte:




Datos de entrenamiento

Ahora, para crear el primer archivo necesario para el entrenamiento, seleccionamos dentro de la imágen un rectángulo donde se encuentra la placa. Las 4 coordenadas de las 4 esquinas del rectangulo se escribirán en un archivo, junto al id de la imágen. Entonces si la imagen anterior fuese "2.jpg", su correspondiente línea en el archivo sería algo así:
2 243 285 317 311
  • r1 Valor del píxel en la imagen de la coordenada y de la esquina superior izquierda del ROI
  • r2 Valor del píxel en la imagen de la coordenada y de la esquina inferior derecha del ROI
  • c1 Valor del píxel en la imagen de la coordenada x de la esquina superior izquierda del ROI
  • c2 Valor del píxel en la imagen de la coordenada x de la esquina inferior derecha del ROI
Esto es una parte de los datos de entrenamiento. La otra parte corresponde a crear un clasificador, que nos diga si en un área determinada de la imágen se encuentra nuesta región de interés o no. Para esto creamos una región de barrido de imágen (RBI) que debe tener un tamaño predefinido. En nuestra imágen anterior, hacemos un barrido a toda la imágen, dejandola de la siguiente manera:


A cada región de esta "tabla" se le debe etiquetar con un valor, dicho valor se obtendrá basandonos en lo siguiente:
  • Si el RBI no intersecciona absolutamente en ningún punto con el ROI de la matrícula calculado anteriormente, el RBI quedará etiquetado a ”-1”, indicando esto que es una muestra no válida en la que no se encuentra la matrícula.
Por el contrario si el RBI intersecciona con el ROI, tenemos dos posibles opciones:
  • Si el RBI intersecciona con el ROI como mucho en un valor ”min_disc”, que es el discriminante mínimo, el cual, por defecto, está establecido a un valor del 10 %, éste vector  quedará etiquetado a ”-1”, indicando que no es una muestra válida. No tenemos suficiente información con tan sólo un 10% de los píxeles que interseccionan para saber si es una zona de la posible placa o no
  • El otro caso es que el RBI interseccione en al menos un valor ”max_disc”, que es el discriminante máximo, el cual, por defecto, está establecido a un valor del 60 %, este vector de propiedades quedará etiquetado a ”1”, indicando que puede ser un posible candidato a una zona de la placa de la matrícula.
Los demás RBI que quedan entre ”min_disc” y ”max_disc” quedarían sin etiquetar, debido a que no tenemos suficiente información para saber si es o no un posible candidato a placa de matrícula en la imagen, pudiendo crear incongruencias en el clasificador y empeorar los resultados.

Pintando estas etiquetas de diferente color, podemos ver que efectivamente se marcaron dependiendo del discriminante:



Código de la Red Neuronal

Cada uno de nosotros teniamos nuestro código de la neurona con lo que avanzamos en las clases. El mío consistia en identificar entre 3 clases en las que podría caer un valor. Entonces teníamos por ejemplo, 2 valores A = 2  y  B = 7, podemos clasificar un valor x en cualquiera de 3 clases, 00 si el valor es menor a A (por lo tanto menor a B también), 01 si es mayor a A pero menor a B, y 11 si es mayor a B (igualmente mayor a A). 

A partir de estas clasificaciones, podemos generar muestras de entrenamiento, incluyendo lo siguiente:

x  clasificacion   ej.   4.03123128  01

Usando las muestras, cada neurona en base a unos pesos iniciales aleatorios irá calculando su bit que formara la clasificación. Si una neurona se esquivoca, se utiliza la función de aprendizaje definida en el curso para ajustar los pesos y minimizar el error. Graficando los resultados, se produce algo así:


Donde se puede ver la separación entre las 3 clases(00, 01, 11)

Ahora, la función de la red neuronal dentro del proyecto es diferente, primero tenemos que detectar la placa en la imagen, y después reconocer los caracteres individualmente.

  • Neurona para la Detección de la placa. Esta neurona debe identificar de entre 2 clases, que serían las del primer paso del entrenamiento, -1 si la placa no esta en un determinado pixel, 1 si lo esta. Por lo tanto esto es posible hacerlo con una sola neurona.
  • Neurona para el Reconocimiento de Caracteres. Esta es un tanto diferente, debido a la existencia de caracteres alfanuméricos en este caso necesitaremos una red más amplia para poder clasificar individualmente cada letra y número.
Referencias: