20 de septiembre de 2012

Public-key Repository

Seguridad de la Información y Criptografía
Homework 5

The homework for this week is:
Implement a HTTP public-key repository for key exchange that employs RSA-based digital signatures.

My program is running in the web hosting Heroku. I used this host because it's free and I can write code in python. You can see the page in the next url:


The web page must be displayed like the next image:


How this work?


  • Imagine that you are in a Facebook chat, and you are talking with Alice. Then Alice start talking with you but saying strange things, so you aren't sure if is the real Alice.
  • Now you want to verify if is Alice or not, so you send a challenge in the chat.
  • Previously Alice, created a private and a public key for the RSA algorithm, and she is registered in a web service where the public key is stored.
  • Then you enter to the web service, send the challenge showed to Alice.
  • Alice use the script provided in the same web service.
  • In the script she write the x (challenge), her d, and her n. The script returns a response.
  • Alice send the response of the script to you via Facebook chat.
  • You write the response in the web service and click in the verify button.
  • The web service show if is the correct Alice or not.

Code


This is the script where the other person download for get the response:


The python script in the server:


And the template that I created for the page:


Screenshots


When the client don't write the response and click verify.


When the client write a text instead of a number in the response field.


When the verification fails.


Test


I test my app with Juan Espinosa.


And I verify if was the real Juan Espinosa, and was correct.


References:
RSA Algorithm - Elisa Schaeffer

16 de septiembre de 2012

Escribir Fórmulas con Lógica Predicativa

Verificación y Validación de Software
Entrada 6

Para esta semana hemos seleccionado un ejercicio del Capítulo 4: "The World According to Predicate Logic" del libro llamado "Logic in Action". El enlace al PDF se encuentra al final de esta publicación.

El ejercicio que seleccione trata de escribir la fórmula lógica predicativa de unas oraciones, pero para poder entender que es lo que tenía que hacer, el mismo libro tiene algunos ejemplos, por lo que me gustaría empezar mostrandoles esas oraciones y su respectiva fórmula.

Los ejemplos van desde el uso simple de cuantificadores, hasta las que usan cuantificadores múltiples dentro de la fórmula. Para todos se asume que el dominio son los seres humanos o personas.

Tenemos que:
, todos, para todos.
, alguien, por lo menos uno, algunos, algunas.
Wx, significa que una persona "x" camina (Walk).
Bx, evalúa si "x" es un niño (Boy).
Gx, evalúa si "x" es una niña (Girl).
Sxy,significa que "x" ve a "y" (Sees).

Después de definir estas fórmulas podemos ver los ejemplos:
Alguien camina: ∃xWx
Algún niño camina: ∃x(Bx ^ Wx)
Una niña ve a John: ∃x(Gx ^ Sxj)
Todos los niños caminan: ∀x(Bx ⇒ Wx)
Alguien ve a todos: ∃x∀ySxy

Después de ver estos ejemplos logre aclarar mi mente y empece a contestar mi ejercicio que es el siguiente.

Ejercicio 4.13
Escribe las siguientes oraciones a fórmulas de lógica de predicados. Suponga que el dominio del discurso son los seres humanos.

Necesitamos una expresión que evalúe si alguien ama a alguien, entonces denotamos Lxy, para una "x" que ama a "y", donde L es abreviación de "Love". Además de B y G, que ya mencione anteriormente que evalúan si se es niño o niña.


1. Algún niño no ama a todas las niñas. (Some boy doesn’t love all girls)

∃x(Bx ^ ∀y(Gy ^ ¬Lxy))

Se evalúa si algún "x" es un niño, y si para toda "y" que resulte ser niña, "x" no ama a toda "y".


2. Todo niño que ama a una niña es también amado por alguna niña. (Every boy who loves a girl is also loved by some girl)

∀x((Bx ^ ∃y(Gy ^ Lxy)) ⇒ ∃z(Gz ^ Lzx))

La primer parte es parecida al anterior, pero ahora se habla de "todo niño" lo que nos hace cambiar el cuantificador, y quitamos la negación en L, porque ahora se dice que el niño ama a la niña. Para la segunda parte se dice que el niño "x" es amado también por una niña, y necesitamos una variable más, porque la niña "y" que el niño "x" ama, puede no ser la misma niña que ama a ese niño "x". Se agrega el signo condicional entre las dos partes, ya que la primer parte implica que la segunda también sea cierta.


3. Toda niña que ama todos los niños no ama a todas las niñas. (Every girl who loves all boys does not love every girl)

∀x((Gx ^ ∀y(By ⇒ Lxy)) ⇒ ∀z(Gz ^ ¬Lzx))

Aquí la primera parte de la oración implica a la segunda, y se traduce como, toda niña "x" que ama a niños "y", entonces niña "y" no ama a niñas "z". Otra forma de entender la oración después de haberla escrito en fórmula lógica, es que si una niña ama a los niños, se sabe que esa niña no ama a las niñas.


4. Ninguna niña quién no ama a un niño ama una niña que ama a un niño. (No girl who does not love a boy loves a girl who loves a boy)

∀x(((Gx ^ ∀w(Bw ^ ¬Lxw)) ^ ∀y(Gy ^ ∃z(Bz ^ Lyz))) ⇒ ¬Lxy)

Gx ^ ∀w(Bw ⇒ ¬Lxw): una niña "x" que no ama a todo niño "w".
Gy ^ ∃z(Bz ^ Lyz): una niña "y" que ama a un niño "z".
¬Lxy: si los dos anteriores se cumplen, entonces la niña "x" no ama a la niña "y", y es ahí donde se aplica la negación que refiere a "ninguna niña" (ninguna niña "x" ama a niña "y").


Páginas consultadas:
The World According to Predicate Logic

13 de septiembre de 2012

Public Key Algorithms - RSA

Seguridad de la Información y Criptografía
Homework 4

The homework for this week was:
"Implement RSA authentication in Python for a client-server system with sockets."

I will describe what the code should do:
  1. The server open a socket, and wait for a client.
  2. The client start a session with the server.
  3. The server send a random "x" to the client.
  4. The client calculate a f(x) where the function can be anyone.
  5. Get from a user file the (d, n) previously created.
  6. Calculate r = (y^d)mod(n), and send it to the server.
  7. Send to the server the name of the current user and the r.
  8. The server receive the the data, and open a file with a list of all the users.
  9. The server find the correct public key (e, n) from the current user.
  10. The server calculate y = (r^e)mod(n) and get the same "y" that the client calculate.
  11. Verify if the "y" received is equal to f(x) in the server. (This is for authenticate the user)
  12. If the previous sentence was true, send to the client a verification message. (I send "OK" and the client print "Welcome")
  13. If not, close the connection. (My code send form the server "NO" and when the client receive this print "Something was wrong")

Generator of public and private keys



Server



Client



Execution


First of all the folder with the three python files.


I send an argument to the "create keys" program for create 5 users. Create one file per each user with the private key, and all the public keys for all the users are in the file "users".


When we want to run the programs, we need to open two terminals, one for the server and one for the client.

The client receive an argument that indicate the user to use in this running.


The numbers indicate what part of the list was mentioned in the first part in this post. Some numbers aren't in the same sequence that the list and others are omitted becasue the program do it internal and don't have a debug print.

Server:
[1] Socket opened
Sesion started
[3] Sended to the client x = 43
User name:  user3
And received r = 209263
[9] Public key: (349, 225391)
User accepted
Sesion closed
Client:
[2] Connected with the server
Current user:  user3
[5] Private key: (68117, 225391)
The server send me x = 43
[4] After the function f(x) = 1892
[6] My f(x) encrypted, r = 209263
[12] Welcome
Sesion closed
This is the file of user that the server use to find if the current user is allowed or not.


And the keys for the user that I used in the example. Check that the "n" is the same in the use3 in the previous image.


