""" Método de Encriptacion y Desencriptacion, se le indica el nombre y
ubicación del archivo de llaves, el mensaje a encriptar o desencriptar, que
proceso realizara Encriptado \'E\' o Desencriptado \'D\' por omisión se usa \'E\'.
"""
def E(M, archivo, tipo=\'E\'):
# Abecedario para tomar y reemplazar las posiciones del mensaje encriptado y a encriptar.
ABC = ascii_lowercase+\' 1234567890\'
# Para evitar errores aseguro que todo el mensaje este en minúsculas.
M = M.lower()
# Lee el archivo de llaves y las asigno a la variable keys.
keys = leerListaKey(archivo)
# Verifico la longitud de todas las listas para usarlas en futuras validaciones.
(largoM, largoKey, largoABC) = (len(M), len(keys[0]), len(ABC))
# Inicializo variable donde concatenare el texto cifrado o descifrado.
ciphertext = \'\'
# Variable para controlar si es adicion o sustraccion, se multiplica por el valor de la llave
# antes de ser sumada, Encriptar 1, Desencriptar -1.
e = 1 if tipo == \'E\' else -1
if largoM > largoKey:
# Itera la cantidad de veces que se necesitara una llave completo.
for i in range(0,(largoM / largoKey)):
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.
# 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.
ciphertext += ABC[valPosicion(ABC.index(M[j+(i * largoKey)])+(int(key[j])*e), largoABC)]
resto = largoM% largoKey
# Se obtiene una llave mas en caso de faltar algunas letras menores a una llave.
if resto > 0: key = keys.pop(0)
# Se itera para la cantidad de letras faltantes largo mensaje modulo largo llaves.
for i in range(resto):
ciphertext += ABC[valPosicion(ABC.index(M[i+((largoM/largoKey) * largoKey)])+(int(key[i])*e), largoABC)]
else:
key = keys.pop(0)
# Itero sobre la longitud del mensaje ya que deducimos que su longitud es
# menor a la de una llave.
for j in range(len(M)):
# Concatenamos el valor resultante de la operacion de igual forma que antes
ciphertext += ABC[valPosicion(ABC.index(M[j])+(int(key[j])*e), largoABC)]
# una vez terminado el proceso, las llaves restantes se guardaran en el mismo archivo
# eliminando las anteriores.
guardarArchivo(keys, archivo)
return ciphertext # Se retorna el texto cifrado.