miércoles, 31 de octubre de 2012

[AUTOMATIZACIÓN] Función Nyquist

Para esta semana de laboratorio se pide un problema del libro de control, yo escogí el problema 8.8, consiste en buscar las coordenadas polares de una funcion de transferencia de lazo abierto.

La función es:

Para las condiciones:

Para esto se dibujará un diagrama de Nyquist. El Diagrama de Nyquist es básicamente un gráfico de G(j*w) donde G(s) es la función de transferencia a lazo abierto y w es un vector de frecuencias que encierra todo el semiplano derecho. Las frecuencias positivas y negativas (desde cero a infinito) se tienen en cuenta para dibujar el Diagrama de Nyquist.

Para la primera condición utilizé los siguientes valores:

s = tf("s")

T = 0.4

Ta = 1.2

Tb = 0.5

K = 0.1
Para esta condición se graficó lo siguiente:

Para la segunda condición se usan los siguientes datos:

s = tf("s")

T = 2

Ta = 0.5

Tb = 1

K = 1

Y se obtiene la siguiente gráfica:


[CRIPTOGRAFÍA] Imágenes








martes, 30 de octubre de 2012

[AUTOMATIZACIÓN] Pruebas de estabilidad

Para esta semana se encargo hacer pruebas a la función de transferencia de nuestro sistema.

La función utilizada para estas pruebas fue:

El código para las pruebas es:


function pruebas( num, den )

sys = tf( num, den )

t = 0:10:1000

u = []

for i = 1:length(t)
u = [u,rand]
endfor

figure(1)
rlocus(sys)
figure(2)
nyquist(sys)
figure(3)
impulse(sys)
figure(4)
step(sys)
figure(5)
lsim(sys,u,t)

endfunction

Para la prueba de raices:


Para la prueba de muestreo de Nyquist:


Para el impulso:

Calcula la evolución sistema ante un impulso en la entrada Si no se solicitan los parámetros de salida, se hace la representación de las salidas frente al tiempo.


Para el escalon:

Calcula la evolución de las distintas del sistema ante un escalón en la entrada.


Para lsim:

Cada una de la filas del vector u representa el valor de cada una de las entradas al sistema en los instantes indicados por t (por lo que la longitud de t ha de ser igual al número de columnas de u). lsim calcula la evolución de las salidas y estados del sistema sys ante dichas entradas.


jueves, 25 de octubre de 2012

[CRIPTOGRAFÍA] Stream Cipher - HC-128/HC-256


Cifrado de flujo

Esta semana investigamos sobre cifras de flujo. A diferencia de el cifrado por bloques que utiliza bloques de información de tamaño constante, el cifrado de flujo utiliza un generador de flujo de clave para operar con cada bit o cada caracter del texto plano.

Generalmente el generador es un algoritmo que recibe una entrada aleatoria (una clave) y a partir de esta genera una salida datos continua pseudoaleatoria.

Para generar esta salida, se aplica un algoritmo hash a la contraseña de longitud variable y se obtiene una contraseña de longitud fija.

Se puede utilizar una contraseña tan larga como la cantidad de datos que se cifran, lo cual es una de las fortalezas de los sistemas de cifrado.
HC-256

Escogí un algoritmo llamado HC-256. HC-256 es un cifrado de flujo diseñado para proporcionar cifrado masivo de software a gran velocidad mientras que permite una gran confianza en su seguridad. Su variante HC-128 fue presentado como un candidato eSTREAM y fue uno de los 4 finalistas en el perfil de software.

HC-128 y HC-256 son algoritmos adecuados para microprocesadores superescalares modernos y futuros. Sus pasos se pueden calcular en paralelo tanto de entrada como salida.

La velocidad de codificación de HC-128 llega a 3,05 ciclos / byte en un procesador Intel Pentium
M mientras que HC-256 llega a los 4.2 ciclos / byte en un procesador Intel Pentium 4.

