Skip to content

Instantly share code, notes, and snippets.

@soul0592
Last active July 10, 2017 05:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save soul0592/5874858 to your computer and use it in GitHub Desktop.
Save soul0592/5874858 to your computer and use it in GitHub Desktop.
El método de cifrado One-Time Pad
#Programa de encriptacion y desencriptacion
#Alma Dalia Del Angel Castillo
#1442392
#Al ejecutar el programa en terminar agregar los parametros del
# largo de las claves y cantidad de claves separados por un espacio
from sys import argv
from random import randint
#Constantes
ALFABETO = 'abcdefghijklmnopqrstuvwxyz-,. ' #Alfabeto de 29 caracteres
LARGO = int(argv[1]) #Longitud de las claves
RENGLON = int(argv[2]) #Cantidad de claves
#Funcion que genera numeros aleatorios enteros y los almacena en 2 archivos identicos
def generar_Claves():
a = open('key1.dat','w')
b = open('key2.dat','w')
for i in range(RENGLON):
for l in range(LARGO):
random = str(randint(0,9))
a.write(random+' ')
b.write(random+' ')
a.write('\n')
b.write('\n')
a.close()
b.close()
#Funcion que elimina la primera clave de un archivo
def borrar_Clave(archivo):
a = open(archivo,'r')
clave = ''
borrar = a.readline() #Se guarda la linea primera linea del archivo para borrala
for l in a.readlines(): #Se leen todas las lineas del archivo con ayuda de un for
if borrar == a.readline():
continue #Se ignora la linea que se desea borrar
else:
clave += l #Se almacenan el resto de las lineas del archivo en una lista
a.close()
a = open(archivo,'w')
a.write(clave) #Se escriben las lineas que se almacenaron en la lista
a.close()
#Funcion divide el mensaje a encriptar o descifrar en partes
def div_Mensaje(mensaje,opcion):
encriptado = '' #Variable donde se almacenara el mensaje encriptado
cont = 0
if opcion == 2: #Si se desencriptara el mensaje
lista = ''
for k in range(0,len(mensaje)/LARGO): #Itera la cantidad de veces que se divide el mensaje
lista = mensaje[k*LARGO:(k+1)*LARGO] #Se extrae una parte del mensaje en una lista temporal para desencriptarlo
encriptado += desencriptar(lista) #Se va uniendo en un arreglo el mensaje desencriptado
lista = '' #Se vacia la lista temporal
if len(mensaje)%LARGO != 0.00:
lista = mensaje[(k+1)*int(LARGO):len(mensaje)] #Se extrae el residuo del mensaje
encriptado += desencriptar(lista) #Se desencripta el resto del mensaje y se une al ya desencriptado
else: #Si se encripta el mensaje
nuevo = ''
for l in mensaje:
nuevo += l #Se almacenan los caracteres del mensaje en un arreglo vacio
cont += 1 #Contador de caracteres
if cont == LARGO:
cont = 0
encriptado += encriptar(nuevo) #Se encripta una parte del mensaje y se almacena en un arreglo para unir el mensaje
nuevo = ''
if len(mensaje)%LARGO != 0:
encriptado += encriptar(nuevo) #Se encripta el residuo del mensaje y se une al ya encriptado
return encriptado
#Funcion que encripta los mensajes
def encriptar(mensaje):
e = '' #Lista vacia donde se almacenara el mensaje encriptado
a = open('key1.dat','r')
line = a.readline() #Se almacena la primera linea del archivo de claves
linea = line.split(' ') #Se separa por caracteres
cont = 0
for i in mensaje:
pos = ALFABETO.index(i) #Se obtiene la posicion del caracter en el alfabeto
valor = int(linea[cont]) #Se obtiene el valor numerico del caracter segun su posicion en el alfabeto
cont += 1 #Contador de caracteres
e += str(valor + pos)+' ' #Se suman el valor del caracter y su posicion y se almacenan en forma de string
print 'Mensaje encriptado: '+e
a.close()
borrar_Clave('key1.dat') #Llamado a la funcion borrar_Clave
return e
#Funcion que desencripta los mensajes
def desencriptar(mensaje):
d = ''
if len(mensaje) > LARGO:
m = mensaje.split()
else:
m = mensaje
b = open('key2.dat','r')
line = b.readline() #Se almacena la primera linea del archivo de claves
linea = line.split() #Se separa por caracteres
cont = 0
for i in m:
valor = int(linea[cont]) #Se convierte el caracter en un numero entero
cont += 1 #Contador de caracteres
pos = int(i) - valor #Numero del mensaje con menos la clave igual a su posicion en el alfabeto
d += ALFABETO[pos] #Se obtiene la letra del alfabeto segun el numero de su posicion y se almacena
print 'Mensaje desencriptado: '+d
b.close()
borrar_Clave('key2.dat')
return d
#Funcion MAIN
def main():
cyphertext = ''
generar_Claves()
mensaje = raw_input("Mensaje a encriptar: ")
if len(mensaje) > LARGO: #Si el mensaje es mas largo que la longitud de las claves
codigo = div_Mensaje(mensaje,1) #Se divide el mensaje a encriptar
print 'CODIGO = '+codigo
cyphertext = codigo.split() #Se divide el mensaje ya encriptado para poder desencriptarlo
texto = div_Mensaje(cyphertext,2) #Se divide el mensaje a desencriptar
print 'MENSAJE = '+texto
else:
codigo = encriptar(mensaje)
texto = desencriptar(codigo)
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment