jueves, 23 de agosto de 2012

Tarea: One Pad Time

Para esta entrada, se nos encargo hacer un programa que hiciera one time pad, a continuación les dejo el código:

Generador de claves:

from random import randint

def generarClaves(cantidad, nombre):
    a = 'abcdefghijklmnopqrstuvwxyz '
    largoClave = 80
    for i in range(cantidad):
        clave = list()
        for j in range(largoClave):
            letra = a[randint(0, len(a)-1)]
            clave.append(letra)
        clave.append("\n")
        guardarClaves(clave, nombre)

def guardarClaves(clave, nombre):
    clave = "".join(clave)
    archivo = open(str(nombre), "a")
    archivo.write(clave)
    archivo.close()
    otro = open("copia"+str(nombre), "a")
    otro.write(clave)
    otro.close()

cantidad = int(raw_input("Dame la cantidad de claves a generar: "))
nombre = raw_input("Dame el nombre del archivo: ")
generarClaves(cantidad, nombre)

Encriptacion-Desencriptación:

def main(mensaje, nombreA):
    clave = convertirMensajeAnsi(leerArchivo(nombreA))
    mensaje = convertirMensajeAnsi(mensaje)
    opcion = raw_input('Escoge 1 encriptar, 2 desencriptar: ')
    if(opcion == '1'):
        enc = "".join(modulo(mensaje, clave))
        print "encriptado: "+str(enc)
    if(opcion == '2'):
        des = "".join(moduloD(mensaje, clave))
        print "desencriptdo: "+str(des)

def modulo(mensaje, clave):
    enc = list()
    for i in range(len(mensaje)):
        enc.append(encriptar(mensaje[i], clave[i]))
    return enc

def moduloD(mensaje, clave):
    enc = list()
    for i in range(len(mensaje)):
        enc.append(desencriptar(mensaje[i], clave[i]))
    return enc

def encriptar(mensaje, clave):
    enc = int((int(mensaje) + int(clave))%123)
    return chr(enc)

def desencriptar(mensaje, clave):
    enc = int((int(mensaje) - int(clave))%123)
    return chr(enc)

def convertirMensajeAnsi(mensaje):    
    a = list()
    for letra in mensaje:
        ansi = str(ord(letra))
        if(len(ansi) < 3): ansi = "0"+str(ansi) 
        a.append(ansi)
    return a

def leerArchivo(nombreA):
    archivo = open(str(nombreA), 'r+')
    linea = archivo.readline()
    raw_input()
    nuevo = "".join(archivo.readlines()[0:])
    open('b.txt', 'w+').write(nuevo)
    return linea


mensaje = raw_input("Ingresa el mensaje: ")
nombreA = raw_input("Ingresa el nombre del archivo que cont. claves: ")
main(mensaje, nombreA)

Imagen:
Les dejo una captura de una prueba que hice.


Comentarios:
Me falta pulir un poco más el código, ya que unos métodos se repiten o algunas lineas que se pueden simplificar u optimizar.

1 comentario:

  1. El reporte sí ocuparía algo de pulido, pero en términos técnicos está bien. Van 4 pts.

    ResponderEliminar