jueves, 27 de junio de 2013

One Time Pad [tarea intro [TI]]

Tarea Realizada para la Materia de Seguridad de la información y criptografía  [tarea intro [TI]]

'One Time Pad'  es como una libreta en la cual cada hoja solo se utiliza una vez, es decir la clave de la hoja que se utilizo para cifrar o descifrar un mensaje solo es utilizada una vez para garantizar su funcionalidad y que los mensajes no sean descifrados, en los siguientes fragmentos de código se muestran algunos métodos que se utilizaron en el programa:

Genera el PAD
'''Metodo que genera la libreta que 
   contiene claves que solo se utilizaran una vez '''
def generaPad(lineas,caracteres):
    hoja=[]#libreta/hoja
    for j in range(lineas):
        hoja.append([])#libreta con hojas
        for i in range(caracteres):
            num=randint(0,caracteres)
            hoja[j].append(num)#hojas
    return hoja

Genera el Archivo donde guarda la PAD
'''Genera el Archivo pad.dat (libreta) '''
def genArchivo(hoja):
    archivo = open('pad.dat','w')
    lineas=len(hoja)
    for i in range(lineas):
        archivo.write(str(hoja[i]))
        archivo.write('\n')
    archivo.close()

Convierte de acuerdo a sus Números o Letras Correspondientes
'''Convierte el Mensaje original
   a una lista de numeros correspondientes'''
def conversorNum(mensaje):
    x=len(mensaje)
    mclave=[]
    if x>25:
        #aun no valido esto
        print 'El mensaje es muy grande intentelo de nuevo'
        mensaje= raw_input('Mensaje (maximo 25 caracteres) :   ')
        conversorNum(mensaje)
    for i in range(x):
        if mensaje[i] in numerosdelalf:
            mclave=mensaje.index(mensaje[i])
    return mclave

'''Convierte un conjunto de numeros 
   a las Letras correspondiente'''
def conversorLet(numeros):
    x=len(numeros)
    mensaje=[]
    for i in range(x):
        if numeros[i] in numerosdelalf:
            #numero correspondiente al alfabeto
            pos= numerosdelalf.index(numeros[i])
            mensaje[i].append(alfabeto[pos])
    return mensaje            

Cifrado es mediante la suma de el mensaje y la key(clave) de la PAD, y a esa suma se le aplica el modulo de el largo del alfabeto que estamos utilizando.
Decifrado al contrario se resta el ciphertext a la key(clave) de la copia de la PAD, y a esa resta se le aplica asimismo el modulo del alfabeto en cuestion.

'''Metodo que cifra en mensaje sumando los emelentos de la key(clave) 
   y realizando a esa suma un modulo de la longitud del alfabeto '''
#para cifrar + mod(len(alfabeto))
def cifraMensaje(mensaje,key):
    cifrado=[]
    for i in range(len(mensaje)):
        result=mensaje[i]+key[i]
        result=result%(len(numerosdelalf))
        cifrado[i].append(result)#error
    return cifrado

'''Metodo que decifra el texto cifrado que recibe como parametro
   realizando una resta de la key(clave) 
   y aplicando el modulo del alfabeto'''
#para decif -  mod(len(alfabeto))
def decifMensaje(ciftext,key):
    mensaje=[]
    for i in range(len(ciftext)):
        temp=len(numerosdelalf)
        result=temp+ciftext[i]-key[i]
        result=result%(len(numerosdelalf))
        mensaje[i].append(result)
    return mensaje

Si requiere el código completo se puede ver en en este espacio: 
Ver Aqui                                                           Descargar Aqui

Salidas

Terminal_>
karenalduncin@lilalduncin:~/codigos/crypto$ python otp.py 6 25 hola
One Time Pad 
[11, 19, 2, 18, 24, 13, 1, 13, 7, 13, 15, 4, 14, 3, 2, 21, 17, 10, 2, 1, 11, 12, 19, 17, 1]
[4, 7, 2, 21, 8, 20, 20, 21, 23, 5, 22, 18, 21, 15, 5, 20, 12, 10, 10, 23, 3, 15, 20, 14, 21]
[4, 22, 16, 21, 20, 19, 11, 9, 8, 23, 18, 9, 25, 11, 10, 4, 12, 14, 21, 15, 13, 24, 18, 19, 24]
[21, 25, 5, 16, 17, 9, 25, 22, 17, 1, 7, 4, 13, 6, 22, 9, 25, 8, 19, 21, 16, 16, 3, 8, 4]
[9, 1, 2, 16, 18, 16, 0, 7, 3, 9, 9, 2, 7, 8, 0, 18, 19, 10, 24, 22, 5, 9, 1, 1, 2]
[6, 5, 14, 18, 17, 24, 0, 23, 9, 12, 25, 15, 4, 13, 23, 15, 16, 19, 18, 22, 18, 21, 14, 21, 17]
Mensaje:
hola
Mensaje Convertido:
[]
Mensaje Cifrado:
[]
Mensaje:
[]
karenalduncin@lilalduncin:~/codigos/crypto$ 

Archivo Generado:

pad.dat


Futuras Mejoras

En la ejecución el código no me muestra los cambios que sufre el mensaje, para esto se realizaran pruebas en el código para comprobar si en realidad entra en las condiciones y que el mensaje realmente puede volver a su estado original llegando del punto A que es cifrar así como al punto B en el cual se descifra, también ya que aun falta eliminar la clave que ya fue usada, esto es solo los métodos sin la ejecución del algoritmo funcionando, se subirá una entrada consecutiva a esta para solucionar estos problemas.


1 comentario:

  1. Pues, se supone que habría dos réplicas del archivo que estarían leídos y modificados en cada ejecución, y como bien mencionas, la parte esa de borrar falta. También falta que sean dos archivos de diferentes nombres pero el mismo contenido inicial – uno para Alice y otro para Bob. 3 pts.

    ResponderBorrar