For the function of euclides(), I saw the pseudo-code of the reference [1], and for the gcd() I saw the pseudo-code from the book "Matematica Discreta - Richard Johnsonbaugh".

References:
[1] - Fundamentos matemáticos del método RSA

11 de septiembre de 2012

Modelo Matemático

Automatización y Control de Sistemas Dinámicos
Reporte 1

Para el primer reporte de la materia tenemos que modelar lo que se controlará en nuestro proyecto de equipo y tenemos que calcular la función de transferencia para la planta.

El proyecto en el que trabajaré con mi equipo es de ajuste de volumen. La idea es de controlar el volumen de sonido en una bocina o altavoz, de acuerdo al ruido que se encuentra en el entorno. Esto es que si tenemos reproduciendo una canción en un cuarto, y en determinado momento entra gente a platicar, el volumen del dispositivo que esta emitiendo el sonido de la canción, aumente paulatinamente para que se siga escuchando con igual fuerza la canción.

Un ejemplo práctico de donde se usa este tipo de sistemas, es en los automóviles, donde el volumen de la música dentro del auto aumenta cuando el motor emite mucho ruido, en cambio cuando este esta detenido, el volumen baja, esto con el fin de reducir problemas de audición para el conductor. También Apple, ya tiene patentado algo así para uso en iPods y Macbooks.


Circuito propuesto


La idea que tenemos para nuestro proyecto es que utilizando micrófono y altavoces de la computadora, como en la imagen anterior, podamos modelar el sistema, o que mediante un dispositivo externo conectado al equipo de sonido, logremos modificar el nivel de volumen. Aquí tengo un circuito suponiendo que hacemos uso de un Arduino como el equipo ya lo había propuesto.


Función de entrada


Como tenemos pensado, el dispositivo que nos dará una entrada al sistema será nuestro micrófono, que podríamos cambiar por un sensor que perciba niveles auditivos en decibeles, pero con un micrófono podemos medir cantidad de ruido, además de que en cuanto electrónica, es más barato comprar un micrófono que el medidor de decibeles.

La función que define la entrada de nuestro micrófono como sigue.

$Blv=Ri+L\dfrac {di} {dt}$
Donde:
$R$es la resistencia
$i$es la corriente
$Blv$voltaje inducido
$L\dfrac {di} {dt}$voltaje
$v =$$\dfrac {dy} {dt}$

Función de salida


Y tenemos también la función de salida de nuestra planta, que en este caso pertenece a la función de un altavoz. Esta la obtuve de un PDF mencionado al final, y esta es la función base, ya que existen algunas derivadas de esta que son usadas para mejora de sonido y amplificación.

En la salida de nuestro sistema controlaremos el sonido o volumen de reproducción de alguna canción.

$Hs=\dfrac {\dfrac {s^{2}}{w^{2}}} {\dfrac {s^{2}}{w^{2}}+\dfrac {s}{wQ_{TSA}}+1}$
Donde:
$s$variable de frecuencia compleja
$w$frecuencia angular
$Q_{TSA}$factor de calidad total

Función de transferencia

Sabemos que seguramente cuando analicemos en equipo la estructura de bloques que tendrá nuestra planta para la implementación física, podríamos agregar bloques intermedios que reduzcan el cambio repentino de volumen, pero por el momento solo considere las obvias y necesarias.

Por definición tenemos que la función de transferencia esta dada por la transformada de la entrada entre la transformada de la salida, y otra expresión también utilizada es la división de X entre Y.

$Gs =\dfrac {L[entrada]}{L[salida]} =\dfrac {Y(s)}{X(s)} $

Y sustituyendo nuestras funciones de entrada y salida nos queda lo siguiente, donde L significa la transformada de Laplace de la función contenida.

$Gs =\dfrac {L\left(Ri+L\dfrac {di} {dt}\right)}{L\left(\dfrac {\dfrac {s^{2}}{w^{2}}} {\dfrac {s^{2}}{w^{2}}+\dfrac {s}{wQ_{TSA}}+1}\right)}$

