miércoles, 22 de agosto de 2012

One-time pad

For this hw I have created a program that first reads a message from a file called "Message" then convert it to numbers, and then to binary.
Then I create a random key with the length of the binary string (that is saved in a file), and I apply XOR.
The result is encrypted message, now I created decrypt functions, and you can read the original message.
The code is all commented to understand him better.
I leave screenshot of several runs to see how it changes the encrypted message can fit the key.




Code:
#!/usr/bin/python
import random
import sys
import os
def desencriptar(encriptado):
"""desencriptar, toma el mensaje encriptado
y lee la clave del archivo correspondiente
"""
f = open('Aqui_no_hay_claves', "r")
print "**Desencriptando ..."
print "**Abro el archivo para leer la clave"
k = f.read() #leo el archivo con la clave
ant = "" #me sirve para ir agregando a la cadena
for i in range(len(encriptado)): #con este for puedo obtener la frase
a = int(encriptado[i]) #original aunque aun en binario
b = int(k[i])
c = bool(a) != bool(b)
c = int(c)
c = ant + str(c)
ant = c
original = ant
iteraciones = len(original)/7 #con esto divido entre 7 la cadena
lista = [] #de caracteres para poder obtener el numero
cont = 0 #entero correspondiente al binario
separados = []
numeros = []
texto = ''
for i in range(iteraciones): #aqui obtengo el caracter que
m = original[cont:cont + 7] #corresponde al numero entero
cont = cont + 7
separados.append(m)
numeros.append(int(m, 2))
texto = texto + chr(numeros[i])
texto = texto.replace('zzz', ' ')
print "**Este es el texto cifrado"
print texto
print "**Ahora elimino la clave para que nadie mas pueda leer mi mensaje"
os.remove('Aqui_no_hay_claves')#paranoicamente elimino la clave
return texto #regreso el texto original desencriptado
def convertir_binario(texto):
"""esta funcion recibe una cadena de texto
y la convierte a binario
"""
ant = ''
for i in texto:
numero = ord(i)
binario = bin(numero)
binario = str(binario)
binario = binario.split('b')
binario = binario[1]
binario = ant + binario
ant = binario
binario = ant
return binario
def leer_archivo(archivo):
"""esta funcion se encarga de leer el
archivo que contiene el mensaje
"""
f = open(archivo, "r")
texto = f.read()
original = texto
texto = texto.replace(' ', 'zzz')
return texto, original
def escribir_archivo(k):
"""escribir en un archivo
"""
f = open('Aqui_no_hay_claves', 'w')
f.write(k)
def clave(tamano):
"""esta funcion se encarga de crear una clave
unica para el mensaje
"""
clave = ''
for i in range(tamano):
clave = str(random.randint(0, 1)) + clave
return clave
def encriptar(binario, k, tamano):
"""toma como entrada la cadena binaria, la clave
y el tamano para aplicar un xor logico y retornar
el mensaje cifrado
"""
ant = ''
for i in range(tamano):
a = int(binario[i])
b = int(k[i])
c = bool(a) != bool(b)
c = int(c)
c = ant + str(c)
ant = c
cifrado = ant
return cifrado
def main():
archivo_entrada = "mensaje"
texto, original = leer_archivo(archivo_entrada)
binario = convertir_binario(texto)
tamano = len(binario)
k = clave(tamano)
print "El mensaje original es:"
print original
print "\n"
escribir_archivo(k)
mensaje_encri = encriptar(binario, k, tamano)
print "Mi mensaje encriptado"
print mensaje_encri
print "\n"
desencriptar(mensaje_encri)
main()
view raw gistfile1.py hosted with ❤ by GitHub


Results:
El mensaje original es:
Hola esta es la primer tarea de la materia de criptografia one time pad consiste en crear alguna clave para un texto aleatoriamente y guardarlo en archivos el mensaje original y la clave una vez que fue descifrado puede generar una nueva clave y eliminarla cuando ya fue descifrado
Mi mensaje encriptado
11110010011111010001001001110011000011010011010011100101011011101001101011100001001110110111011000000010110110111101111001001001010011110111110000010100010010110001111101111011101011011111001000110000110110011000111100111111101101101001100101101110010010100010001000001001011110110110011010101011011010101101111100100001011000000110000111001111101000111100111110101001010111000101011101101001111101000001110101000001000101110101110001010001100110111000111011010101010011110101110110101100000001001111101000001110000001100001100110000000011011011100010001110000001100011001001111011110011011001011111100011111100010100000111010110000110000000001011011110011110001110001010111100101110110100111100111010000111100001101111100010111001001001010110100110010001100100000110101010000101010000100101111001001010000011000110110010110101011100011100100100110100111101111000101011101101011000100101100000010101001001010010010011010100001110010101011111110001010111101001000111010011101011000100010111010111111000101111100011000001011010110000000001110001000100001000100010100010111001000011100111001111011101100011100011010000100011010000000100000000110111000001100110110101010010000001000110101001001101000000100001001100010111010101101001000110101110101100100011101100101011110000110101010010010101101110100011111010000110000110111110111100110101010101100101011110000111001011110011100110011100111110110001110100011011110101101101010111110010100000111110110000011101001011011000011100111001001010100011011010111001111010000110110000001000010101000001110001000011001101011101111011000000000101101100010101010100100011010101110010000010111110101001100101011000110010010000111000011001001100110100111001000000110101000111111001011001001000011001101101010110000011001100110101000100111010010011111010111000000110000100000000000010010000110111110011100010100100100101110101110101001010100011101011111001010010111110110100010011100110101100001001101100110001111101111111111010010110111111101000000011011111001010101000100000011111011110000100011010111100001001011000100110110111000110111011010111111010000011001100010011010010110100001010000001110001011110101101100101000100001010101000111010100001001100011010011010000000001000100101111011000000001001110000110100000110100001110101011010111010010000011001000010000110101011110100101111100101000000000000111001111011011011101111111110001101110101000000111100000100111011111110011000001101111111110111000111100000011000110010010010111101011010110010100010010000101001011011111101101001110011110001110100011100011010100000101110100001000110000110011011101100100110111101001100001110110100100100001101000001100000110011010011001
**Desencriptando ...
**Abro el archivo para leer la clave
**Este es el texto cifrado
Hola esta es la primer tarea de la materia de criptografia one time pad consiste en crear alguna clave para un texto aleatoriamente y guardarlo en archivos el mensaje original y la clave una ve zque fue descifrado puede generar una nueva clave y eliminarla cuando ya fue descifrado
**Ahora elimino la clave para que nadie mas pueda leer mi mensaje
view raw gistfile1.sh hosted with ❤ by GitHub


El mensaje original es:
Hola esta es la primer tarea de la materia de criptografia one time pad consiste en crear alguna clave para un texto aleatoriamente y guardarlo en archivos el mensaje original y la clave una vez que fue descifrado puede generar una nueva clave y eliminarla cuando ya fue descifrado
Mi mensaje encriptado
11001001110110100000110111101110110001101100010010000101100110111101100000111010100001111101010100111001111010100001000001001100010010100010110000100100111010111000011011101111110100110000000101111111100000110001000101011101000000110001001010110101000011111010000111001011001101100001010100010100001011110100001110100110110001101110101000010111101010100000001001111011001110011111110001110100101101001111010101000010110010000110101111001011100101100000000010100010010111101011111010001111000001110111011010010000010010011011010100110100000110010010110011000100100111100010110110111111100011110010011110110110100010001111100011001011001011111001101110010000000111101011011111111001011010010010011001111010011000110101100010011111011001000000101010000011111100100001011001111001010110001000000011100111010001001111101011011001000000100011111111000100101010111100110111010101001110111011001110011011011011110100010000011010010100000011110000110101110100001000100001011000100101011000101000111111000010000000111110101001111111011101000111111001111010101000101101101000001001001011100001000011111010001001110000110001101100100110100111001110110100111111110010111000101011100010101011101010001011001000000110010010110000101100000101101011011100101010001000011101000000101101110010101100100000001110010110011011100000011011001001000010101101001000010010000000101011010100101010011101011000011010110011101000011010111101111010011010011011100000111000100111100111000100011110010100111011001010111011111001011110111111111100100101001110101100011000001011000000001010010001000111000000010111011101010111001111111110001110101000110001110100101000000010111110010001100000000001111010110010110011001110111000000111011000001111001101100010111010010010011100010111111111111111100100011011011100101111011100011011000010011001010110001000101010101001011010001110100011101011011010010100100111010010101001110101010100111110101110000111110001100011001000101110001100011001001011011000110000001010111100110011111010111110000010101110111111000101111011100000101110010100010011100001001000110101011110011010011110000101001111110011100001000010010011011011101000110100111100010000101110001101111000101001010000110111100111110011100111111100010100000111100111000000110101011111100001111101101110110100101110111100110110000100010110101000100110000001000001000110100001000000001010011100010110111100111110000000011111100001101110101001101100001010010110101111111111111111100000111010000100111001101001000011000000010110010010101011000011110011110011101110001011010000010010010101100000111001000111111110010110011101111000011000000000000011100110101010000110010101110001101111101001010001
**Desencriptando ...
**Abro el archivo para leer la clave
**Este es el texto cifrado
Hola esta es la primer tarea de la materia de criptografia one time pad consiste en crear alguna clave para un texto aleatoriamente y guardarlo en archivos el mensaje original y la clave una ve zque fue descifrado puede generar una nueva clave y eliminarla cuando ya fue descifrado
**Ahora elimino la clave para que nadie mas pueda leer mi mensaje
view raw gistfile1.txt hosted with ❤ by GitHub





1 comentario:

  1. Avoid ambiguos abbreviations like "hw" (could be homework or hardware :P). The point was to generate first a one time pad, that is, a collection of keys, and then make two replicas of the pad. Then, to encrypt, person A uses her pad, and to decrypt, person B uses his - or vice versa. You receive 4 pts for the exercise.

    ResponderEliminar