Algoritmo

El proceso de cifrado para HC-256 consiste en lo siguiente:
  • Inicialmente se necesita una clave (K) de 256 bits y un vector de inicialización (IV) de 256 bits.
  • Internamente, consiste en dos tablas secretas (P y Q), cada una contiene 1024 palabras de 32 bits.
  • EL flujo de clave (s) es generado del mismo algoritmo. La salida de 32 bits del paso i es denotada como si. Así que s = s0 || s1 || s2...
Hay 6 funciones en el algoritmo. Para g1(x) y h1(x) la tabla Q es usada como S-box y para g2(x) y h2(x) la tabla P es al S-box.
donde x = x3 || x2 || x1 || x0, x es una palabra de 32 bits, x0, x1, x2 y x3 son 4 bytes, x3 y x0 son los bytes mas y menos significativos respectivamente.

El código en python de estas formulas es como sigue:
Con respecto al proceso de inicialización, serán 4096 pasos antes de generar alguna salida, se expande K y IV dentro de un vector W, esto para actualizar las S-box P y Q.



El código en python para esta parte: En la ultima parte generaremos el flujo de clave s y se generará por cada paso una salida de 32 bits. También se actualiza cada tabla P o Q dependiendo de los datos que se operan. El código de esta parte es: Y de esta manera con la salida s generamos el flujo de clave que al final solo se aplicara XOR a el mensaje. La cantidad de pasos en el código es fija, pero lo recomendable es que sea indeterminada o bien de largo del mensaje.

El código completo es:

La captura de pantalla mostrando el resultado de s:

Seguridad

El cifrado es seguro y casi impenetrable, se han probado con ataques algebraicos sin resultados positivos para el atacante. La salida de el cifrado es proveniente de una función no lineal por lo que recuperar la contraseña es casi imposible.

Sin embargo al conocer parte del texto plano surge el problema, ya que en base a otros ataques de diccionario en combinacion con álgebra se puede recuperar parte de la clave y el vector de inicialización.

Lo que hace seguro el sistema es el uso de claves aleatorias de largo igual que el mensaje y de cifrados múltiples, pero eso es aplicando en todos los algoritmos en general. Lo que le da la seguridad extra es el uso de las tablas S-box P y Q que reciben cambios casi en cada paso, lo que la vuelve difícil de decifrar sin la clave.

Fuentes:

Wikipedia
Link 1
Link 2
PDF oficial
PDF de HC-128

martes, 23 de octubre de 2012

[VERIFICACIÓN Y VALIDACIÓN] Redes de Petri

Para esta semana se nos encargó modelar un sistema concurrente, en este caso una red de petri. Segun Wikipedia: "Una Red de Petri es una representación matemática o gráfica de un sistema a eventos discretos en el cual se puede describir la topología de un sistema distribuido, paralelo o concurrente."

En mi caso modelaré el funcionamiento básico de un cajero automático. Para ello tengo que definir los estádos de la máquina y las transiciones entre estados.

Para poder definir los estados y transiciones definire en palabras simples como actua la máquina:

  • El cajero se encuentra en espera de que se introduzca una tarjeta.
  • Una vez introducida se procede a pedir el NIP.
  • Si el NIP es incorrecto se le vuelve a pedir, de ser correcto entonces continua.
  • La siguiente es la pantalla de transacciones donde se elige el tipo de transacción (efectivo, cheques, etc).
  • Se procede a la selección de cantidad para la transacción.
  • Se realiza la transaccion en la que se entrega el efectivo, el tiquet, etc.
  • Se pregunta al usuario si desea realizar otra transacción, de ser así se regresa a la pantalla de selección de tipo de transacción, de no ser así se regresa al estado de espera.
Código utilizado usando la libreria de python snakes: Una imagen de como queda finalmente:

Referencias:

jueves, 18 de octubre de 2012

[AUTOMATIZACIÓN] Root locus

