- Insecure
- Key management
- Security
- Operator
- Computational
- Prime factor
- Recover
- Accomodate
- Cancellation
- Transposition
- Chiper
- break
- Splitting
- Eavesdropping
- Structure
- Xor
- Prime
- Identity
- Generator
- Alphabet
- One way function
- Login
- Subgroup
Blog dedicado a documentar mi aprendizaje durante el transcurso de mi estudio de licenciatura.
Max Hernandez
Laberinto - Ejemplo de Canvas en HTML5
jueves, 20 de septiembre de 2012
Word game extra points
This are the words:
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
En este diagrama:
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:
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
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
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
Todas las cuentas usadas se guardan en un archivo el cuál tiene los siguientes datos:
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:
Cliente corriendo:
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/
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:
- Elegí dos números primos "p" y "q"
- El número a usar como modulo "n" lo calcule multiplicando "p*q"
- Calcule Fi de Euler con multiplicando = (p-1)*(q-1)
- 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".
- 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 "
" 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:
"Toda la gente servicial es popular." entonces aplica que para cada persona que tenga la cualidad de ser servicial debe ser inteligente.
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:
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:
La respuesta la obtuve basandome en un código para MatLab que viene en el libro citado y el código es el siguiente:
http://users.powernet.co.uk/kienzle/octave/matcompat/scripts/FIXES/zp2tf.m
El programa me arrojo como resultado lo siguiente:
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
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
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 endfunctionDonde 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 0Lo 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:
Para realizar el dibujo utilice OpenOffice y el método fue el siguiente:
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.
^ = 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
Suscribirse a:
Entradas (Atom)