Блюм Блюм Шуб

Генератор псевдослучайных чисел

Blum Blum Shub ( BBS ) — генератор псевдослучайных чисел, предложенный в 1986 году Ленор Блюм , Мануэлем Блюмом и Михаэлем Шубом [1] , который является производным от односторонней функции Михаэля О. Рабина .

Blum Blum Shub принимает форму

х н + 1 = х н 2 мод М {\displaystyle x_{n+1}=x_{n}^{2}{\bmod {M}}} ,

где M = pq — произведение двух больших простых чисел p и q . На каждом шаге алгоритма из x n +1 выводится некоторый вывод ; вывод обычно представляет собой либо битовую четность x n +1 , либо один или несколько младших битов x n +1 .

Начальное число x 0 должно быть целым числом, взаимно простым с M (т.е. p и q не являются множителями x 0 ), а не 1 или 0.

Два простых числа, p и q , должны быть оба сравнимы с 3 (mod 4) (это гарантирует, что каждый квадратичный вычет имеет один квадратный корень , который также является квадратичным вычетом), и должны быть безопасными простыми числами с малым наибольшим общим делителем (( p-3 ) /2 , ( q-3 ) /2 ) (это делает длину цикла большой).

Интересной особенностью генератора Блюма-Блюма-Шуба является возможность вычисления любого значения x i напрямую (с помощью теоремы Эйлера ):

х я = ( х 0 2 я мод λ ( М ) ) мод М {\displaystyle x_{i}=\left(x_{0}^{2^{i}{\bmod {\lambda }}(M)}\right){\bmod {M}}} ,

где — функция Кармайкла . (Здесь мы имеем ). λ {\displaystyle \лямбда} λ ( М ) = λ ( п д ) = лкм ( п 1 , д 1 ) {\displaystyle \lambda (M)=\lambda (p\cdot q)=\operatorname {lcm} (p-1,q-1)}

Безопасность

Существует доказательство, сводящее его безопасность к вычислительной сложности факторизации. [1] Когда простые числа выбраны надлежащим образом и выводится O ( log log M ) младших битов каждого x n , то в пределе, когда M становится большим, отличить выходные биты от случайных должно быть по крайней мере так же сложно, как решить задачу квадратичного остатка по модулю M .

Производительность генератора случайных чисел BBS зависит от размера модуля M и количества бит на итерацию j . Хотя уменьшение M или увеличение j ускоряет алгоритм, это также снижает безопасность. В статье 2005 года дается конкретное, а не асимптотическое, доказательство безопасности BBS для заданных M и j . Результат также можно использовать для руководства выбором двух чисел путем балансирования ожидаемой безопасности и вычислительных затрат. [2]

Пример

Пусть , и (где — начальное число). Мы можем ожидать получить большую длину цикла для этих малых чисел, потому что . Генератор начинает оценку , используя и создает последовательность , , , = 9, 81, 236, 36, 31, 202. В следующей таблице показаны выходные данные (в битах) для различных методов выбора битов, используемых для определения выходных данных. п = 11 {\displaystyle p=11} д = 23 {\displaystyle q=23} с = 3 {\displaystyle s=3} с {\displaystyle с} г с г ( ( п 3 ) / 2 , ( д 3 ) / 2 ) = 2 {\displaystyle {\rm {НОД}}((p-3)/2,(q-3)/2)=2} х 0 {\displaystyle x_{0}} х 1 = с {\displaystyle x_{-1}=s} х 0 {\displaystyle x_{0}} х 1 {\displaystyle x_{1}} х 2 {\displaystyle x_{2}} {\displaystyle \ldots } x 5 {\displaystyle x_{5}}

Бит четностиНаименее значимый бит
0 1 1 0 1 01 1 0 0 1 0

Ниже приведена реализация Python , которая проверяет простоту числа.

