rand()
От: Аноним  
Дата: 25.09.04 16:01
Оценка:
Скажите можно ли на функции rand() забабахать генератор ключей при условии что будем использовать конкретную точку отсчета установленную через srand(). Последовательность будет таже на других компах?
Re: rand()
От: Олег Гашев
Дата: 25.09.04 16:19
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Скажите можно ли на функции rand() забабахать генератор ключей при условии что будем использовать конкретную точку отсчета установленную через srand(). Последовательность будет таже на других компах?



void __cdecl srand (
        unsigned int seed
        )
{
#ifdef _MT

        _getptd()->_holdrand = (unsigned long)seed;

#else  /* _MT */
        holdrand = (long)seed;
#endif  /* _MT */
}

int __cdecl rand (
        void
        )
{
#ifdef _MT

        _ptiddata ptd = _getptd();

        return( ((ptd->_holdrand = ptd->_holdrand * 214013L
            + 2531011L) >> 16) & 0x7fff );

#else  /* _MT */
        return(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff);
#endif  /* _MT */
}
Либо я найду путь, либо проложу его. © Свифт
Re: rand()
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 27.09.04 04:49
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Скажите можно ли на функции rand() забабахать генератор ключей при условии что будем использовать конкретную точку отсчета установленную через srand().


Нет нельзя. Функции типа rand дают очень плохую с криптографической точки зрения случайную последовательность. Она даже не является случайной — это так называемая псевдослучайная последовательность, получаемая с помощью линейного конгруэнтного генератора псевдослучайных чисел. Подобные генераторы очень хорошо описаны во втором томе Кнута. Принцип их работы основан на алгоритме, который вычисляет каждое следующее число последовательности на основе предыдущего. Главное свойство этих генераторов заключается, в том, что для небольших выборок (порядка 100 элементов), полученых на основе таких алгоритмов справедливы основные законы мат. статистики (например, закон больших чисел). Основные недостатки в следующем: зная коэффициенты алгоритма и стартовую точку, можно высчитать все последующие элементы и они всегда будут постоянны; имея небольшую выборку, можно с высокой степенью вероятности начать предугадывать все последующие элементы. Мои собственные исследования в отношении линейных конгуэнтных генераторов псевдослучайных чисел показали следующее: уже на выборках свыше 1000 элементов в этих последовательностях начинается чётко прослеживаемое нарушение свойства независимости и проявление памяти, то есть такие выборки нельзя использовать даже в научных статистических исследованиях.
Для получения случайных чисел криптографического качества лучше использовать специальные функции. В случае Windows, например, это CryptGenRandom, доступная начиная с Windows 95 OSR2.
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.