miércoles, 22 de agosto de 2012

One -Time -Pad

Hola a todos ahora en esta ocasión les tenemos un pequeño programa para encriptar y desencriptar por este método One-Time-Pad

Breve explicación:

1-. Primero se crea las llaves en una archivo de texto, todas las llaves son binarios aleatoriamente
2-. Escribimos nuestro mensaje
3-. Lo Encriptamos

Forma de Encriptación:

Por ejemplo si nuestro mensaje representado en código binario fuera: 0010101
y nuestra llave fuera: 0101010

Por método exor quedaría de la siguiente manera:

mensaje = 0010101
llave = 0101010
Mensaje encriptado = 0111111

Posteriormente se desencripta con la misma llave donde el otro usuario por medio de la libreta sabrá cual es y al finalizar esta llave sera eliminada.

Aquí el código:

import random
from numpy import *
#maria = open("libreta2.txt","r","w") ## libreta quien resive
salida = []
recuperador = []
mensaje = []
inicio = 0
final = 7
a = 0
b = 7
lineas = 0
def crearlibretas(): ## aqui creamos las libretas para la encriptacion
x = 0
y = 0
pepe = open("libreta1.txt","w") ##libreta el que envia
ana = open("libreria2.txt","w")
while y<=20:
while x<= 20:
numeror = random.randint(0,2) ##valor random entre: 0<= x <2
#float(numeror)
pepe.write(str(numeror)) ## escribimos el caracter
ana.write(str(numeror))
# maria.write(str(numeror)) ## escribimos el mismo caracter
x = x + 1
#print "y = ",y,""
pepe.write("\n") ##salto de linea en el archivo
ana.write("\n")
#maria.write("\n") ##salto de linea en el archivo
x = 0
y = y + 1
pepe.close()
ana.close()
def encriptar(envio):
global inicio ## llamamos la variable global inicio es para enviar en que lugar nos quedamos en la cadena de salida
global final ##llamamos la variable global final es para enviar en que lugar nos quedamos en la cadena de salida
n = 0
# sigue = 0
y = 0
maria = open("libreta1.txt","r") ##abrimos la libreta para encriptar
x = 0
print envio
msge = raw_input("Dime tu mensaje: ") ##pedimos el mensaje a encriptar
tam = len(msge) ##medimos la longuitud del mensaje
print "tamano: ",tam,""
contador = 0 ##indisealisamos el contador a 0 para la cadena de binarios de cada uno de los caracteres
for i in maria.xreadlines(): ##empesamos a leer linea por linea del archivo
dato = i
if n == 0: ##esto era de prueba para elegir la inea pero ya no se ocupa en si
print "si entro a codificar"
while y < tam: ##para leer la cdena que el usuario tecleo
#print contador
letra2 = ord(msge[y]) ##convertimos a ascii el mensaje
binario = bin(letra2) ##convertimos en binario el ascii
taml = len(binario) ##medimos la longuitud del binario
taml = taml - 2 ##es para no contar los primeros carcteres del binario que nos salia 0b
#print "tam1 = ",taml,""
print "binario de las letras",binario,"letra: ",msge[y],""
if msge[y] == " ": ##el espacio tiene un binario menos que las demas letras
salida.append(2)
contador = contador + 1
#if n == 0:
while x < taml: #inicia el ocultamiento
# print "binario de las letras",binario,"letra: """ ##haciendo encriptacion por metodo exor
if binario[x + 2] == dato[x]:
print "binario =",binario[x + 2],"dato = ",dato[x],"" ##si es igual la cadena 0 y 0 o 1 y 1 agregamos un cero en la cadena de salida
salida.append(0)
#x = x + 1
else:
print "binario =",binario[x + 2],"dato = ",dato[x],"" ##si es diferente las entradas de binario agregamos un 1 a la candena de salida
salida.append(1)
#salida[x] = 1
x = x + 1
contador = contador + 1
if contador == 7: ##si ya son 7 datos esto quiere desir que los caracteres an sido encriptados y nos pasamos a desencriptar
#desencriptar(contador)
#contador = 0
#desencriptar(inicio,final)
desencriptar()
final = final + 7 ##agregamos para los nuevos datos
inicio = inicio + 7 ##agregamos para los nuevos datos por la salida que se sigue acumulandose los 0 y 1
contador = 0
y = y + 1
#contador = contador + 1
x = 0
# sigue = sigue + 1
print "salida= ",salida,""
maria.close()
#sigue = sigue + 1
#salida = []
#mensaje = []
## a desencriptar yupi
def desencriptar():
global inicio ##llamamos valores globales
global final ##llamamos valores globales
partida = inicio
fina = final
print "desencriptando"
desencriptador = open("libreta1.txt","r") #abrimos libreta
tamsalida = len(salida)
y = 0
x = 0
n = 0
a = 0
valor = 0
cosa = list(recuperador) ##esto lo usaremos para desifrar el mensaje
contador = 0
#partida = inicio
#fina = final
for i in desencriptador.xreadlines(): ##empesamos a leer de nuevo nuestras llaves
dato = i ##guardamos la llave
if n == 0: ##este realmente no es necesario
#while partida < fin:
while partida < fina: ##iniciamos desde nos quedamos en la ultima iteracion
#while y < partida
numero = int(dato[x])
contador = contador + 1
if salida[partida] == "2": ##si encuentra un dos e sque existe un espacip
#print "hay un espacio"
contador = 0
else:
if salida[partida] == numero: ##si es igual pues se agrega un cero
# print "salida =",salida[partida],"dato = ",dato[y],""
# cosa[y + 2] = 0
cosa.append(0)
else:
# print "salida =",salida[partida],"dato = ",dato[y],""
#cosa[y + 2] = 1
cosa.append(1) ##si es diferente se agrega un uno
x = x + 1
partida = partida + 1 ##repetimos para los demas caacteres
clave = i ##solo para imprimir
n = n + 1 #para que no lo haga de nuevo ya que no hay nada que desifrar
contador = contador + 1 ##no necesario
##impresiones
print "clave yusada: ",clave,""
print"binario recuperado",cosa,""
hahabit=len(cosa) ##no es necesario
bits = [] ##no necesario
total = len(cosa) ##tampoco necesario
ahaha = 0 ##si necesario
print "total = ",inicio,"fin:",final,""
partida = partida - 7 ##es para saber desde donde iniciaremos para cambiar de binario a ascii
##cambiando de binario a caracteres
while ahaha < 7:
#print cosa[ahaha]
if cosa[ahaha] == 1:
valor=2*valor+1
hahabit -=1
else:
valor=2*valor
# apartida = partida + 1
#partida = partida + 1
ahaha = ahaha + 1
caracter = chr(valor)
cosa = []
#bits
##imprimimos el mensaje yupi desifrado
print "valor = ",valor,""
mensaje.append(caracter)
print str(mensaje).strip('[]')
#mensaje.join(mensaje.split())
def main():
global lineas ##para borrar las lineas
##algunas variables fundamentales para ciclos
i = 0
n = 0
inicio = 0
final = 7
crearlibretas() ##creamos las llaves para el ocultamiento
quine = 0 ## este nos dira quien le toca enviar el mensaje
##nuestras personas fictisias
enviar1 = 'ale'
enviar2 = 'ana'
y = 0
##se repitira el proceso 20 veces
while i < 20:
j = 0
if quine == 0:
encriptar(enviar1) ##encriptamos
quine = 1
cantidad = len(mensaje)
##esto es para borrar las llaves ya utilizadas
while j < cantidad:
mensaje.pop()
j = j + 1
contenido =''
borrador = open("libreta1.txt") ##libreta el que envia
for line in borrador:
linea = line.split(',')
print "linea: ",linea, "lineas: ",lineas,"y:",y,""
if lineas != y:
#contenido += line
contenido += line
else:
print "borrando linea...."
y = y + 1
#else:
y = 0
borrador.close()
nuevo = open("libreta1.txt","w")
nuevo.write(contenido)
nuevo.close()
else:
encriptar(enviar2) ##encriptacion para la otra persona
cantidad = len(mensaje)
##proceso para borrar lineas de archivos en este caso la llave
while j < cantidad:
mensaje.pop()
j = j +1
quine = 0
borrador = open("libreta1.txt") ##libreta el que envia
for line in borrador:
linea = line.split(',')
if lineas != y:
contenido += line
y = y + 1
y = 0
borrador.close()
nuevo = open("libreta1.txt","w")
nuevo.write(contenido)
nuevo.close()
lineas = lineas + 1
i = i + 1
j = 0
main()
##thats all :S
view raw Habia una vez hosted with ❤ by GitHub


Aquí unas impresiones de pantalla:

Aquí se genera las llaves y se nos pide el mensaje

Empezamos a encriptar:


Aquí va encriptando dato por dato hasta completar la frase


En esta imagen si vemos en la parte superior derecha ya nos desifro el mensaje y pasa a borrar la llave usada, aquí solo se muestra en la terminal las demás llave con fines educativos, lo correcto es no mostrarlas.

y posteriormente el otro usuario dará su mensaje y se repetirá el proseso:



Thanks


1 comentario:

  1. Tu ortografía es un desastre y el código no está muy limpio tampoco. Pero está bien lo que haces. Van 4 pts.

    ResponderEliminar