Это название дано Кнутом [863]. Алгоритм представляет собой способ объединить несколько псевдослучайных потоков, увеличивая их безопасность. Выход одного генератора используется для выбора отстающего в ы-хода другого генератора [996, 1003]. На языке С:
#define ARR_SIZE (8192) /* например - чем больше, тем лучше */ static unsigned char delay! ARRSIZE ] ; unsigned char prngA( void ) long prngB( void ) ; void init_algM( void ) {
long i ;
for ( i = 0 ; i < ARR_SIZE ; i++ ) delay[i] = prngAO ; } /* lnlt_algM */ unsigned char alglM( void ) {
long j,v ;
j = prngBO % ARR_SIZE ; /* получить индекс delay[]*/
v = delay[j] ; /* получить возвращаемое значение */
delay[j] = prngAO ; /* заменить его */
return ( v ) ;
} /* algM */
Смысл состоит в том, что если prngA - действительно случайно, невозможно ничего узнать о prngB (и, следовательно, невозможно выполнить криптоанализ). Если prngA имеет такой вид, что его криптоанализ может быть выполнен только, если его выход доступен в свою очередь (т.е., только если сначала был выполнен крип-
тоанализ prngB), а в противном случае оно по сути действительно случайно, то эта комбинация должна быть безопасной.