Análisis de Aleatoriedad de las llaves del One-Time Pad
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:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() |
Teniendo las llaves generadas:
Corriéndolo:
Referencias:
http://es.wikipedia.org/wiki/Libreta_de_un_solo_uso
http://scipy.org/Numpy_Example_List