Para esta semana de laboratorio se encargó realizar una de las actividades del libro, yo escogí la actividad B.6.9 la cual dice así:

Dibuje los lugares de las raíces para el sistema de control en lazo cerrado con:

         
Localice los polos en lazo cerrado sobre los lugares de las raices de modo que los polos dominantes en lazo cerrdo tengan un factor de amortiguamiento igual a 0.5. Determine el valor correspondiente de la ganancia K.


Los polos dominantes (rojo) son:

s = 0
s = +/- 2.6 aprox

La ganancia K es:

K = 1

Los ceros (verde) estan en:

s = -9

[CRIPTOGRAFÍA] Block Cipher - FROG

Cifrado por bloques

Esta semana se encargó investigar sobre alguna unidad de cifrado por bloques, una unidad de cifrado de clave simétrica que opera en grupos de bits de longitud fija, llamados bloques, aplicándoles una transformación invariante.

Cuando realiza cifrado, una unidad de cifrado por bloques toma un bloque de texto plano como entrada y produce un bloque de igual tamaño de texto cifrado.

La transformación exacta es controlada utilizando una segunda entrada — la clave secreta. El descifrado es similar: se ingresan bloques de texto cifrado y se producen bloques de texto plano.






FROG

Para mi ejemplo, encontré un algoritmo llamado FROG. FROG es un algoritmo de cifrado por bloques realizado por Georgoudis, Leroux y Chaves. Puede trabajar con bloques de tamaño entre 8 y 128 bytes, con tamaños de clave comprendidos entre los 5 y los 125 bytes. El algoritmo consiste en 8 rondas y tiene un desarrollo de la clave muy complicado.

Se envió en 1998 a la competición AES como candidato para convertirse en el Advanced Encryption Standard. En 1999, David Wagner y otros encontraron un número de claves débiles para FROG, que afectaba aproximadamente a una cada mil millones. Otros problemas eran un inicio de la clave muy lento y una velocidad de cifrado relativamente lenta. FROG no llegó a ser elegido finalista.

Algoritmo


Frog opera de la siguiente manera:

Primero que nada se necesitan de ciertas cosas antes de empezar:

  • Clave de 16 bytes.
  • Una S-box invertible de 8 entradas, 8 salidas dependiente de la clave.
  • Una secuencia de 0 a 15 ordenada en forma aleatoria.
Esto teniendo en cuenta que necesitamos los bloques aleatorios y nuestro texto plano.

Cada ronda consiste en 16 pasos; uno para cada byte del bloque, en cada paso se realiza lo siguiente:
  1. Se aplica un XOR al byte seleccionado del texto con el de la clave.
  2. Se reemplaza el resultado por el sustituto en la S-box.
  3. Se hace XOR con el byte del bloque correspondiente y se toma el resultado.
  4. Se toma un número de la secuencia que corresponde a la posición de un byte del bloque y se hace XOR con ese byte.
  5. Se repiten los pasos.
Ejemplo

Haré un ejemplo sencillo con un "hola mundo". Trataré de cifrar el texto y de decifrarlo utilizando un bloque. Primero que nada se transforma la cadena en binario para hacer las operaciones. y se agregarán ceros para completar los 16 bytes, quedando de la siguiente manera:

"h" - 01101000 
"o" - 01101111 
"l" - 01101100 
"a" - 01100001 
" " - 00100000 
"m" - 01101101 
"u" - 01110101 
"n" - 01101110 
"d" - 01100100 
"o" - 01101111 
"0" - 00110000 
"0" - 00110000 
"0" - 00110000 
"0" - 00110000 
"0" - 00110000 
"0" - 00110000

Se genera una clave de 16 bytes aleatoria formateada en binario:

01100011 00110011 00110000 00101010 10101111 11011100 01100101 11111001
01100110 01010110 11111100 10000011 10001000 11111111 10000100 10101000

