jueves, 20 de septiembre de 2012

[CRIPTOGRAFÍA] RSA-Based Digital Signatures

Para esta semana hicimos un servicio web de autenticación de usuarios, la cual guarda las claves públicas.

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.


Por chat envia 229 y el otro usuario comprueba en la página:


La respuesta es:


En caso de una respuesta por parte de "Victor" que no sea 229:


1 comentario: