Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from sys import argv, exit
- from random import shuffle, randint
- from string import ascii_lowercase
- """ Genera una lista de llaves a partir de la cantidad(n) y los rangos de
- inicio(a) y fin(b).
- """
- def keygenRango(n, a, b):
- hojas = []
- for i in range(n):
- hojas.append(range(a,b))
- shuffle(hojas[i])
- return hojas
- """ Genera una lista de llaves totalmente aleatoria donde 'x' son la cantidad
- de llaves a generar e 'y' es la longitud de cada llave
- """
- def keygen(x, y):
- hojas = []
- for i in range(x):
- hojas.append([])
- for j in range(y):
- hojas[i].append(randint(0,100))
- return hojas
- """ Guarda la lista de llaves generada anteriormente o modificada, en caso de
- existir el archivo sobreescribira el existente.
- """
- def guardarArchivo(lista, archivo='key'):
- original = open(archivo, 'w')
- for i in lista:
- original.write(' '.join(str(x) for x in i)+'\n')
- original.close()
- """ Obtiene una lista de llaves en forma de matriz a partir de la lectura de un
- archivo de llaves generado anteriormente.
- """
- def leerListaKey(archivo):
- entrada = open(archivo, 'r')
- lista = []
- for linea in entrada:
- lista.append(linea.split())
- return lista
- """ Valida si la posicion nueva no supera la longitud de la variable ABC, en
- caso de superarla regresara el modulo simulando la cantidad de vueltas y
- posicionandose en el residuo a partir de la posicion 0 de la variable ABC.
- Python Number abs() Method http://goo.gl/Smnug para comparar los valores
- absolutos.
- """
- def valPosicion(numero, maximo):
- if abs(numero) > abs(maximo):
- return numero % maximo
- else:
- return numero
- """ Metodo de Encriptacion y Desencriptacion, se le indica el nombre y
- ubicacion del archivo de llaves, el mensaje a encriptar o desencriptar, que
- proceso realizara Encriptado 'E' o Desencriptado 'D' por omision se usa 'E'.
- """
- def E(M, archivo, tipo='E'):
- ABC = ascii_lowercase+' 1234567890' # Abecedario para tomar y reemplazar las posiciones del mensaje encriptado y a encriptar
- M = M.lower() # Para evitar errores aseguro que todo el mensaje este en minusculas
- keys = leerListaKey(archivo) # Lee el archivo de llaves y las asigno a la variable keys
- (largoM, largoKey, largoABC) = (len(M), len(keys[0]), len(ABC)) # Verifico la longitud de todas las listas para usarlas en futuras validaciones
- ciphertext = '' # Inicializo variable donde concatenare el texto cifrado o descifrado
- e = 1 if tipo == 'E' else -1# variable para controlar si es adicion o sustraccion, se multiplica por el valor de la llave antes de ser sumada, Encriptar 1, Desencriptar -1
- if largoM > largoKey:
- for i in range(0,(largoM / largoKey)): # Itera la cantidad de veces que se necesitara una llave completo.
- key = keys.pop(0) # Obtengo la llave y la elimino de la lista.
- for j in range(len(key)): # Se itera sobre la longitud de la llave obtenida anteriormente
- ciphertext += ABC[valPosicion(ABC.index(M[j+(i * largoKey)])+(int(key[j])*e), largoABC)] # Realizo la operacion (suma o resta) para obtener la nueva posicion, y se verifica si supera la longitud del abecedario con valPosicion y se concatena la letra resultante con el texto cifrado.
- resto = largoM% largoKey
- if resto > 0: key = keys.pop(0) # Se obtiene una llave mas en caso de faltar algunas letras menores a una llave
- for i in range(resto): # Se itera para la cantidad de letras faltantes largo mensaje modulo largo llaves
- ciphertext += ABC[valPosicion(ABC.index(M[i+((largoM/largoKey) * largoKey)])+(int(key[i])*e), largoABC)]
- else:
- key = keys.pop(0)
- for j in range(len(M)): #Itero sobre la longitud del mensaje ya que deducimos que su longitud es menor a la de una llave
- ciphertext += ABC[valPosicion(ABC.index(M[j])+(int(key[j])*e), largoABC)] # Concatenamos el valor resultante de la operacion de igual forma que antes
- guardarArchivo(keys, archivo) # una vez terminado el proceso, las llaves restantes se guardaran en el mismo archivo eliminando las anteriores
- return ciphertext # Se retorna el texto cifrado
- if __name__ == '__main__':
- (mensaje, archivo, tipo) = ('', '', '')
- try:
- for i in range(1, len(argv), 2):
- if argv[i].lower() == '--genkey':
- f = raw_input('Nombre del archivo a generar >> ')
- n = int(raw_input('Cantidad de llaves a generar >> '))
- m = int(raw_input('Longitud de llaves >> '))
- k = keygen(n, m)
- guardarArchivo(k, f)
- print 'Se han generado las llaves!!'
- exit(0)
- elif argv[i] == '-m':
- mensaje = argv[i+1].lower()
- elif argv[i] == '-f':
- archivo = argv[i+1]
- elif argv[i] == '-t':
- tipo = argv[i+1]
- if tipo != 'E' and tipo != 'D':
- print 'Error \'tipo\': E encriptar o D desencriptar .... -t D'
- exit(0)
- elif argv[i] == '--help':
- print '-m\tDefine el mensaje\n \t-m "Mensaje a Procesar"'
- print '-f\tDefine la ruta de acceso al archivo\n \t-f /home/usuario/llaves'
- print '-t\tDefine el tipo de proceso, si se encripta(E) o desencripta(D)\n \t-t E'
- print '--genKey\tLanza el proceso para generar las claves o llaves'
- else:
- print 'O_o ???'
- print E(mensaje, archivo, tipo)
- except:
- print 'Intente el comando --help'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement