Blum Blum Shub - Blum Blum Shub
Blum Blum Shub ( BBS ) es un generador de números pseudoaleatorios propuesto en 1986 por Lenore Blum , Manuel Blum y Michael Shub que se deriva de la función unidireccional de Michael O. Rabin .
Blum Blum Shub toma la forma
- ,
donde M = pq es el producto de dos grandes números primos p y q . En cada paso del algoritmo, parte de la salida se deriva de x n +1 ; la salida es comúnmente la paridad de bits de x n +1 o uno o más de los bits menos significativos de x n +1.
La semilla x 0 debe ser un número entero que es co-prime a M (es decir, p y q no son factores de x 0 ) y no 1 o 0.
Los dos números primos, p y q , deben ser tanto congruente a 3 (mod 4) (Esto garantiza que cada residuo cuadrático tiene una raíz cuadrada , que es también un residuo cuadrático), y deben ser números primos seguras con un pequeño gcd (( p- 3 ) / 2 , ( q-3 ) / 2 ) (esto hace que la duración del ciclo sea grande).
Una característica interesante del generador Blum Blum Shub es la posibilidad de calcular cualquier valor x i directamente (a través del teorema de Euler ):
- ,
donde está la función de Carmichael . (Aquí tenemos ).
Seguridad
Hay una prueba que reduce su seguridad a la dificultad computacional de factorizar. Cuando los primos se eligen apropiadamente, y se emiten O ( log log M ) bits de orden inferior de cada x n , entonces en el límite a medida que M crece, distinguir los bits de salida de los aleatorios debería ser al menos tan difícil como resolver la cuadrática residuosity problema módulo M .
Ejemplo
Deja , y (donde está la semilla). Podemos esperar obtener una gran duración de ciclo para esos números pequeños, porque . El generador comienza a evaluar mediante el uso y crea la secuencia , , , = 9, 81, 236, 36, 31, 202. La tabla siguiente muestra la salida (en bits) para los diferentes métodos de selección de bits utilizados para determinar la salida.
Bit de paridad | Poco menos significativo |
---|---|
0 1 1 0 1 0 | 1 1 0 0 1 0 |
La siguiente implementación de Common Lisp proporciona una demostración simple del generador, en particular con respecto a los métodos de selección de tres bits. Es importante tener en cuenta que los requisitos impuestos a los parámetros p , q y s (de semillas) no se comprueban.
(defun get-number-of-1-bits (bits)
"Returns the number of 1-valued bits in the integer-encoded BITS."
(declare (type (integer 0 *) bits))
(the (integer 0 *) (logcount bits)))
(defun get-even-parity-bit (bits)
"Returns the even parity bit of the integer-encoded BITS."
(declare (type (integer 0 *) bits))
(the bit (mod (get-number-of-1-bits bits) 2)))
(defun get-least-significant-bit (bits)
"Returns the least significant bit of the integer-encoded BITS."
(declare (type (integer 0 *) bits))
(the bit (ldb (byte 1 0) bits)))
(defun make-blum-blum-shub (&key (p 11) (q 23) (s 3))
"Returns a function of no arguments which represents a simple
Blum-Blum-Shub pseudorandom number generator, configured to use the
generator parameters P, Q, and S (seed), and returning three values:
(1) the number x[n+1],
(2) the even parity bit of the number,
(3) the least significant bit of the number.
---
Please note that the parameters P, Q, and S are not checked in
accordance to the conditions described in the article."
(declare (type (integer 0 *) p q s))
(let ((M (* p q)) ;; M = p * q
(x[n] s)) ;; x0 = seed
(declare (type (integer 0 *) M x[n]))
#'(lambda ()
;; x[n+1] = x[n]^2 mod M
(let ((x[n+1] (mod (* x[n] x[n]) M)))
(declare (type (integer 0 *) x[n+1]))
;; Compute the random bit(s) based on x[n+1].
(let ((even-parity-bit (get-even-parity-bit x[n+1]))
(least-significant-bit (get-least-significant-bit x[n+1])))
(declare (type bit even-parity-bit))
(declare (type bit least-significant-bit))
;; Update the state such that x[n+1] becomes the new x[n].
(setf x[n] x[n+1])
(values x[n+1]
even-parity-bit
least-significant-bit))))))
;; Print the exemplary outputs.
(let ((bbs (make-blum-blum-shub :p 11 :q 23 :s 3)))
(declare (type (function () (values (integer 0 *) bit bit)) bbs))
(format T "~&Keys: E = even parity, L = least significant")
(format T "~2%")
(format T "~&x[n+1] | E | L")
(format T "~&--------------")
(loop repeat 6 do
(multiple-value-bind (x[n+1] even-parity-bit least-significant-bit)
(funcall bbs)
(declare (type (integer 0 *) x[n+1]))
(declare (type bit even-parity-bit))
(declare (type bit least-significant-bit))
(format T "~&~6d | ~d | ~d"
x[n+1] even-parity-bit least-significant-bit))))
Referencias
Citas
Fuentes
- Blum, Lenore; Blum, Manuel; Shub, Michael (1983). "Comparación de dos generadores de números pseudoaleatorios" . Avances en criptología . Boston, MA: Springer EE. UU. doi : 10.1007 / 978-1-4757-0602-4_6 .
- Blum, L .; Blum, M .; Shub, M. (1986). "Un generador de números pseudoaleatorios simple e impredecible" (PDF) . Revista SIAM de Computación . Sociedad de Matemáticas Industriales y Aplicadas (SIAM). 15 (2): 364–383. doi : 10.1137 / 0215025 . ISSN 0097-5397 .
- Geisler, Martin; Krøigård, Mikkel; Danielsen, Andreas (diciembre de 2004), Acerca de los bits aleatorios (PDF) , CiteSeerX 10.1.1.90.3779