import  sympy def  blum_blum_shub ( p1 ,  p2 ,  seed ,  iterations ) :  assert  p1  %  4  ==  3  assert  p2  %  4  ==  3  assert  sympy.isprime ( p1 // 2 ) assert sympy.isprime ( p2 // 2 ) n = p1 * p2 numbers = [] for _ in range ( iterations ) : seed = ( seed ** 2 ) % n if seed in numbers : print ( f " ГСЧ зациклился на { len ( numbers ) } шагах " ) return numbers numbers.append ( seed ) return numbers                               печать ( blum_blum_shub ( 11 ,  23 ,  3 ,  100 ))

Следующая реализация Common Lisp обеспечивает простую демонстрацию генератора, в частности, в отношении трех методов выбора бит. Важно отметить, что требования, предъявляемые к параметрам p , q и s (seed), не проверяются.

( defun get-number-of-1-bits ( bits ) "Возвращает количество битов со значением 1 в целочисленном коде BITS." ( declare ( type ( integer 0 * ) bits )) ( the ( integer 0 * ) ( logcount bits )))               ( defun get-even-parity-bit ( bits ) "Возвращает бит четности целочисленно закодированных БИТОВ." ( declare ( type ( integer 0 * ) bits )) ( the bit ( mod ( get-number-of-1-bits bits ) 2 )))               ( defun get-least-significant-bit ( bits ) "Возвращает младший бит целочисленно закодированного 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 )) "Возвращает функцию без аргументов, которая представляет собой простой  генератор псевдослучайных чисел Блюма-Блюма-Шуба, настроенный на использование  параметров генератора P, Q и S (начальное число) и возвращающий три значения:  (1) число x[n+1],  (2) бит четности числа,  (3) младший значащий бит числа.  ---  Обратите внимание, что параметры P, Q и S не проверяются в  соответствии с условиями, описанными в статье." ( declare ( type ( integer 0 * ) p q s )) ( let (( M ( * p q )) ;; M = p * q ( x[n] s )) ;; x0 = начальное число ( 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] )) ;; Вычислить случайный бит(ы) на основе 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 )) ;; Обновить состояние так, чтобы x[n+1] стало новым x[n]. ( setf x[n] x[n+1] ) ( values ​​x[n+1] even-parity-bit least-significant-bit ))))))                                                                         ;; Распечатайте примерные результаты. ( 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 = четность, L = младший значащий" ) ( 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 less-significant-bit ) ( funcall bbs ) ( declare ( type ( integer 0 * ) x[n+1] )) ( declare ( type bit even-parity-bit )) ( declare ( type bit less-significant-bit )) ( format T "~&~6d | ~d | ~d" x[n+1] бит-четности младший-значимый-бит ))))                                                             

Ссылки

Цитаты

  1. ^ ab Blum, Blum & Shub 1986, стр. 364–383.
  2. ^ Сидоренко, Андрей; Шёнмейкерс, Берри (2005). «Конкретная безопасность псевдослучайного генератора Блюма-Блюма-Шуба». Криптография и кодирование . 3796 : 355–375. doi :10.1007/11586821_24.

Источники

  • Блюм, Ленор; Блюм, Мануэль; Шуб, Майкл (1983). «Сравнение двух генераторов псевдослучайных чисел». Advances in Cryptology . Boston, MA: Springer US. стр. 61–78. doi :10.1007/978-1-4757-0602-4_6. ISBN 978-1-4757-0604-8.
  • Blum, L.; Blum, M.; Shub, M. (1986). "Простой непредсказуемый генератор псевдослучайных чисел" (PDF) . Журнал SIAM по вычислениям . 15 (2). Общество промышленной и прикладной математики (SIAM): 364–383. doi :10.1137/0215025. ISSN  0097-5397. Архивировано (PDF) из оригинала 2021-08-14.
  • Гейслер, Мартин; Кройгард, Миккель; Дэниелсен, Андреас (декабрь 2004 г.), О случайных битах (PDF) , CiteSeerX  10.1.1.90.3779 , заархивировано (PDF) из оригинала 31 марта 2016 г.
  • GMPBBS, реализация на языке C, созданная Марком Россмиллером
  • BlumBlumShub, реализация на языке Java от Марка Россмиллера
  • Реализация на Java
  • Тесты на случайность
Retrieved from "https://en.wikipedia.org/w/index.php?title=Blum_Blum_Shub&oldid=1225067689"