Entre platicas con mi equipo hemos pensado acerca de los datos que nos estará arrojando el micrófono, creemos que las funciones que estarán en nuestro sistema serán puramente lineales, dependiendo de como tengamos que manipular los datos de entrada.

Referencias:
Sonido y Acústica - INACAP
Modelo de un Micrófono
Funciones de transferencia - ITESCAM
Función de transferencia del sistema altavoz-caja

9 de septiembre de 2012

Lógica Predicativa

Verificación y Validación de Software
Entrada 5

Para esta semana la tarea es del tema de lógica predictiva, y para esto tenemos un par de enunciados que debemos expresar mediante lógica de predicados y deducir una conlusión.

El ejercicio que yo seleccione es el número 91 de la página 106 del libro "Symbolic Logic" de Lewis Carroll. Al final se encuentra el enlace a la versión en línea del libro.

Los enunciados originales son los siguientes:

All clear explanations are satisfactory.
Some excuses are unsatisfactory.

Y al español las podemos traducir como:

Todas las explicaciones claras son satisfactorias.
Algunas excusas son insatisfactorias.

Las expresiones que usé son las siguientes.

C(x): clear explanations, explicaciones claras
S(x): satisfactory, satisfactorias
E(x): excuses, escusas

Para este caso podemos denotar a x como un comentario cualquiera, y que puede ser evaluado como una explicación o una escusa, o determinar si ese comentario es satisfactorio o no.

Los cuantores usados son los siguientes.

: Todos, para todos
: Por lo menos uno, algunos, algunas

