Skip to content

Instantly share code, notes, and snippets.

@jcespinosa
Created August 23, 2012 05:05
Show Gist options
  • Save jcespinosa/3432680 to your computer and use it in GitHub Desktop.
Save jcespinosa/3432680 to your computer and use it in GitHub Desktop.
#!/usr/bin/python
#Juan Carlos Espinosa Ceniceros
#ITS-FIME-UANL
#Agosto 2012
#Seguridad y Criptografia
import random
import os
import sys
import shutil
longitudAlfabeto = 127
def generarClaves(cantidad, tamano, nombreArchivoClavesCifrar, nombreArchivoClavesDecifrar):
with open(nombreArchivoClavesCifrar, "w") as archivoClaves:
archivoClaves.write("".join([(".".join([str(random.randint(0, longitudAlfabeto - 1)) for b in range(tamano)])) + "\n" for a in range(cantidad)]))
shutil.copy("./"+nombreArchivoClavesCifrar, "./"+nombreArchivoClavesDecifrar)
return
def obtenerClave(nombreArchivo):
with open(nombreArchivo, "r") as archivo:
claves = archivo.readlines()
clave = claves[0].rstrip("\n\t").split(".")
return clave
def actualizarArchivoClaves(nombreArchivoClaves):
with open(nombreArchivoClaves, "r") as archivoClaves:
claves = archivoClaves.readlines()
with open(nombreArchivoClaves, "w") as archivoClaves:
archivoClaves.write("".join(claves[1:]))
return
def verificarMensajeClave(mensaje, clave):
if(len(mensaje) <= len(clave)):
return True
else:
print "[X] Error, el mensaje y la clave no coinciden [mensaje = %d, clave = %d]\n" %(len(mensaje), len(clave))
return False
def verificarClaveMensaje(clave, mensaje):
if(len(clave) != len(mensaje)):
print "[X] Error, el mensaje y la clave no coinciden [mensaje = %d, clave = %d]\n" %(len(mensaje), len(clave))
return False
else:
return True
def procesar(nombreArchivoEntrada, nombreArchivoSalida, nombreArchivoClaves, tipo):
global longitudAlfabeto
with open(nombreArchivoEntrada, "r") as archivoEntrada:
mensaje = list()
for linea in archivoEntrada.readlines():
mensaje = (mensaje + list(linea)) if(tipo == "-C") else (mensaje + linea.split("."))
clave = obtenerClave(nombreArchivoClaves)
seguir = (verificarMensajeClave(mensaje, clave)) if(tipo == "-C") else (verificarClaveMensaje(clave, mensaje))
if(seguir):
if(tipo == "-C"):
while(len(mensaje) < len(clave)):
mensaje.append(".")
mensajeSalida = list()
for a, caracter in enumerate(mensaje):
mensajeSalida.append(((int(clave[a]) + ord(caracter)) % longitudAlfabeto) if(tipo == "-C") else (chr((longitudAlfabeto + int(caracter) - int(clave[a])) % longitudAlfabeto)))
with open(nombreArchivoSalida, "w") as archivoSalida:
archivoSalida.write((".".join(str(c) for c in mensajeSalida)) if(tipo == "-C") else ("".join(str(c) for c in mensajeSalida)))
actualizarArchivoClaves(nombreArchivoClaves)
return
else:
return
def main():
tipo = ""
try:
tipo = sys.argv[1]
except:
print "[X] Error, se espera 1 argumento(s) (string)\n"
return
finally:
if(tipo == "-G"):
try:
nombreArchivoClavesCifrar = raw_input("Nombre archivo claves para cifrar << ")
nombreArchivoClavesDecifrar = raw_input("Nombre archivo claves para decifrar << ")
cantidadClaves = int(raw_input("Cantidad de claves << "))
largoClave = int(raw_input("Tamano de clave << "))
except:
print "[X] Error en la entrada de datos"
return
generarClaves(cantidadClaves, largoClave, nombreArchivoClavesCifrar, nombreArchivoClavesDecifrar)
elif(tipo == "-C"):
nombreArchivoCifrar = raw_input("Nombre archivo a cifrar << ")
nombreArchivoCifrado = raw_input("Nombre archivo de salida << ")
nombreArchivoClaves = raw_input("Nombre archivo de claves << ")
if(os.path.exists(nombreArchivoCifrar) and os.path.exists(nombreArchivoClaves)):
procesar(nombreArchivoCifrar, nombreArchivoCifrado, nombreArchivoClaves, tipo)
else:
print "[X] Error, el archivo no existe"
return
elif(tipo == "-D"):
nombreArchivoDecifrar = raw_input("Nombre archivo a decifrar << ")
nombreArchivoDecifrado = raw_input("Nombre archivo de salida << ")
nombreArchivoClaves = raw_input("Nombre archivo de claves << ")
if(os.path.exists(nombreArchivoDecifrar) and os.path.exists(nombreArchivoClaves)):
procesar(nombreArchivoDecifrar, nombreArchivoDecifrado, nombreArchivoClaves, tipo)
else:
print "[X] Error, el archivo no existe"
return
else:
print "[X] Error, parametros incorrectos"
return
if(__name__ == "__main__"):
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment