Created
July 4, 2013 14:00
-
-
Save ErikRamses/5928028 to your computer and use it in GitHub Desktop.
rsa cgi python
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
#!/usr/bin/python2.7 | |
# enable debugging | |
#El programa es producto de varias recopilaciones de rsa y ejemplos de cgi | |
#URLS: http://blog.hackxcrack.es/2011/11/introduccion-la-criptografia-moderna_09.html | |
#http://code.activestate.com/recipes/572196-rsa/ | |
#http://cic.puj.edu.co/wiki/doku.php?id=materias:laboratorio_de_lenguajes_ii:lableng2:ejemplos1 | |
from rsa_math import * #importamos algunas funciones para el algoritmo rsa como la generacion de primos | |
import cgi, cgitb #importamos las librerias para cgi | |
import random #importamos random | |
def generarclaves(bitn): #genera las claves dependiendo el numero de bits | |
p = genprime(bitn) | |
q = genprime(bitn) | |
n = p * q | |
phi = (p - 1) * (q - 1) | |
e=65537 | |
while (phi%e) == 0: | |
e=genprime(17) | |
d = inverse_mod(e, phi) | |
public = (n, e) | |
private = (n, d) | |
return public, private | |
# Convierte un string en un numero | |
def integear(s): | |
n = 0 | |
for c in s: | |
n <<= 8 | |
n += ord(c) | |
return n | |
def cifrar(s, public): | |
n = integear(s) | |
c = modex(n, public[1], public[0]) | |
return c | |
# Convierte un numero en un string | |
def stringear(n): | |
s = [] | |
while n > 0: | |
s.insert(0, chr(n & 255)) | |
n >>= 8 | |
return ''.join(s) | |
#descifra el mensaje con la llave privada | |
def descifrar(n, private): | |
p = modex(n, private[1], private[0]) | |
s = stringear(p) | |
return s | |
try: | |
import hashlib | |
except: | |
print >> sys.stderr, "No se ha encontrado el modulo Hashlib, no podras firmar ni comprobar firmas" | |
#funciones que realizan los signos del cifrado | |
def signo(msg,private): | |
s = int(hashlib.sha1(msg).hexdigest(), 16) | |
return modex(s,private[1],private[0]) | |
def checksigno(msg,sign,pub): | |
s = modex(sign,pub[1],pub[0]) | |
h = int(hashlib.sha1(msg).hexdigest(), 16) | |
return s == h | |
#algoritmo rsa | |
def guardarvalor(archivo, valor): #funcion que guarda un valor en un archivo | |
f1 = open(archivo, "w") #funcion que abre el archivo con permisos de escritura | |
f1.write(str(valor)) #se escribe el archivo como string | |
f1.close() #se cierra el archivo | |
def Abrirllaves(archivo, usuario): #funcion para leer llaves o claves | |
f1 = open(archivo, "r") #Se abre el archivo de solo lectura | |
for element in f1: | |
element = i.split(",") #se separa por comas entre cada valor en i | |
if element[0].lower() == usuario.lower() : #el usuario se pasa a minusculas | |
fl.close() #cerramos archivo | |
return int(element[1]), int(element[2]) #se devuelve el modulo y la llave privada | |
fl.close() | |
return False | |
def cambio(x): | |
return x*3+20; #Se ajusta un cambio en el valor de x. | |
def verificar(usuario, y): #funcion que checa los datos ingresados | |
valororiginal = cargarvalores("valores.dat") | |
if valororiginal == y: #los compara con los valores originales | |
return True #si se cumple retorna verdadero | |
else: | |
return False #si no, retorna falso | |
def cargarvalores(archivo): #Funcion utilizada para guardar valores en un archivo | |
f1 = open(archivo, "r") #abrimos el archivo con sólo lectura | |
valor = f1.read() #se obtiene todo el contenido del archivo | |
f1.close() #cerramos | |
return int(valor) #devuelve el valor entero del archivo | |
def probarRSA(bitn,s): | |
pub,priv=generarclaves(bitn) | |
c=cifrar(s,pub) | |
descifrar(c,priv) | |
f=signo(s,priv) | |
print "Comprobando firma...",checarsigno(s,f,pub) | |
def main(): | |
entrada = cgi.FieldStorage() #hacemos uso del cgi para interactuar con el formulario | |
if entrada.has_key("x") and entrada.has_key("usuario"): #Se verifica que se hayan llenado los campos de texto | |
lonx=int(entrada["x"].value) | |
probarRSA(lonx,str(entrada["usuario"].value)) | |
else: #si no se encuentran entradas | |
x = random.randint(1, 1000) #se generan aleatoriamente | |
guardarvalor("valores.dat", cambio(x)) #se guardan en el archivo valores y se hace un cambio en x para poder usarlo en el algoritmo | |
print x #imprimimos x | |
main() |
Hola Gabriel, este código es muy viejo, tiene 7 años aprox, sería necesario actualizarlo según la versión de python con la que se corra.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
lo corro en py pero me da mucho errores