Se genera una secuencia de números del 0 al 15:

10   8   9   2  12   5   4  11   6   1  14  15  13   7   3   0

Se toma la posición 0 y se procede:

01101000
01100011
________
00001011

La S-box:



El valor del S-box de 0000 - 1011 es: 01011000 y se reemplaza por 00001011 y viceversa para generar los bloques de decifrado.

El bloque 1 es :

11110011 11110111 01101101 10000111 01011010 00100011 00101110 01011010
11101000 11111111 10111101 11110000 01011101 01001100 11010011 10010100

Se toma el primer valo:

11110011
01011000
________
10101011

Se toma el segundo valor según la secuencia:

11111111
10101011
________
01010100

Se guarda el valor como cifrado.

Los primeros números resultantes con este procedimiento son:

01010100
01000110
10000100
10110011
...

Para obtener el Texto plano se hace el mismo procedimiento pero desde atrás hacia adelante.

Ventajas y desventajas

Como se había mencionado antes, FROG era uno de los algoritmos que participó en la competencia para ser el próximo AES pero no fue seleccionado para las finales.

Tambien se mencionó que el algoritmo tiene debilidades frente a ciertas claves afectando una en mil millones. Sin embargo la debilidad que tiene es fácil de resolver aplicando en sus últimas 4 rondas el modo de descifrado.

FROG no es rápido al ejecutar, debido a que genera las claves de una manera lenta, sin embargo es rápido encriptando y desencriptando. Por lo que se si generan las claves anteriormente no debería ser un problema.

lunes, 15 de octubre de 2012

[VERIFICACIÓN Y VALIDACIÓN] Aplicaciones de la Lógica Predicativa


Un pequeño resumen de lo que trata la lógica predicativa:

La lógica predicativa está basada en la idea de las sentencias realmente expresan relaciones entre objetos, así como también cualidades y atributos de tales objetos. Los objetos pueden ser personas, objetos físicos, o conceptos. Tales cualidades, relaciones o atributos, se denominan predicados. Los objetos se conocen como argumentos o términos del predicado. 

Al igual que las proposiciones, los predicados tienen un valor de veracidad, pero a diferencia de las preposiciones, su valor de veracidad, depende de sus términos. Es decir, un predicado puede ser verdadero para un conjunto de términos, pero falso para otro.

Con esto queda claro el fin de esta, y de esta manera paso a explicar el tema que elegí (me eligieron) para esta tarea: Detección de fallos en automóviles.

ECU

La mayoría de los automóviles en la actualidad tienen un dispositivo que se encarga de checar el buen funcionamiento del vehículo, conocido como "la computadora" que en realidad no es más que un circuito llamado ECU (Engine Control Unit) que controlan generalmente 4 cosas:
  • Control de inyección de combustible.
  • Control de tiempo de inyección.
  • Control de la distribución de válvulas.
  • Control de arranque.
Otros dispositivos y sensores conectados al ECU informan sobre otros posibles problemas que pueda haber en el vehículo.

Cuando hay un fallo mecánico, este es informado a la ECU y típicamente prende el "check engine" que indica que algo está mal. El fallo es guardado en la memoria del ECU para un futuro uso.

Muchos mecánicos ofrecen un servicio de diagnóstico por computadora para una mejor revisada, es más efectivo que sacar el motor del vehículo. El software para el chequeo utiliza un mecanismo similar a la lógica predicativa, comparando los valores dados por el ECU con los que vienen de fábrica.



Un ejemplo es cuando las revoluciones por segundo del motor no son las óptimas, ECU se encarga de comparar las revoluciones por segundo que deben existir dentro de un rango, dependiendo de la velocidad a la que se encuentre el vehículo. Si el vehículo muestra un desempeño más bajo al del rango normal, la luz del "check engine" se encenderá.

