Генератор Mersenne Twister на Ассемблере
Mersenne Twister (Вихрь Мерсенна) - высокоэффективный генератор псевдослучайных чисел, разработанный Makoto Matsumoto и Takuji Nishimura. К математику Марену Мерсенну название имеет отношение потому, что период генерации равняется числу 219937-1, которое, в свою очередь, является числом Мерсенна. Несмотря на то, что Mersenne Twister является одним из наиболее тщательно протестированных генераторов ПСЧ из ныне существующих, а выдаваемые им последовательности проходят статистические тесты, использование Mersenne Twister в криптографии не рекомендуется без дополнительного шифрования.Для работы генератора требуется достаточно объемная структура, в которой сохраняется текущее состояние каждого измерения.
Code (Assembler) : Убрать нумерацию
- MT_SIZE = 624
- PERIOD = 397
- DIFF = MT_SIZE-PERIOD
- struct MT_STATE
- index dd ?
- mt rd MT_SIZE
- mt_tempered rd MT_SIZE
- ends
- state MT_STATE
При инициализации надо передать начальный параметр, его можно получить, например, при помощи команды RDTSC, функции GetTickCount или чего-нибудь подобного.
Code (Assembler) : Убрать нумерацию
- ;---------------------------------------------
- ; Инициализация генератора случайных чисел
- ; stdcall mt_srand,seed
- ;---------------------------------------------
- proc mt_srand dValue:DWORD
- pusha
- mov [state.index],MT_SIZE
- mov eax,[dValue]
- mov [state.mt],eax
- mov ecx,1
- @@:
- mov eax,[state.mt+ecx*4-4]
- mov ebx,eax
- shr ebx,30
- xor eax,ebx
- xor edx,edx
- mov ebx,0x6C078965
- mul ebx
- add eax,ecx
- mov [state.mt+ecx*4],eax
- inc ecx
- cmp ecx,MT_SIZE
- jb @b
- popa
- ret
- endp
Code (Assembler) : Убрать нумерацию
- ;---------------------------------------------
- ; Получить случайное число
- ; stdcall mt_rand
- ; на выходе EAX - случайное число
- ;---------------------------------------------
- proc mt_rand
- pusha
- cmp [state.index],MT_SIZE
- jne .loc_ret
- xor ecx,ecx
- .loc_loop:
- mov eax,[state.mt+ecx*4]
- and eax,0x80000000
- mov ebx,[state.mt+ecx*4+4]
- and ebx,0x7FFFFFFF
- or eax,ebx
- mov ebx,eax
- shl ebx,31
- shr ebx,31
- and ebx,0x9908B0DF
- shr eax,1
- xor eax,ebx
- mov ebx,[state.mt+ecx*4+PERIOD*4]
- cmp ecx,DIFF
- jb @f
- mov ebx,[state.mt+ecx*4-DIFF*4]
- @@:
- xor eax,ebx
- mov [state.mt+ecx*4],eax
- inc ecx
- cmp ecx,(MT_SIZE-1)
- jb .loc_loop
- mov eax,[state.mt+(MT_SIZE-1)*4]
- and eax,0x80000000
- mov ebx,[state.mt]
- and ebx,0x7FFFFFFF
- or eax,ebx
- mov ebx,eax
- shl ebx,31
- shr ebx,31
- and ebx,0x9908B0DF
- shr eax,1
- xor eax,ebx
- xor eax,[state.mt+(PERIOD-1)*4]
- mov [state.mt+(MT_SIZE-1)*4],eax
- ; temper
- xor ecx,ecx
- .loc_temper:
- mov eax,[state.mt+ecx*4]
- mov ebx,eax
- shr ebx,11
- xor eax,ebx
- mov ebx,eax
- shl ebx,7
- and ebx,0x9D2C5680
- xor eax,ebx
- mov ebx,eax
- shl ebx,15
- and ebx,0xEFC60000
- xor eax,ebx
- mov ebx,eax
- shr ebx,18
- xor eax,ebx
- mov [state.mt_tempered+ecx*4],eax
- inc ecx
- cmp ecx,MT_SIZE
- jb .loc_temper
- mov [state.index],0
- .loc_ret:
- inc [state.index]
- mov eax,[state.index]
- mov eax,[state.mt_tempered+eax*4]
- mov [esp+28],eax
- popa
- ret
- endp
Просмотров: 1157 | Комментариев: 1
Метки: Assembler, генератор ПСЧ
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Добавить комментарий
Заполните форму для добавления комментария
Попалась когда-то игра на .net с обфускацией, гугление 0x6C078965 привело на Mersenne Twister, первая часть ключа была как init, а все последующие части ключа как word от random.next. Испытал более десятка реализаций на разных языках и нифига общего, результаты везде разные.