Materias

jueves, 30 de agosto de 2012

Entrada # 3

Análisis de Aleatoriedad de las llaves del One-Time Pad


Para esta semana consistió en demostrar que las llaves generadas son realmente aleatorias.

La demostración de lo anterior se realizo de esto mediante la Prueba de Frecuencia de Bloques,  la elección  de esta se debió ya que en la clase de Modelado (        http://modelado-p.blogspot.mx/2012/05/reporte-3.html) ya había hecho uso de ella.


La Prueba de Frecuencia de Bloques verifica que la cantidad de unos y de ceros sea equitativa.

Esta prueba hace uso de algunas variables, a continuación explicare el uso de cada una:


n -> Número de elementos, en el problema seria la cantidad de llaves generadas

m -> Todos los números aleatorios generados por todas las llaves
N -> Cantidad de números de por bloque, la cantidad de números con las cuenta cada llave

Código realizado:


from scipy.stats import chi2
from numpy import *
def main():
#Variable x para poder obtener el valor de cada numero de las llaves, ya que algunos son de dos cifras
#Para Obtener la lista de todos los numeros
Libro1 = open('Libreta1.txt', 'r') #Lectura de las llaves
Lista = [] #Lista que guarda todas las llaves
y = 1
x = ''
for j in range(10):
for i in Libro1.readline():
if i == '\n':
y = y + 1
if i != ' ' and i != '\n':
x = x + i
else:
if(x != ''):
Lista.append(x)
x = ''
z = len(Lista) #Obtiene el largo de todas los numeros generados
#Variables m y n para respetar y entender mejor lo realizado en la entrada de Modelado
m = z
n = y
Libro1.close() #Cerrando el archivo ya que realizo su funcion
#Encontrando los valores de los bloques y de las sumas
Sumas = zeros(y) #Crea el arreglo Sumas igual a la cantidad de y
ValSum = 0
ValSum1 = 0.0
x = ''
Libro1 = open('Libreta1.txt', 'r') #Volviendo a abrir el archivo
for j in range(10):
for i in Libro1.readline():
if i != ' ' and i != '\n':
x = x + i
else:
if(x != ''):
ValSum = ValSum + int(x)
x = ''
ValSum1 = (ValSum / m)*1.0
Sumas[j] = ValSum1
ValSum = 0
delete(Sumas, [9])
Libro1.close()
#Lo demas
N = round(m/n) #Como requiero un valor entero se aplica el redondeo(round)
x2 = 0.0
i = 0
valor = 0
for i in range(int(N)):
x2 = x2 + float((Sumas[i]-0.5)**2)
print "\nValor de X2: "+str(x2)
x2 = x2 * 4 * m
df = m - 1
valor = chi2.cdf(x2, df) #Funcion chicuadrara
if valor > 0.01:
print '\nPrueba de Bloques superada, '+str(valor)+' mayor que 0.01'
else:
print '\nPrueba de Bloques no superada, '+str(valor)+' menor que 0.01'
main()
view raw bloques.py hosted with ❤ by GitHub



Teniendo las llaves generadas:



Corriéndolo:




Referencias:

http://es.wikipedia.org/wiki/Libreta_de_un_solo_uso
http://scipy.org/Numpy_Example_List

1 comentario:

  1. demostramiento :P ¿No que "demostración"? Me hubiera gustado tener más pruebas que uno solo. Además las entradas en inglés valen más por lo general. Son 5 pts esta vez.

    ResponderEliminar