Otro ejemplo es el bombeo de gasolina, ECU cuenta con un sensor que le permite verificar la cantidad necesaria de aire que se hace pasar por el motor en base a la aceleración del vehículo y de esa manera permitir una mayor o menor cantidad de gasolina. Cuando hay un problema en el bombeo de gasolina, ECU regula la cantidad de aire y gasolina para evitar el calentamiento del motor y evitar fallos severos.

En vehiculos deportivos como los de F1 es crucial este dispositivo, ya que podrian salvar la vida del piloto en casos como algun pistón en mal funcionamiento o mala inyección, cosas que pueden sobrecalentar el motor. En estos vehiculos los ECU detectan fallos en tiempo real, aunque en la actualidad ya muchos lo hacen, lo que significa que si chocan con algun competidor, ECU detecta el problema para que el los ingenieros puedan reparar si es posible el daño en el Pit stop, o bien apaga el vehículo para evitar una posible catastrofe.

martes, 9 de octubre de 2012

[AUTOMATIZACIÓN] Diagrama de Bloques

Para esta semana se encargó hacer el diagrama de bloques de la funcion de transferencia.

Modifique la salida de mi funcion en la entrada anterior. De esta manera estoy utilizando la ley de einfriamiento de Newton para mi entrada, para mi salida utilizaré la formula de velocidad angular.

Recordando un poco, la formula de la ley de enfriamiento de Newton es así:

Y de esta manera queda despues de aplicarle transformadas de laplace:

La formula de velocidad angular describe la velocidad de rotación de el ventilador. Para esta función queda de la siguente manera:

Y quedando la función de transferencia así:
 Ahora creare el diagrama de bloques de la función:

[REDES NEURONALES] Reporte individual

El proyecto:

Consiste en simplemente reconocer una placa en una imagen o video para despues reconocer los caracteres que contiene y así poder ser usada esta información para servicios vehiculares o hacer tramites.

Estos servicios se han dado a conocer en muchos paises donde se utilizan en cosas como estacionamientos que toman una imagen de la placa en la entrada y en la salida lo vuleven a hacer y hacen una resta para obtener el tiempo y de esa manera cobrar lo equivalente.

Reconocimiento de caracteres (OCR)

El reconocimiento óptico de caracteres es el tipo de algoritmo buscado para hacer este proyecto, en este caso se utiliza una red para detectarlos, estos una vez localizada la placa.

Existen varias formas para detectar caracteres u otros objetos dentro de una imagen, ya sea seccionando la imagen, o bien utilizando técnicas como detección de bordes o esquinas.

Harris & Stephens corner detection algorythm:



Es un algoritmo que trata de encontrar las esquinas en una image basado en el diferencial de puntos encontrados por el algoritmo de Moravec, uno de los primeros pero no bien implementados.

En este caso, utilizaré una libreria para procesamiento de imagenes para python que contiene tál algoritmo.


Scikits-image


Es una libreria de python que se utiliza para detectar en una imagen varias "features" o caracteristicas, como deteccion de esquinas, deteccion de bordes, tabien se utiliza para aplicar filtros y crear segmentaciones.


Utilizé el siguiente código proporcionado y modificado para funcionar con una imagen que se utiliza en pruebas:



import numpy as np
from matplotlib import pyplot as plt

from skimage import data, img_as_float
from skimage.feature import harris


def plot_harris_points(image, filtered_coords):
    plt.imshow(image)
    y, x = np.transpose(filtered_coords)
    plt.plot(x, y, 'b.')
    plt.axis('off')

# resultados
plt.figure(figsize=(8, 3))
image = img_as_float(data.load("c.jpeg"))

filtered_coords = harris(image, min_distance=4)

plt.axes([0.2, 0, 0.77, 1])
plot_harris_points(image, filtered_coords)

plt.show()

El código es muy sencillo pero solo es una pequeña parte de lo que puede hacer, la entrada y salida son las siguientes:

--->


Liga Githube

Liga Wikipedia

Liga muy interesante.