Implementación de la Autentificación RSA
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() |
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
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