Max Hernandez

Laberinto - Ejemplo de Canvas en HTML5

jueves, 20 de septiembre de 2012

Word game extra points

This are the words:
  1. Insecure
  2. Key management
  3. Security
  4. Operator
  5. Computational
  6. Prime factor
  7. Recover
  8. Accomodate
  9. Cancellation
  10. Transposition
  11. Chiper
  12. break
  13. Splitting
  14. Eavesdropping
  15. Structure
  16. Xor
  17. Prime
  18. Identity
  19. Generator
  20. Alphabet
  21. One way function
  22. Login
  23. Subgroup

RSA-based digital signatures


The homework for this week is implementing a RS-Authentication using a web service and this is what i did.

My implementation 

This class allows user to connect with a computer called server and receive a challenge value used to authenticate with this. Once the client send its challenge ciphered it is compared with the value calculated with the private keys saved in the server database.

Server.py
#! /usr/bin/python
# -*- coding: latin-1 -*-

from rsa import RSA
import cgi, cgitb
import random

def open_keys(nameFile, username):
    fl = open(nameFile, "r")
    for i in fl:
        i = i.split(",")
        if i[0].lower() == username.lower() :
            fl.close()
            return int(i[1]), int(i[2])
    fl.close()
    return False

def save_value(nameFile, value):
    fl = open(nameFile, "w")
    fl.write(str(value))
    fl.close()

def load_value(nameFile):
    fl = open(nameFile, "r")
    value = fl.read()
    fl.close()
    return int(value)

def standar_function(x):
    return 3*x+20;

def verify(user, y):
    original_value = load_value("value.dat")
    if original_value == y:
        return True
    else:
        return False

def main():
    entrada = cgi.FieldStorage()
    print "Content-type: text\n"
    if entrada.has_key("x") and entrada.has_key("user"):
        rsa = RSA()
        try:
            n, e = open_keys( "users.dat", str(entrada["user"].value) )
        except:
            print "False"
            return 
        y = rsa.descifrar(n, e, int(entrada["x"].value))
        print str( verify(str(entrada["user"].value), y) )

    else:
        x = random.randint(1, 1000)
        save_value("value.dat", standar_function(x))
        print x

main()

This code is what connect with the server. I implemented this part in javascript language because is easy to share in the web and although is a Web-script the private keys do not get out of the computer in any time.

users.dat
Max, 233273, 73109
elisa, 124837172984042613022163, 124837172984042613022163

cliente.html
function standar(x){
    return (3*x)+20;
}

function pot_bin(x, n, mod){
    if(n == 1){
        return x;
    }else if( n%2 == 0){
        return Math.pow(pot_bin(x, n/2, mod), 2)%mod;
    }else{
        return (x*pot_bin(x, n-1, mod))%mod;
    }
}

function start(form){
  $.post( "http://localhost/cgi-bin/servidor_crip.py", {},
      function( data ) {
          y = standar(parseInt(data));
          n = parseInt( document.forms[form].elements["n"].value)
          d = parseInt( document.forms[form].elements["d"].value)
          user = String( document.forms[form].elements["user"].value)

          num = pot_bin(y, d, n).toPrecision(100);
          num = num.substring(0, num.indexOf("."));
          $.post( "http://localhost/cgi-bin/servidor_crip.py", {"x":num, "user":user},
              function( data ) {
                  if( data.indexOf("True") != -1 ){
                       document.getElementById("res").innerHTML=("

The user:'"+user+"' has been authenticated.

"); }else if( data.indexOf("False") != -1 ){ document.getElementById("res").innerHTML=("

The user:'"+user+"' has not been authenticated.

"); }else{ document.getElementById("res").innerHTML=("

Error with the server.

"); } } ); } ); }

Changes made in old RSA code:

    def exp_bin(self, x, n, module):
        if n == 1:
            return x
        elif n%2 == 0:
            return ((self.exp_bin(x, n/2))**2)%module
        else:
            return (x*self.exp_bin(x, n-1))%module


Service running

This is the interface of the client running:

 This is a case when the user and the private keys are not in the database or are wrong.



In this case the keys and user are correct and the user is Authenticated.


References:
http://elisa.dyndns-web.com/~elisa/teaching/comp/sec/hash.pdf

lunes, 17 de septiembre de 2012

Sexta tarea

Como tarea para esta semana nos encargamos de contestar uno de los ejercicios que se encuentran en el siguiente articulo: http://www.logicinaction.org/docs/ch4.pdf

El ejercicio que escogí yo es el siguiente:

Assume the domain of discourse is human beings.
(1) Every boy loves Mary.
(2) Not all girls love themselves.
(3) No boy or girl loves Peter.
(4) Peter loves some girl that loves John.
Exercise 4.12 For each sentence from the previous exercise, draw a picture that makes it true.

Resolviendo el ejercicio
Asumiendo que nuestro universo o dominio son los seres humanos, para cada enunciado de los mostrados en la parte superior, realizar un dibujo que hace el enunciado verdadero.
 Para resolver el ejercicio, dibujare la respuesta como un diagrama de Venn

1.- Todos los hombres aman a Mary.
Ax = Seres humanos que son hombres
Bx = seres humanos que aman a mary


∀x( Ax → Bx)

En este diagrama:
  • El color blanco representa todos los seres humanos.
  • El color naranja representa los seres humanos que Aman a Mary.
  • El color Azul representa los seres humanos que son hombres.
  • El color morado representa a los seres humanos que son hombres y que ademas aman a Mary.
  • La flecha apunta al lugar donde la sentencia es correcta.


jueves, 13 de septiembre de 2012

Algoritmo RSA

Buen día.
Esta semana nos toco hablar sobre el algoritmo RSA para encriptar calves públicamente y usarlo para autentificar usuarios en un servidor.
Para esto la tarea fue fabricar una autentificaciónn con cliente servidor Utilizando dicho algoritmo para cifrar los datos sensibles del usuario que en mi caso sera la contraseña.

Mi implementación

La idea del algoritmo es que un sujeto quiere recibir información cifrada de otro para esto el primer sujeto crea una clave publica y una privada. La publica la envia al segundo sujeto para que cifre la información a enviar. De esta forma solo el primero debería poder descifrar la información.

El primer archivo es el siguiente, donde se llevan a cabo los cálculos pertinentes de RSA. Primero se calculé las claves de la siguiente manera:

  1.  Elegí dos números primos "p" y "q"
  2. El número a usar como modulo "n" lo calcule multiplicando "p*q"
  3. Calcule Fi de Euler con multiplicando = (p-1)*(q-1)
  4. Después generando números aleatorios y la función de Euclides calculé un coprimo de el valor calculado en el paso 3, a este valor es "e".
  5. Por ultimo con la función de Euclides extendida calculé el multiplicador modular inverso de "e" el cual es el valor "d".

Con estos es posible encriptar información elevando el mensaje a cifrar a la "e" y aplicando el modulo "m", después para descifrarlo el mensaje cifrado se eleva a la "d" y se aplica modulo "m".

RSA.py
#! /usr/bin/python

import random

class RSA:

    def fi_euclides(self, q, p):
        return ((q-1)*(p-1))

    def euclides(self, a, b):
        while( b != 0):
            a, b = b, a%b
        return a

    def euclides_extendido(self, a, b):
        if b == 0:
            return (a, 1, 0)
        else:
            (d, s, t) = self.euclides_extendido(b, a%b)
            return (d, t, s-(a/b)*t)


    def obtener_coprimo(self, a):
        temp = random.randint(0, a)
        while( self.euclides(a, temp) != 1):
            temp = random.randint(0, a)
        return temp

    def generar_llaves(self, q, p):
        self.p = p
        self.q = q
        self.n = p*q
        fi = self.fi_euclides(p, q)
        b = -1
        while( b <= 0):
            self.e = self.obtener_coprimo(fi)
            (a, b, c) = self.euclides_extendido(self.e, fi)
        self.d = b
        return self.n, self.e, self.d

    def exp_bin(self, x, n):
        if n == 1:
            return x
        elif n%2 == 0:
            return (self.exp_bin(x, n/2))**2
        else:
            return (x*self.exp_bin(x, n-1))

    def cifrar(self, n, e, m): 
        return ( self.exp_bin(m, e)%n )

    def descifrar(self, n,d, c):
        return ( self.exp_bin(c, d)%n )

Una vez implementado el algoritmo, lo implemente para autentificar usuarios usando sockets en python. El servidor lo que hace es esperar una conexión y una vez que alguien conecta con este, genera las claves y le envía las claves publicas, después espera al cliente para que envié su cuenta y su contraseña cifrada y las verifica con su base de datos si estos son correctos.

Servidor.py
import random
import socket
import sys
import time
from rsa import RSA

def verify(usr, passw):
    usr = str(usr)
    passw = str(passw)
    try:
        fl = open("acounts.dat", "r")
    except:
        print "Error verifying acount"
        
    for line in fl:
        line = (line.replace("\n", "")).split("->")
        if usr.lower() == line[0].lower() and passw == line[1]:
            fl.close()
            return True

    fl.close()
    return False

def main():

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    try:
        s.bind(("localhost", int(sys.argv[1]) ))
    except socket.error , msg:
        print str(msg[0]) + ': ' + msg[1]
        sys.exit()

    print "Waiting for a conection..."
    s.listen(10)
    conn, addr = s.accept()
    print "Conection reached..."

    rsa = RSA()
    print "Generating keys..."
    (n, e, d) = rsa.generar_llaves(479,  487)

    print "Sending keys..."
    try:
        time.sleep(1)
        conn.sendall(str(n))
        time.sleep(1)
        conn.sendall(str(e))
    except:
        exit(1)

    print "Waiting for aswer..."
    usuario = conn.recv(1024)
    ciphertext = int(conn.recv(1024))
    if verify(usuario, rsa.descifrar(n, d, ciphertext)):
        print "Authenticated Sesion."
        conn.sendall("Authenticated Sesion :)")
    else:
        print "Unauthenticated Sesion, closing conection..."
        conn.sendall("Unauthenticated Sesion :(")

    conn.close()
    s.close()

main()

El cliente conecta con el servidor para esperar las claves publicas de el. Cuando las recibe pide el nombre de usuario y la contraseña, encripta la contraseña y la envía junto con el nombre de usuario. Después espera para que el servidor verifique que son correctas.

Cliente.py
from rsa import RSA
import getpass
import socket
import sys
import time

def main():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    try:
        s.connect(("localhost", int(sys.argv[1]) ))
    except socket.error, msg:
        s.close()
        print "Error with conection"
        exit(1)
    print "Conection reached."

    rsa = RSA()
    print "Reciving keys..."
    try:
        n = int(s.recv(1024))
        e = int(s.recv(1024))
    except:
        exit(1)

    username = raw_input("Username:")
    password = raw_input("Password:")
#    password = getpass.getpass()

    time.sleep(1)
    print "Sending username..."
    s.sendall(username)
    chipertext = str(rsa.cifrar(n, e, int(password) ))
    time.sleep(1)
    print "Sending password..."
    s.sendall(chipertext)

    print s.recv(1024)

    s.close()


main()

Todas las cuentas usadas se guardan en un archivo el cuál tiene los siguientes datos:
Max->123456
Champy->18283
Cecy->101010



El autentificador corriendo

Se intentan dos conexiones la primera con la contraseña correcta y la segunda con la contraseña incorrecta. Como se puede observar en el primero realiza una conexión exitosa y en el segundo, esto no sucede:

Servidor corriendo:
kalavera@kalavera-AOD270:~/Dropbox/criptografia/rsa$ python servidor.py 4141
Waiting for a conection...
Conection reached...
Generating keys...
Sending keys...
Waiting for aswer...
Authenticated Sesion.
kalavera@kalavera-AOD270:~/Dropbox/criptografia/rsa$ python servidor.py 4141
Waiting for a conection...
Conection reached...
Generating keys...
Sending keys...
Waiting for aswer...
Unauthenticated Sesion, closing conection...
kalavera@kalavera-AOD270:~/Dropbox/criptografia/rsa$

Cliente corriendo:
kalavera@kalavera-AOD270:~/Dropbox/criptografia/rsa$ python cliente.py 4141
Conection reached.
Reciving keys...
Username:Max
Password:123456
Sending username...
Sending password...
Authenticated Sesion :)
kalavera@kalavera-AOD270:~/Dropbox/criptografia/rsa$ python cliente.py 4141
Conection reached.
Reciving keys...
Username:Max
Password:010101
Sending username...
Sending password...
Unauthenticated Sesion :(

Los inconvenientes de mi implementación es que aunque los numeros "e" y "d" para las claves son generados de forma aleatoría, los numeros p y q deberían ser generados aletoriamente de alguna lista de numeros primos fuertes.
Además las contraseñas solo aceptan numeros enteros menores a n, puesto que al intentar convertir cadenas de texto a números, obtuve números demasiado grandes y python no los soportaba.

Adios.

References:
http://www.binarytides.com/python-socket-programming-tutorial/
http://en.wikipedia.org/wiki/RSA_%28algorithm%29
http://es.wikipedia.org/wiki/Exponenciaci%C3%B3n_binaria
http://es.wikipedia.org/wiki/Algoritmo_de_Euclides
http://mundogeek.net/archivos/2008/04/12/sockets-en-python/

lunes, 10 de septiembre de 2012

Ejercicio Lógica Predicativa

Para esta semana en la clase de verificación a manera de ejercicio nos toco hacer escoger dos enunciados de el libro "Symbolic Logic" de Lewis Carroll y pasarlas a su forma predicativa. Como ejercicio yo seleccione el #23 de la página 102, el cuál es el siguiente:

"All clever people are popular;
All obliging people are popular."

Traducido al español:

"Toda la gente inteligente es popular;
Toda la gente servicial es popular."

Lo primero que haré sera descomponer estos enunciados usando notación de lógica formal.
Lo primero 
I(x) =  Ser gente inteligente
P(x) = Ser popular
S(x) = Ser gente servicial

La palabra "Toda" implica un cuantificador universal lo cual se representa con el siguiente símbolo " \forall " y la palabra "es" puede traducirse como una implicación, "Si es inteligente entonces es popular" que se representa con el signo "→".

Entonces las expresión quedaría de la siguiente manera:

"Toda la gente inteligente es popular." entonces aplica que para cada persona que tenga la cualidad de ser inteligente debe ser popular:
 \forall x(  I(x) → P(x) )

"Toda la gente servicial es popular." entonces aplica que para cada persona que tenga la cualidad de ser servicial debe ser inteligente.
 \forall x(  S(x) → P(x) )
Con esto podemos sacar conclusiones, pues si cada persona inteligente es popular y cada persona servicial  es popular, entonces una persona que es popular debería tener ambas características:
 \forall x(  P(x) → ( S(x)^I(x) ) )

Referencias:

miércoles, 5 de septiembre de 2012

Diffie–Hellman key exchange


Diffie–Hellman is a specific method of exchanging cryptographic keys.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.

My eavesdropping
My homework for this week is eavesdrop a key exchange between two friends and use the key exchange public information to brute-force their secret key. Because this is an example the brute-forcing has to be done with hand and pencil.

First i calculated all the possible "x", "y" lowercase that could use them to calculate their public parts of the key. Then, i calculated all the keys for every "x", "y" that give me a public part "X", "Y" of the key, seeking for a pair of values "x", "y"  that their keys have the same value. And in the case of that more than one pair have the same key-value then i just going to try all the keys of all pairs.



Now i know Key value is = 3, but is hard to know what was the original values of "x", "y"  so i decide to ask to my friends what of the possible values "x: 1, 6,11" , "y: 2, 7" was the original value.

The final values (asking to my friends) are:
Key = 3
y = 7
x = 6

Reference:
http://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange

lunes, 3 de septiembre de 2012

Problema Repaso (Laboratorio)

Para esta semana en el laboratorio de automatización a todos nos toco resolver un problema mayormente relacionados con transformadas de Laplace.

Mi problema

EL problema se trata de obtener una expresión numerador/ denominador donde tiene:
  • Ceros en s=-1, s = -2. 
  • Polos en s = 0, s = 4, s = -6
  • Ganancia k = 5 
 Esto hacerlo utilizando Matlab, pero como no tengo acceso a ese software yo utilizare Octave.

La respuesta la obtuve basandome en un código para MatLab que viene en el libro citado y el código es el siguiente:

function null =  lab2(null)
  z = [-1, -2];
  p = [0, 4, -6];
  k = 5;
  [num, den] = zp2tf(z,p,k);
  num
  den
endfunction


Donde la función zp2tf se encarga de generar la expresión utilizando los datos dados de parámetro la cuál obtuve de la siguiente página y es la siguiente:

http://users.powernet.co.uk/kienzle/octave/matcompat/scripts/FIXES/zp2tf.m
function [b, a] = zp2tf(z, p, g)
  if nargin != 3 || nargout != 2
    usage("[b, a] = zp2tf(z, p, g)");
  endif
  try cplxpair(z); catch error("zp2tf: could not pair complex zeros"); end
  try cplxpair(p); catch error("zp2tf: could not pair complex poles"); end
  b = g*real(poly(z));
  a = real(poly(p));
endfunction

El programa me arrojo como resultado lo siguiente:
octave:1> lab2.m
num =

    5   15   10

den =

    1    2  -24    0
Lo cual se interpreta como:



El problema fue sacado del libro:
Ogata, Katsuhiko. Modern Control Engineering / Katsuiko Ogata.
Tehran: A'eizh, 1381 = 2002.
964.: ill
Reprint of 4th ed. 2002, Prentice Hall, New Jersey.


Referencias:
http://users.powernet.co.uk/kienzle/octave/matcompat/scripts/FIXES/zp2tf.m

domingo, 2 de septiembre de 2012

Diagrama de decisión binario

¿Qué es?
Es una estructura de datos utilizada para representar una función booleana. Estos pueden ser considerados como una representación comprimida de conjuntos o relaciones, donde las operaciones se realizan directamente en los diagramas, sin necesidad de descomprimirlos.

Mi Proposición

Para esta tarea nuestro trabajo fue construir una expresión booleana con al menos tres variables y cuatro conectivos lógicos, para hacer su diagrama de decisión binario y después minimizar el mismo. La expresión que escogí fue la siguiente:
(A→B)^(A+¬B+¬C)
Para construir el BDD(Binary desition Diagram) me base en el PDF de la liga de referencias, donde se muestran el método en unos pasos simples de comprender.
Para realizar el dibujo utilice OpenOffice y el método fue el siguiente:
  • (0) Primero construí una tabla de verdad con la expresión elegida que me sirvió como base para construir el BDD inicial.
  • (1) Después se remueven terminales duplicadas.
  • (2) Después se unen los nodos duplicados.
  • (3) Se remueven los nodos redundantes.
Mi tabla de verdad
^ = conjuncion
+ = disyuncion
→ = condicional
¬ = negacion


(A→B)^(A+¬B+¬C)

ABC F
-----
000 1
001 1
010 1
011 0
100 0
101 0
110 1
111 1