Materias

jueves, 13 de septiembre de 2012

Entrada # 5

Implementación de la Autentificación RSA

En este código se hicieron todos los cálculos para encontrar los valores de n, d y e y los guarda en un archivo junto con los nombres de usuario.

from random import randint
def main():
Usuario = ['Pedro', 'Ave']
U = open("Usuarios.puddi", 'w')
for i in range(0, len(Usuario)):
p = int(raw_input("Valor de p: "))
q = int(raw_input("Valor de q: "))
n = p * q
print p, q, n
fiden = int((p-1)*(q-1))
print "Valor de Fiden: "+str(fiden)
e = sacare(fiden)
print "Valor de e: "+str(e)
d = raw_input("Valor de d: ")
print "\n\n"
U.write(Usuario[i]+'\t'+str(e)+'\t'+str(d)+'\t'+str(n)+'\n')
def sacare(fi): #Para encontrar el valor de e
divisorfi = [] #Arreglo que guardara los divisores de fi
for i in range(1, fi+1): #Busca los divisores de fi
if fi % i == 0:
divisorfi.append(i)
while True:
divisordee = []
divisorescomun = []
posie = randint(1, fi-1)
#Encuentra los divisores de e y los agrega a un arreglo
for i in range(1, posie):
if posie % i == 0:
divisordee.append(i)
Compara los divisores de fi y e, y los que sean iguales los agrega a un arreglo nuevo
for i in divisorfi:
if (i in divisordee):
divisorescomun.append(i)
#Reviza el tamaño del arreglo si es igual 1 significa que ese valor es 1 por lo tanto fi y e son coprimos, si no se cumple solo repite el proceso
if len(divisorescomun) == 1:
break
return posie
main()
view raw Calculos.py hosted with ❤ by GitHub
Como logran ver los valores de d y de p y q fueron asignados por mí (Obviamente respetando las reglas).




El orden del texto es: Usuario, valor de e, valor de d y valor de n

Imágenes donde se determino el valor de d:





Después se muestra los códigos donde se hizo uso de los sockets

Cliente

import socket #Importar la libreria socket
def main():
s = socket.socket() #Variable del socket
s.connect(("localhost", 9999)) #Ip del Servidor a conectar
print "Solicitando Conexion -----------"
while True: #Ciclo infinito
print 'Recibiendo valor de X ...'
x = s.recv(1024) #Recibo el valor del servidor
print x
y = int(funcionx(x))
print y
(usuario, d, n) = lectura()
print usuario
r = sacarlar(y, usuario, d, n)
print r
print 'Enviando el nombre de usuario----'
s.send(usuario)
print '\nEnviando r----'
s.send(str(r))
s.send(str(n))
break
print "adios"
s.close()
def funcionx(x):
y = ((int(x))*5)+10
return y
def sacarlar(y, Usuario, d, n):
r = ((y**int(d)) % int(n))
return r
def lectura():
Usuarios = open("Usuarios.puddi", 'r')
j = ''
l = list()
print("Usuarios en el Archivo: \n\n")
for i in Usuarios.readlines():
print i
cual = raw_input("Usuario Elegido: ")
d = raw_input("d: ")
n = raw_input("n: ")
return cual, d, n
Usuarios.close()
main()
Servidor
import socket #Importando la libreria socket
from random import randint
def main():
s = socket.socket()
s.bind(("localhost", 9999)) #Ip del Servidor
s.listen(1) #El 1 significa que solo habra conexion con un solo cliente
sc, addr = s.accept() #Para aceptar los conexiones entrantes
print "Recibiendo intento de conexion de IP: "+str(addr)
while True:
x = randint(1, 20)
print "Enviando X: "+str(x)
sc.send(str(x))
usuario = sc.recv(1024)
r = sc.recv(1024)
n = sc.recv(1024)
print r
y = sacary(r)
scl.close()
s.close()
def sacary(r):
e = 107
print r
y = int(r)**e % int(n)
print y
return y
main()





Referencias:

http://mundogeek.net/archivos/2008/04/12/sockets-en-python/
http://es.wikipedia.org/wiki/N%C3%BAmero_primo
http://es.wikipedia.org/wiki/N%C3%BAmeros_primos_entre_s%C3%AD
http://www.slideshare.net/jpadillaa/criptografia-asimetrica-rsa

1 comentario:

  1. El uso de exponente explícito ** te cuesta un punto y la falta de ejemplos de ejecución te cuesta otro punto. Son 5 pts.

    ResponderEliminar