Blog. Just Blog

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

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Генератор случайных чисел с использованием RANDOM.ORG
Генератор случайных чисел с использованием RANDOM.ORG

Тема генераторов случайных чисел является одной из основных в криптографии. Использование любых программных генераторов случайных чисел имеет один главный недостаток: последовательность чисел может называться случайной только если между символами, нету зависимости. А любой алгоритм так или иначе подразумевает зависимость от вычислений. Истинно случайные числа получаются только от аппаратных генераторов. Одним из таких генераторов является сайт RANDOM.ORG. По заявлению его владельцев, источником для случайных чисел является атмосферный шум. Не берусь утверждать, так это или нет, но этот сайт пользуется заслуженной популярностью среди разработчиков всего мира.

Для доступа к генератору на сайте есть API с подробной документацией. Доступ бесплатный, но есть ограничения на количество переданной информации. Причем ограничение определяется количеством бит, переданных на один ip в сутки. Как только лимит будет исчерпан, ничего получить с сайта будет нельзя. Покупку дополнительных бит я тут не рассматриваю, но она есть. Количество оставшихся бит также можно посмотреть через API. Впрочем, лимит этот большой (1.000.000 бит в сутки на один ip с ежедневным восстановлением 200.000 бит), и для обычного приложения его более чем достаточно.

С теорией закончили, перейдем к практической реализации. Я написал две функции для проверки количества оставшихся бит и для получения истинно случайных чисел с сайта RANDOM.ORG. Начну с функции проверки лимита. Она самодостаточная, не требует никаких дополнительных данных. Возвращает количество оставшихся бит для текущего ip-адреса или 0, если сайт недоступен или лимит исчерпан.
  1. ;----------------------------------------------------------------
  2. ; Проверка количества оставшихся бесплатных бит,
  3. ; а также доступности сайта RANDOM.ORG
  4. ;----------------------------------------------------------------
  5. ; На выходе:
  6. ;   EAX = 0 - сайт недоступен или бесплатных бит не осталось
  7. ;   EAX > 0 - количество оставшихся бит
  8. ;----------------------------------------------------------------
  9. proc RO_chk_bits
  10.         locals
  11.             result  dd ?
  12.             tmp     dd ?
  13.             bits    rb 100h
  14.         endl
  15.  
  16.         ; Сохранить все регистры
  17.         pusha
  18.  
  19.         ; По умолчанию все плохо
  20.         mov     [result],0
  21.  
  22.         ; Открыть соединение
  23.         invoke  InternetOpen,NULL,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0
  24.         or      eax,eax
  25.         jz      .loc_ret
  26.  
  27.         ; Положить Handle на стек
  28.         push    eax
  29.  
  30.         ; Запросить соединение с URL
  31.         invoke  InternetOpenUrl,eax,.q_link,NULL,0,INTERNET_FLAG_NO_UI,0
  32.         or      eax,eax
  33.         jz      .