
Генератор случайных чисел с использованием RANDOM.ORG

Генератор случайных чисел с использованием RANDOM.ORG
Тема генераторов случайных чисел является одной из основных в криптографии. Использование любых программных генераторов случайных чисел имеет один главный недостаток: последовательность чисел может называться случайной только если между символами, нету зависимости. А любой алгоритм так или иначе подразумевает зависимость от вычислений. Истинно случайные числа получаются только от аппаратных генераторов. Одним из таких генераторов является сайт RANDOM.ORG. По заявлению его владельцев, источником для случайных чисел является атмосферный шум. Не берусь утверждать, так это или нет, но этот сайт пользуется заслуженной популярностью среди разработчиков всего мира.
Для доступа к генератору на сайте есть API с подробной документацией. Доступ бесплатный, но есть ограничения на количество переданной информации. Причем ограничение определяется количеством бит, переданных на один ip в сутки. Как только лимит будет исчерпан, ничего получить с сайта будет нельзя. Покупку дополнительных бит я тут не рассматриваю, но она есть. Количество оставшихся бит также можно посмотреть через API. Впрочем, лимит этот большой (1.000.000 бит в сутки на один ip с ежедневным восстановлением 200.000 бит), и для обычного приложения его более чем достаточно.
С теорией закончили, перейдем к практической реализации. Я написал две функции для проверки количества оставшихся бит и для получения истинно случайных чисел с сайта RANDOM.ORG. Начну с функции проверки лимита. Она самодостаточная, не требует никаких дополнительных данных. Возвращает количество оставшихся бит для текущего ip-адреса или 0, если сайт недоступен или лимит исчерпан.
Code (Assembler) : Убрать нумерацию
- ;----------------------------------------------------------------
- ; Проверка количества оставшихся бесплатных бит,
- ; а также доступности сайта RANDOM.ORG
- ;----------------------------------------------------------------
- ; На выходе:
- ; EAX = 0 - сайт недоступен или бесплатных бит не осталось
- ; EAX > 0 - количество оставшихся бит
- ;----------------------------------------------------------------
- proc RO_chk_bits
- locals
- result dd ?
- tmp dd ?
- bits rb 100h
- endl
- ; Сохранить все регистры
- pusha
- ; По умолчанию все плохо
- mov [result],0
- ; Открыть соединение
- invoke InternetOpen,NULL,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0
- or eax,eax
- jz .loc_ret
- ; Положить Handle на стек
- push eax
- ; Запросить соединение с URL
- invoke InternetOpenUrl,eax,.q_link,NULL,0,INTERNET_FLAG_NO_UI,0
- or eax,eax
- jz .