Ahora vamos a escribir los enunciados con cuantores lógicos y usando las expresiones mencionadas.

  • Todas las explicaciones claras son satisfactorias.

  • ∀x C(x) ⇒ S(x)

  • Algunas excusas son insatisfactorias.

  • ∃x E(x) ⇒ ¬S(x)

    Ahora podemos usar equivalencias lógicas de los cuantores para poder llegar a la conclusión, e inclusive es fácil hacerlo con sentido común. Podemos entender del segundo enunciado que algunas escusas no son satisfactorias, pero es posible encontrar escusas que son satisfactorias.

    Sabemos del primer enunciado que toda explicación clara es satisfactoria, entonces como no todas las excusas son satisfactorias, sabemos que no todas las escusas son explicaciones claras.

    La conclusión es:

    Algunas excusas no son explicaciones claras.

    Lo mismo pero en inglés:

    Some excuses are not clear explanations.

    Y escrito con expresiones lógicas:

    ∴ ∃x E(x) ⇒ ¬C(x)

    Fuentes consultadas:
    Symbolic Logic By Lewis Carroll
    Lógica Predictiva - Elisa Schaeffer

    7 de septiembre de 2012

    Diagramas de Bloques

    Automatización y Control de Sistemas Dinámicos
    Laboratorio: Entrada 3

    Simplifique el diagrama de bloques que aparece en la imagen y obtenga la función de transferencia en lazo cerrado C(s)/R(s).

    El siguiente diagrama de bloques es el original del problema, y mediante reglas del álgebra de bloques iré simplificando paso por paso el diagrama completo hasta dejar un solo bloque con la función de transferencia completa.


    Teoría básica de Diagrama de Bloques


    Un sistema de control suele estar compuesto de varios componentes, y cada uno de estos componentes lleva acabo una función. Para representar un sistema de control usamos un diagrama de bloques.

    El diagrama de bloques es una representación gráfica donde podemos ver la relaciones que existen entre un componente y otro. Contiene información del comportamiento dinámico, pero no de la construcción física del sistema.

    En el diagrama de bloques tenemos los llamados bloques funcionales donde se coloca algún símbolo para representar alguna función matemática dentro del sistema.

    Tomando en cuenta el diagrama presentado al inicio podemos observar algunas funciones denominadas G y también algunas H, que suelen ser funciones de transferencia, para convertir la salida de datos, de alguna unidad a otra.

    Las flechas indican hacia donde va el flujo, y se les conoce como señales.

    Los círculos con signos positivos (+) y negativos (-), son puntos de suma y el lugar donde una línea se divide en más de una flecha se llama punto de ramificación.

    Un diagrama de bloques con varios lazos de retroalimentación se puede simplificar mediante un reordenamiento de los bloques mediante reglas del álgebra de diagramas de bloque.

    "Al simplificar un diagrama de bloques:
    1. El producto de las funciones de transferencia en la dirección de la trayectoria directa debe ser el mismo.
    2. El producto de las funciones de transferencia alrededor del lazo debe ser el mismo." [1]

    En cuanto a las reglas del álgebra de diagramas de bloque, les dejo un PDF donde están todas las reglas necesarias para simplificar un diagrama como el que les mostré al inicio.

    Tabla de Diagramas de Bloque

    Simplificación de Diagrama de Bloques


    Tenemos el diagrama de bloques como en la imagen al inicio de esta publicación. Es más fácil ir simplificando desde las partes más internas del diagrama.

    La parte que tenemos encerrada en un cuadro rojo no tendrá un cambio algebraico, solo será un movimiento hacia la derecha, cambiando de orden con su vecino próximo. Esto no afecta en absoluto al sistema, ya que en los dos puntos de suma tenemos entrada de datos con signo negativo, y si se hace primero uno u otro no importa siempre y cuando sea antes del bloque G2.

    La parte que si sufre un cambio es la encerrada en el círculo rojo. Ahí estamos cambiando la línea de entrada de H1, de antes de G2, a después de G2.


    Para este cambio podemos demostrar mediante álgebra que no se ha desestabilizado el sistema.


    Podemos ver que después del cambio, la salida de la flecha en ese punto será la misma que antes, solo que escrita de diferente forma.

    En la siguiente imagen podemos ver ya los cambios plasmados en el diagrama de bloques. Pero aún nos falta seguir simplificando.


    Ahora tenemos marcadas otras dos secciones de nuestro diagrama que vamos a simplificar, mediante las reglas proporcionadas en las tablas de las reglas para diagrama de bloques.

    El recuadro rojo, se hace una unión entre nuestra G2 y H2, mientras que en el recuadro naranja tenemos una reducción de elementos.


    Veamos como queda esta simplificación en la siguiente imagen. Y como podemos ver el diagrama poco a poco ha sido reducido.


    Si notaron en este caso, el punto de suma que se había encerrado en el recuadro rojo, lo que se tiene es un signo negativo, y al aplicarlo en el bloque pasan los elementos con signo positivo. Esto se explica a detalle en el libro, y pasa porque en realidad el denominador es 1-(la sumatoria de los elementos), donde los elementos tienen signo negativo porque así lo marca el punto de suma, entonces al multiplicar este signo negativo por los elementos también con signo negativo, todos pasan a ser positivos en la función del bloque.

    La siguiente parte más fácil de simplificar es la que tenemos en serie, y tenemos marcada en un rectángulo rojo en la siguiente imagen.


    Cuando se tienen elementos en serie, tal y como en nuestro caso, las reglas nos dicen que hay que hacer una multiplicación de los elementos.


    Este resultado lo colocamos en un bloque completo y el diagrama queda como se muestra a continuación.


    Ahora vamos a simplificar esta sección marcada en rojo. Tenemos una retroalimentación del bloque grande y que pasa por la función de transferencia H3.


    Para esto, según la reglas establecida, tenemos que dividir el bloque que tenemos de la simplificación anterior, entre 1 más la H3 que multiplica a ese mismo bloque. Veamos como se hace esta operación.


    Y después de aplicar este cambio nos queda el siguiente diagrama.


    La sección marcada con rojo, como en un caso anterior, se encuentra en serie, lo que implica una multiplicación de los dos bloques.


    Como el bloque de G1 no tiene denominador, solo se multiplica este término en el numerador del siguiente bloque, y nos debe de quedar como sigue.


    Y solo falta simplificar el último punto de suma, donde la misma salida retroalimenta de nuevo al sistema. Esta parte es simple, ya que las reglas de diagramas de bloque muestran que para esta última sección hacemos que el numerador del bloque, se sume al denominador.

    Después de esto nuestro diagrama de bloques queda simplificado de la siguiente manera.


    Y con esto podemos escribir nuestra función de transferencia en lazo cerrado que queda así:


    Fuente consultada:
    [1] - Ingeniería de Control Moderna, 3ra. edición, Katsuhiko Ogata, página 69.

    6 de septiembre de 2012

    Transformada de Laplace

    Automatización y Control de Sistemas Dinámicos
    Laboratorio: Entrada 2

    En esta semana tuvimos un repaso de las transformadas de Laplace, así que para la segunda publicación de laboratorio, seleccionamos un problema del libro de Control de Sistemas Dinámicos, evidentemente relacionado con las transformadas de Laplace, y la tarea es contestarlo mediante definición de la transformada.

    Como en mi problema tenía dos incisos, aproveche de hacer uno con la definición de la transformada de Laplace y el segundo un poco más directo mediante la ayuda de un formulario, y que aún así era necesario hacer algunos pasos extras por tratarse de un problema donde se tenía que utilizar la derivada de la función de F(s), para poder aplicarlo a la fórmula.

    Al final se encuentra el documento que realicé para esta publicación, ya que ahí se puede ver un poco más claro la explicación y la secuencia de pasos.

    Pero primero veamos como se define la transformada y después pasamos al problema resuelto.

    Definición de Transformada de Laplace


    "Sea f una función definida para t>= 0. Entonces la integral


    se llama Transformada de Laplace de f, siempre y cuando la integral converja. Cuando la integral definitoria converge, el resultado es una función de s. Esta transformada integral tiene una serie de propiedades que la hacen útil en el análisis de sistemas lineales. Una de las ventajas más significativas radica en que la integración y derivación se convierten en multiplicación y división. Esto transforma las ecuaciones diferenciales e integrales en ecuaciones polinómicas, mucho más fáciles de resolver. Otra aplicación importante en los sistemas lineales es el cálculo de la señal de salida. Ésta se puede calcular mediante la convolución de la respuesta impulsiva del sistema con la señal de entrada. La realización de este cálculo en el espacio de Laplace convierte la convolución en una multiplicación, habitualmente más sencilla." [1]

    Problema 1


    Obtenga la transformada de la siguiente función.


    Para empezar necesitamos pasar la función dada a una función más simple con la que podamos trabajar a lo largo del problema. Para esto tenemos una identidad trigonométrica que no ayudará a simplificar.


    Vemos que lo que queda del lado derecho es la estructura de la función que enuncia el problema dado, veamos como queda al sustituir la u por nuestro wt.


    Ahora podemos usar la parte izquierda de la función ya que es lo mismo que trabajar con la parte derecha, pero esta nos facilitará las cosas.

    Y ahora veamos la definición de la Transformada de Laplace, que ya había mencionado unos párrafos más arriba.


    Esta nos dice que la integral de cero a infinito del exponente e elevado a la -st y que multiplica a la función F(t), nos da como resultado la transformada de Laplace.


    En los pasos anteriores podemos notar como la función que tenemos como F(t) se sustituye en la definición de la transformada. Luego se saca el 1/2 fuera de la integral por ser términos constantes, y luego procedemos a obtener la integral.

    Para esto hacemos uso de la siguiente.


    Y que en términos de nuestra función nos queda lo siguiente.


    Ahora ya podemos sustituir los valores de b y 0.


    La primer parte se elimina totalmente con solo saber que e elevado al infinito nos resulta cero, y toda esa parte se cancela. Solo nos queda por simplificar la otra parte.


    Ya una vez simplificado todo lo posible podemos concluir con el siguiente resultado.


    Nota: En el documento anexado al final, podrán ver como se resolvió también mediante la fórmula propuesta en un formulario.

    Para corroborar el resultado obtenido, se probó con Wolfram Alpha. El resultado fue el mismo y además nos muestran una gráfica de la función resultante.


    Problema 2


    Ahora tenemos la siguiente función, y vamos a obtener su transformada de Laplace.


    Esta vez resolveremos de una forma más sencilla que es utilizando la siguiente definición que se acopla a la función con la que estamos trabajando.


    Así que para poder aplicarla primero tenemos que sacar la transformada de F(t) de la función principal, dejando fuera la t.


    Ya que tenemos F(s), lo que sigue es obtener su primer derivada.


    Comparar derivada con resultado de Wolfram.

    Y con la primer derivada ya podemos hacer uso de la definición que nos ayudará a llegar al resultado mucho más rápido. Así que sustituimos la primer derivada de F(s) y luego simplificamos.


    Y por último tenemos formalmente el resultado de la transformada de Laplace de la función dada al inicio del problema 2.


    Esta también se verificó desde Wolfram Alpha para corroborar que el resultado es correcto y se obtuvo de la misma página la gráfica de la función.

    Comparar transformada con Wolfram



    La entrada originalmente era solamente un documento que creé, pero luego pensé en ser un poco más especifico en unos pasos, por lo que el siguiente documento es la resolución de los problemas ya planteados, pero con explicación más simple y además esta disponible para descargar en PDF.

    Transformada De Laplace

    Páginas consultadas:
    [1] Definición de la Transformada de Laplace

    5 de septiembre de 2012

    Diffie-Hellman Key Exchange

    Seguridad de la Información y Criptografía
    Homework 3

    For this week, the homework is:
    Hack manually (pencil and paper) a very-short keyed Diffie-Hellman of your choice.

    Definition of Diffie–Hellman Key Exchange


    Diffie–Hellman key exchange is a specific method of exchanging cryptographic keys. It is one of the earliest practical examples of key exchange implemented within the field of cryptography. The Diffie–Hellman key exchange method allows two parties that have no prior knowledge of each other to jointly establish a shared secret key over an insecure communications channel. This key can then be used to encrypt subsequent communications using a symmetric key cipher. [1]

    In the next image we can see how is the channel of communication between Alice and Bob, and like our next example, if we are another person named Eve, we can get the g, p, A, B, and try to hack they key.

    [http://upload.wikimedia.org/wikipedia/commons/a/a3/Diffie-Hellman-Schl%C3%BCsselaustausch.png?uselang=es]

    My Hacking


    Like the example of the image, we have one of our classmates that represents "Alice" and other who is "Bob", I will be "Eve".

    Here is the screenshot from Facebook where my classmates published the p, g, X, Y, and I need to get the x and y, and then a key k.


    I did the hack manually in my notebook, here is a capture.


    If you check in the image, I started doing divisions only changing the dividend per a potency of 10 with n, where n start with one and increment in each division, when I finish the fourth division I noticed that in the dividend is only necessary to add a zero, so I did a big division, in the right of the paper I wrote a table, and in the first column I put the number of n, that represents x and y, and the second column is the result of (10^n)mod(19).

    When I tried the potency of 17 and 18, I found the same X and Y that my classmates wrote in the publication in Facebook, so I check if the two numbers, one for x, and the other for y, give me the same key k.

    I get x=17, y=18 and k=1.

    Then I posted the x, y and the k, in a comment in the same post, and my classmates, verify if I was correct, and yes, I was correct.

    After that, I did a program that do the same thing that I did manually, isn't a method that found the key when someone use this protocol, is only a sequential program that increment x and y, and verify if are the correct values for get the correct key.

    Here is the code:


    An example of the execution in the terminal, with the same p, g, X, Y, of the example that I did manually.


    I get the same x, y, and the k, that I found doing it manually, so it seems to work well.

    References:
    [1] - Diffie-Hellman Protocol