Last active
July 10, 2017 05:44
-
-
Save soul0592/5874858 to your computer and use it in GitHub Desktop.
El método de cifrado One-Time Pad
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
#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