Para esto se hicieron 3 códigos, 2 en python con la ayuda de la librería CGI (Interfaz de entrada común) de python y un ultimo código en HTML simple que le envía los datos al script que autentifica el usuario. Todo esto corriendo en el servidor local.
La página es así:
Y el código es un simple HTML:
<form method = "get" action="http://localhost/cgi-bin/main.py"> <table border=0> <tr> <td><font face="arial">Challenge</font></td> <td> <input type=text name="x"> </td> </tr> <tr> <td><font face="arial">Usuario</font></td> <td> <input type=text name="user"> </td> </tr> <tr> <td><font face="arial">Respuesta</font></td> <td> <input type=text name="r"> </td> </tr> <tr> <td></td> <td colspan=2> <input type="submit" value="Enviar"> </td> </tr> <tr> <td></td> <td colspan=2> <font face="arial"><a href="http://localhost/respuesta.py" target="_blank">Descargar Script</a></font> </td> </tr> </table> </form>
Al colocar los datos redirecciona a el script que autentifica al usuario, el código es así:
#!/usr/bin/python import cgi def f(x): return x*2 def fastmodexp(x, y, mod): p = 1 aux = x while y > 0: if y % 2 == 1: p = (p * aux) % mod aux = (aux * aux) % mod y = y >> 1 return p def public_key(user): keys = open("usuarios", "r") for line in keys: usuario, e, n = line.split(" ") if usuario == user: return int(e), int(n) print "Content-type: text/html" print print "<html><head><title>Respuesta</title></head><body>" form = cgi.FieldStorage() x = int(form.getvalue("x")) user = form.getvalue("user") r = int(form.getvalue("r")) e, n = public_key(user) y = fastmodexp(r, e, n) z = f(x) if y == z: print "Si es "+ user else: print "No es "+ user print "</body></html>"
El programa anterior lo que hace es recibir los datos del html, despues comprueba que el usuario que hace referencia tiene su clave correcto, esto lo hace con un "y" que es "fastmodexp" que en si es [(r ^ e) mod n] para calcular f(x) con los datos del usuario al que se hace referencia y se usa "z" para calcular directamente f(x).
Al final se hace una comparacion, si ambas "y" y "z" son iguales se trata de el usuario correcto.
El usuario que esta en duda descarga el siguiente script:
#!/usr/bin/python def f(x): return x*2 def fastmodexp(x, y, mod): p = 1 aux = x while y > 0: if y % 2 == 1: p = (p * aux) % mod aux = (aux * aux) % mod y = y >> 1 return p def main(): x = int(raw_input("x:")) d = int(raw_input("d:")) n = int(raw_input("n:")) y = f(x) res = fastmodexp(y, d, n) print "Respuesta = %s"%res main()
El script genera una respuesta para "x" utilizando fastmodexp que es [(y ^ d) mod n] la cual el usuario entrega en el chat para quien quiere autentificar que realmente es el.
Ahora se muestra un ejemplo para una "x" = 79, quiero saber que el usuario Victor cuya clave públca es (e = 2903, n = 5917) y su clave privada es (d= 1127, n= 5917).
"Victor" descarga el script y lo ejecuta, como el es el único que sabe su clave privada estara seguro de su respuesta.
La respuesta es:
En caso de una respuesta por parte de "Victor" que no sea 229:
Bien; 10 pts.
ResponderBorrar