Advertisement
nac13k

One Time Pad

Jun 26th, 2013
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.66 KB | None | 0 0
  1. from sys import argv, exit
  2. from random import shuffle, randint
  3. from string import ascii_lowercase
  4.  
  5. """ Genera una lista de llaves a partir de la cantidad(n) y los rangos de
  6.    inicio(a) y fin(b).
  7.    """
  8. def keygenRango(n, a, b):
  9.     hojas = []
  10.     for i in range(n):
  11.         hojas.append(range(a,b))
  12.         shuffle(hojas[i])
  13.     return hojas
  14.  
  15. """ Genera una lista de llaves totalmente aleatoria donde 'x' son la cantidad
  16.    de llaves a generar e 'y' es la longitud de cada llave
  17.    """
  18. def keygen(x, y):
  19.     hojas = []
  20.     for i in range(x):
  21.         hojas.append([])
  22.         for j in range(y):
  23.             hojas[i].append(randint(0,100))
  24.     return hojas
  25.  
  26. """ Guarda la lista de llaves generada anteriormente o modificada, en caso de
  27.    existir el archivo sobreescribira el existente.
  28.    """
  29. def guardarArchivo(lista, archivo='key'):
  30.     original = open(archivo, 'w')
  31.     for i in lista:
  32.         original.write(' '.join(str(x) for x in i)+'\n')
  33.     original.close()
  34.  
  35. """ Obtiene una lista de llaves en forma de matriz a partir de la lectura de un
  36.    archivo de llaves generado anteriormente.
  37.    """
  38. def leerListaKey(archivo):
  39.     entrada = open(archivo, 'r')
  40.     lista = []
  41.     for linea in entrada:
  42.         lista.append(linea.split())
  43.     return lista
  44.  
  45. """ Valida si la posicion nueva no supera la longitud de la variable ABC, en
  46.    caso de superarla regresara el modulo simulando la cantidad de vueltas y
  47.    posicionandose en el residuo a partir de la posicion 0 de la variable ABC.
  48.    
  49.    Python Number abs() Method http://goo.gl/Smnug para comparar los valores
  50.    absolutos.
  51.    """
  52. def valPosicion(numero, maximo):
  53.     if abs(numero) > abs(maximo):
  54.         return numero % maximo
  55.     else:
  56.         return numero
  57.  
  58. """ Metodo de Encriptacion y Desencriptacion, se le indica el nombre y
  59.    ubicacion del archivo de llaves, el mensaje a encriptar o desencriptar, que
  60.    proceso realizara Encriptado 'E' o Desencriptado 'D' por omision se usa 'E'.
  61.    """
  62. def E(M, archivo, tipo='E'):
  63.     ABC = ascii_lowercase+' 1234567890' # Abecedario para tomar y reemplazar las posiciones del mensaje encriptado y a encriptar
  64.     M = M.lower() # Para evitar errores aseguro que todo el mensaje este en minusculas
  65.     keys = leerListaKey(archivo) # Lee el archivo de llaves y las asigno a la variable keys
  66.     (largoM, largoKey, largoABC) = (len(M), len(keys[0]), len(ABC)) # Verifico la longitud de todas las listas para usarlas en futuras validaciones
  67.     ciphertext = '' # Inicializo variable donde concatenare el texto cifrado o descifrado
  68.  
  69.     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
  70.  
  71.     if largoM > largoKey:
  72.         for i in range(0,(largoM / largoKey)): # Itera la cantidad de veces que se necesitara una llave completo.
  73.             key = keys.pop(0) # Obtengo la llave y la elimino de la lista.
  74.             for j in range(len(key)): # Se itera sobre la longitud de la llave obtenida anteriormente
  75.                 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.
  76.         resto = largoM% largoKey
  77.         if resto > 0: key = keys.pop(0) # Se obtiene una llave mas en caso de faltar algunas letras menores a una llave
  78.         for i in range(resto): # Se itera para la cantidad de letras faltantes largo mensaje modulo largo llaves
  79.             ciphertext += ABC[valPosicion(ABC.index(M[i+((largoM/largoKey) * largoKey)])+(int(key[i])*e), largoABC)]
  80.  
  81.     else:
  82.         key = keys.pop(0)
  83.         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
  84.             ciphertext += ABC[valPosicion(ABC.index(M[j])+(int(key[j])*e), largoABC)] # Concatenamos el valor resultante de la operacion de igual forma que antes
  85.     guardarArchivo(keys, archivo) # una vez terminado el proceso, las llaves restantes se guardaran en el mismo archivo eliminando las anteriores
  86.     return ciphertext # Se retorna el texto cifrado
  87.  
  88.  
  89. if __name__ == '__main__':
  90.     (mensaje, archivo, tipo) = ('', '', '')
  91.     try:
  92.         for i in range(1, len(argv), 2):
  93.             if argv[i].lower() == '--genkey':
  94.                 f = raw_input('Nombre del archivo a generar >> ')
  95.                 n = int(raw_input('Cantidad de llaves a generar >> '))
  96.                 m = int(raw_input('Longitud de llaves >> '))
  97.                 k = keygen(n, m)
  98.                 guardarArchivo(k, f)
  99.                 print 'Se han generado las llaves!!'
  100.                 exit(0)
  101.             elif argv[i] == '-m':
  102.                 mensaje = argv[i+1].lower()
  103.             elif argv[i] == '-f':
  104.                 archivo = argv[i+1]
  105.             elif argv[i] == '-t':
  106.                 tipo = argv[i+1]
  107.                 if tipo != 'E' and tipo != 'D':
  108.                     print 'Error \'tipo\': E encriptar o D desencriptar .... -t D'
  109.                     exit(0)
  110.             elif argv[i] == '--help':
  111.                 print '-m\tDefine el mensaje\n  \t-m "Mensaje a Procesar"'
  112.                 print '-f\tDefine la ruta de acceso al archivo\n  \t-f /home/usuario/llaves'
  113.                 print '-t\tDefine el tipo de proceso, si se encripta(E) o desencripta(D)\n  \t-t E'
  114.                 print '--genKey\tLanza el proceso para generar las claves o llaves'
  115.             else:
  116.                 print 'O_o ???'
  117.         print E(mensaje, archivo, tipo)
  118.  
  119.     except:
  120.         print 'Intente el comando --help'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement