buscarlos de manera que el periodo de las secuencias generadas sea máximo. Los autores de [Alva98] demuestran que la no satisfacción de la condición de que los primos sean doblemente seguros sólo reduce el periodo de la secuencia a la mitad del máximo, que sigue siendo, de sobra, un valor suficientemente elevado. Bastaría por tanto exigir a
p
y aq
que fuesen primos 1–seguro (decimos que un primop
es 1–seguro sip=2⋅p'+1
, conp'
primo). Respecto a la condición de quep
oq
sean congruentes con3mod8
, y teniendo en cuenta que la mitad de los primos lo son, existe una probabilidad del 75 % de que se cumpla esa condición buscando dos primos 1–seguro sin más limitación. Si finalmente ninguno de los dos primos satisfacen esa condición, entonces el periodo de la secuencia vuelve a dividirse por dos, pero sigue siendo todavía entonces una secuencia de enorme longitud, más que suficiente para un trabajo ordinario con este generador. Falta ahora determinar qué propiedades deben tener las semillas para que los periodos que se obtengan a partir de ellas no tengan un ciclo corto. Para que la semilla produzca una órbita de periodo máximo se exige [Hern96]:)
(mod
0
,
1
,
1
0p
x
≡/
−
x
0≡/1,−1,0(modq)
(12)La probabilidad de encontrar una semilla de estas condiciones es alta (mayor o igual que
)
(
3
1−
×
p
−1+q
−1 ). 5.2.2.4. Simetría.Diseño e implementación de generadores de bits aleatorios y pseudoaleatorios 137 la secuencia tenga igual frecuencia de unos que de ceros en una ejecución larga. El artículo muestra que para muchos valores de
N
yx
0 se obtienen secuencias no simétricas. Estadesviación se produce en mayor grado precisamente cuando procuramos valores de
N
yx
0 quegaranticen los máximos periodos. Pero termina concluyendo que aún en el caso más desfavorable las asimetrías no son tan grandes como cabría esperar en una secuencia aleatoria de longitud similar.
5.2.3. Algunas de las distintas funciones implementadas.
Han quedado recogidas anteriormente las características que debe tener el valor del módulo y el valor de la semilla si se quieren lograr periodos máximos. También ha quedado dicho que se puede suavizar el rigor de esas condiciones, evitando exigencias de cálculo que, como veremos, llevan consigo las condiciones de que los primos sean 2–seguro. Una disminución en las exigencias de los primos, reduce el periodo de la secuencia, pero ya hemos visto que su longitud sigue siendo más que suficiente para los usos del generador.
Nosotros hemos trabajado todo el tiempo con el generador BBS, con los primos 2–seguro. Eso nos ha permitido conocer la dificultad que supone que nuestros módulos del generador sean especiales. Reducir esta condición a que los primos sean 1–seguro no supone apenas trabajo de implementación y facilita enormemente la búsqueda de los primos para obtener el módulo
N
del generador.Para las exigencias del periodo máximo se ve necesario definir una función que cree claves adecuadas que verifiquen las condiciones recogidas en (9) (10) y (11). Otra función deberá generar una semilla inicial que verifique las condiciones para las semillas señaladas en (12).
Funciones más sencillas son las que realizan la operación de generación de nuevos valores de
x
i,y otras dos que calculen, a partir de cada valor
x
i, el valorb
i, bien sea por cálculo de la paridad,bien sea por determinada ubicación de un bit de
x
i.Finalmente quedan definidas algunas otras funciones auxiliares. 5.2.3.1. Algoritmo de generación de enteros largos aleatorios.
La forma que hemos implementado para asignar un valor entero aleatorio de una longitud (en número de bits) determinada a una variable tipo NUMERO, es colocar un uno en la posición que determina la longitud y asignar valores cero o uno a los restantes dígitos binarios situados a la derecha de ese primer uno, mediante el algoritmo de generación de bits pseudoaleatorios BBS. Hemos definido inicialmente dos algoritmos, sustancialmente iguales, para este proceso. La diferencia que existe entre uno y otro estriba en el modo en que se obtiene el valor binario de cada iteración: por paridad o tomando un bit de cada iteración
x
i.Diseño e implementación de generadores de bits aleatorios y pseudoaleatorios 138 Los prototipos de las funciones diseñadas son:
void GeneradorBBS_p(NUMERO*,UINT4,NUMERO*,NUMERO*); void GeneradorBBS_b(NUMERO*,UINT4,NUMERO*,NUMERO*);
La función recibe como parámetros la dirección de la variable tipo NUMERO donde quedará almacenado en forma de entero largo la nueva secuencia generada. Un segundo parámetro es la longitud (número de bits) que debe tener el número generado: es decir, el número de iteraciones que se deberán hacer. Los otros dos parámetros son los del módulo
N
y de la semilla0
x
.Estas funciones asignan bit a bit un valor de entero largo a la variable de tipo NUMERO recibida como primer parámetro. La función hace dos comprobaciones:
1. Que no se solicita asignar más bits de los que puede albergar en la dimensión en que ha sido creada la variable sobre la que se asignará un valor aleatorio.
2. Que la semilla que se ha tomado para los cálculos tiene una dimensión suficientemente grande para las operaciones de producto modular módulo
N
.Ambas circunstancias exigirían abortar el proceso.
Los procesos de generación de enteros largos aleatorios definidos cumplen las exigencias presentadas en [Blum86] que lo hacen criptográficamente seguro: tomar un bit de paridad de cada nuevo valor
x
i generado o tomar un bit de posición de cada nuevo valorx
i generado. Ladificultad es la lentitud de este generador.
Un modo de incrementar la velocidad es tomando más valores binarios de cada nuevo
x
iobtenido. Si hacemos esto, dejamos de tener un respaldo matemático que garantice la seguridad criptográfica del generador tal y como lo presentaron sus creadores. Pero indudablemente multiplicamos su velocidad. En [Vazi85] se demuestra que la seguridad del generador queda garantizada si de cada valor
x
i tomamoslog
2log
2x
i bits de información para la secuencia quese está generando. Esta seguridad queda garantizada bajo el supuesto de la dificultad de factorizar el módulo del generador (que será del mismo rango que los valores
x
i sucesivos).Tomando en consideración esta afirmación demostrada, hemos definido otros nuevos procedimientos de generación de aleatorios, donde para cada elemento UINT4 de
x
i tomamos4 bits para la secuencia. Esto supone un muy notable incremento en la generación de aleatorios – como veremos posteriormente en las gráficas comparativas de tiempos– pues, si por ejemplo, trabajamos con un módulo de 128 bits (que no es en absoluto grande, sino más bien demasiado pequeño) obtenemos 16 bits de información para la secuencia que generamos en cada
x
icalculado, y no sólo un bit, como ocurría antes.
Diseño e implementación de generadores de bits aleatorios y pseudoaleatorios 139
int) la base de numeración es 32