Русский
Русский
English
Статистика
Реклама

Генератор случайных чисел

Recovery mode Генератор псевдослучайных чисел большой разрядности

07.07.2020 20:09:59 | Автор: admin
Недавно появилась статья с описанием скоростного генератора случайных чисел (утверждается, что самого быстрого в мире).
Понятно, её автор не читает русскоязычных статей по теме, но если бы читал, то не стал бы утверждать о мировом первенстве своего генератора в скорости работы. Скорость генерации псевдослучайных чисел в 12 ГигаБайт/сек. была достигнута достаточно давно.Этот генератор применяется для выработки ключей шифрования.
Далее в статье будет описан генератор сверхдлинных псевдослучайных чисел. Он базируется на криптографическом преобразовании Русская Рулетка.
Генератор формирует числа длиной 8192 байта со скоростью 12 ГигаБайт в секунду в один поток (на одном процессорном ядре).
Генератор собран на базе криптографического преобразования Русская Рулетка, которое было специально заточено под скоростную генерацию случайных чисел. Для этого из него исключена схема ввода ключей шифрования и соответственно удалена обратимость преобразования для формирования криптостойкой последовательности псевдослучайных чисел.
Тестовая последовательность (100 МегаБайт), получаемая в результате работы генератора полностью проходит статистические тесты NIST, DieHard.
Тесты проводились методом последовательной генерации псевдослучайных чисел из исходной монотонной последовательных восьмикилобайтных чисел.
Исходные числа содержат нулевые байты, кроме счетчика, который размещен в младших 8 байт.

Схема базового криптографического преобразования

Криптографическое преобразование собрано по кольцевой схеме из 16 модулей с нелинейными свойствами. Каждый модуль выполняет операцию над 16 байтами, всего в одном раунде модифицируется 256 байт. Нелинейный модуль использует в качестве накопителя половину ymm регистра (16байт).
Обьединение накопителей в 256 байтное число реализовано с использованием операции битового суммирования (XOR) в двух вариантах.

Первое преобразование можно рассматривать, как модификацию схемы Фейстеля, где операция суммирования происходит не с предыдущим значением единственного преобразователя, а с текущим значением соседнего нелинейного модуля в кольцевой структуре.
Схема c замыканием накопителей в кольцо осуществляет модификацию значений всех позиционных битов с размножением в них изменений состояния. Коэффициент размножения изменения состояния для одного позиционного бита всегда равен 2.
Вот как он реализован, регистры ymm0-ymm7 содержат 16 накопителей:

vperm2i128 ymm10,ymm0,ymm0,001h;  поменять местами 1 и 16 накопители  vpxor ymm0,ymm0,ymm1;                           vpxor ymm1,ymm1,ymm2;    vpxor ymm2,ymm2,ymm3;     vpxor ymm3,ymm3,ymm4;      vpxor ymm4,ymm4,ymm5;       vpxor ymm5,ymm5,ymm6;        vpxor ymm6,ymm6,ymm7;         vpxor ymm7,ymm7,ymm10;              замкнуть кольцо модификаций


Изменение состояния единственного бита приводит к гарантированному 50% изменению всех битов во всех накопителях за 32 раунда работы кольцевой схемы, поэтому минимальный размер блока получается равен 32*256=8 КилоБайт.
Второе преобразование использует кумулятивную схему. Модификация накопителей в каждом раунде сделана так, чтобы в них происходило суммирование содержимого от 2 до 8 накопителей.
Вот код этого преобразования:

vpxor ymm1,ymm1,ymm0;  vpxor ymm2,ymm2,ymm1;   vpxor ymm3,ymm3,ymm2;    vpxor ymm4,ymm4,ymm3;     vpxor ymm5,ymm5,ymm4;      vpxor ymm6,ymm6,ymm5;       vpxor ymm7,ymm7,ymm6;        vperm2i128 ymm8,ymm7,ymm7,001h;     поменять местами 1 и 16 накопители         vpxor ymm0,ymm0,ymm8;                     замкнуть кольцо модификаций.


Изменение состояния единственного бита в этой схеме приводит к гарантированному 50% изменению всех битов во всех накопителях за 16 раундов работы кольцевой схемы.
Далее будут описаны криптографическое преобразование и процедура генерации псевдослучайного числа размером 8 КилоБайт.

Нелинейный модуль преобразования

Нелинейный модуль преобразования во многом аналогичен используемому в Российском шифраторе Магма (бывший ГОСТ 28147-89), но имеет размер 16 байт. Нелинейный модуль выполняет операции перестановки и кольцевого сдвига.
Сначала выполняется перестановка, индексы 16 байтовой перестановки задаются в алгоритме, для каждого модуля используется собственная перестановка.
Затем выполняется кольцевой сдвиг фрагментов накопителя, сдвиги используются двух типов.
Первый тип использует фиксированные коэффициенты сдвига, для каждого накопителя, они задаются в алгоритме. Кольцевые сдвиги выполняются над 2 байтными фрагментами накопителя. Внутри каждого накопителя все сдвиги одинаковые.
Второй тип кольцевого сдвига использует в качестве коэффициента сдвига переменное значение из накопителя сдвинутого в кольце нелинейных преобразователей на 8 позиций. Кольцевые сдвиги выполняются над 4 байтными фрагментами 16 байтного накопителя. Коэффициенты сдвига берутся из первого байта каждого 4 байтного слова.
Соответственно в таком модуле используется 4 сдвига с непредсказуемыми и различными коэффициентами сдвига.
Сами циклические сдвигатели реализуют функцию частичной инверсии. Если в старшем разряде сдвигателя находится единичный бит, то старшие разряды инвертируются, число инвертируемых разрядов равняется числу коэффициента сдвига.
Вот реализация модуля с переменным кольцевым сдвигом:

vperm2i128 ymm8,ymm0,ymm0,001h;   запомнить с обменом местами накопители  vpshufb ymm0,ymm0,[r14+0100h];       две перестановки по 16 байт каждая       vpand ymm8,ymm8,[r14];                    обнуление в двойных словах разрядов 5-31    vpsubb ymm12,ymm15,ymm8;            обратное значение для кольцевого сдвига      vpsravd ymm8,ymm0,ymm8;              сдвиг с размножением знакового разряда      vpsllvd ymm0,ymm0,ymm12;             сдвиг на освобожденные места       vpxor ymm0,ymm0,ymm8;                суммирование с частичным инвертированием


В регистре ymm15 содержится значение 020h в каждом двойном слове
По адресу [r14+0100h] содержатся индексы перестановки
По адресу [r14] содержится восемь масок сдвига со значением 01fh

Вот реализация модуля с фиксированным кольцевым сдвигом:

vpshufb ymm1,ymm1,[r14+0100h];       две перестановки по 16 байт каждая           vpsraw ymm14,ymm1,5;                       сдвиг с размножением знакового разряда   vpsllw ymm1,ymm1,16-5;                    сдвиг на освобожденные места    vpxor ymm1,ymm1,ymm14;                суммирование с частичным инвертированием      vpxor ymm1,ymm1,ymm2;                суммирование накопителя с предшествующим


Если подсчитать общее количество кольцевых сдвигов в одном раунде преобразования, то их будет 4*16=64 для переменных сдвигов и 8*16=96 для фиксированных. Поэтому такое криптопреобразование получило название Русская Рулетка.

Формирование 4 КилоБайтного числа из 256 Байтного

Имея генератор с разрядностью 256 Байт, получить 8 КилоБайтное число непростая задача. Сформировать 32 числа размером 256 Байт и сказать, что это 8 КилоБайтное число не получится.
Поясню на простом примере.
Пускай у нас есть несколько генераторов псевдослучайных чисел с разрядностью 32 бита (всего 4 миллиарда комбинаций). Как бы мы их не комбинировали в большое число, все равно через 4 миллиарда раундов это большое число повторится полностью
Но это не все.
Есть еще одна искусственность при формировании чисел большой разрядности из более коротких. Значения выдаваемые любым генератором псевдослучайных чисел связаны между собой конкретной и одозначной зависимостью, когда последующие значения всегда функционально зависят от предыдущих.
Нам же нужно связать все псевдослучайные компоненты большого числа зависимостями так, чтобы значение любого компонента влияло на все остальные, а не только на последующие.
Проще говоря, у такого числа не должно быть начального и конечного компонента, все они должны быть в неразрывном кольце.

Поэтому нужно делать генератор на полную разрядность в 8 КилоБайт, используя более короткое криптопреобразование как базовый компонент. Для этого:
исходный 8 КилоБайтный буфер шифруется блоками 256 Байт.
шифрование выполнено по схеме гаммирования с обратной связью.
такое шифрование производится в два прохода (по кольцу).
в первом проходе используются модули с переменными кольцевыми сдвигами и закрепленными за нелинейными модулями накопителями.
во втором проходе используются фиксированные кольцевые сдвиги и кольцевой сдвиг накопителей относительно нелинейных преобразователей.
В такой схеме состояние любого бита зависит от всех остальных битов в выходном числе.
Разные криптопреобразования в проходах шифрования нужны для более равномерного распределения статистических параметров такого большого числа.
Такая схема формирования псевдослучайных чисел выдает последовательность со статистическими параметрами, полностью удовлетворяющими критериям случайности по версии NIST (отсутствуют выпадения из заданных диапазонов пропорций и значение Р не опускается ниже 0,002ххх)
Тесты NIST разработаны для 64 битных генераторов и они при дефолтных настройках осуществляют усреднение параметров для 1 500 000 чисел в тестовой последовательности. В нашем же случае, генерируются числа длиной 8К, и усреднение статистических параметров осуществляется всего для 1500 чисел. И тем не менее, уже на такой небольшой выборке значений удается успешно пройти статистические тесты
При этом обеспечивается скорость генерации случайных чисел на уровне 12 ГигаБайт/сек.

Реализация в тестовой программе

Эта достаточно громоздкая двухпроходная конструкция используется для формирования псевдослучайных чисел размером 8 КилоБайт со скоростью не менее 12 ГигаБайт/сек.
Исходные тексты и скомпилированная программа генерации псевдослучайных чисел доступны по ссылкам.
Феноменальная скорость достигается за счет большой разрядности регистров (32 байта) и конвейерной (параллельной) обработки команд.
Тестовый генератор использует команды AVX2, поэтому скорость работы зависит от конкретной модели процессора, а на старых процессорах может не работать, на новых процессорах скорость будет гораздо выше заявленных 12 ГигаБайт/сек.
На процессорах Intel шестой генерации (тестирование проводилось именно на них) скорость генератора определялась в первую очередь пропускной способностью памяти, а не частотой процессора.
На настоящий момент это самый быстрый генератор псевдослучайных чисел с самой большой разрядностью генерируемых чисел и самыми качественными статистическими параметрами по версии NIST.
Вот такой получился тройной рекордсмен

Ну и по традиции, всем генераторам псевдослучайных чисел авторы присваивают имена, не будем отступать от этой традиции и окрестим его именем RU-lette, от имени прародителя, а по-русски получается, что его имя ру-лет
Подробнее..

Генераторы псевдослучайных чисел на основе РСЛОС

07.12.2020 16:06:42 | Автор: admin

Сегодня для решения множества прикладных задач требуется возможность генерировать случайные числа. Очевидно, что в зависимости от того, какая конкретно задача решается, к генератору случайных чисел будут предъявляться различные требования: например, иногда от генератора случайных чисел может понадобиться только уникальность полученного числа, в то время как зачастую, особенно в области криптографии, требования к подобному устройству/алгоритму накладываются гораздо более жёсткие.

Сразу стоит сделать уточнение, что числа, полученные на выходе некоторого детерминированного алгоритма и обладающие свойством случайности, называются псевдослучайными, а соответствующие генераторы называют генераторами псевдослучайных чисел(ГПСЧ).

Целью данной статьи является ознакомление с ГПСЧ на основе регистров сдвига с линейной обратной связью, несколькими их модификациями, а также несколькими криптографически стойкими ГПСЧ, которые применяются на практике.

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

Начнём немного издалека, с рассмотрения общей структуры ГПСЧ. За основу взята структура, которая рекомендуется и более детально рассмотрена авторами в [2].

http://personeltest.ru/aways/nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-90Ar1.pdf , страница 11https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-90Ar1.pdf , страница 11

Кратко рассмотрим каждый блок:

  1. Источник энтропии - некоторый внешний источник случайности или, иными словами, механизм, генерирующий случайные величины(совокупность таких величин ещё называют начальным вектором), которые в дальнейшем используются для инициализации состояния внутреннего состояния ГПСЧ.

  2. Дополнительная входная информация(дополнительный вход) также может быть использована в качестве дополнительного источника для задания начального состояния. Помимо этого возможна дополнительная подача однократно используемого числа или кода(nonce). Строка персонализации, которая делает очередную инициализацию уникальной, тоже настоятельно рекомендуется для использования, т.к. является дополнительным источником энтропии.

  3. Внутреннее состояние - память ГПСЧ, в которой хранятся параметры и переменные, которые необходимы для работы генератора;

  4. Функция инициализации получает входные данные энтропии и объединяет их с полученным nonce и строкой персонализации, в результате чего создаётся некоторое начальное значение, из которого в свою очередь создаётся начальное внутреннее состояние;

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

  6. Функция деинициализации очищает внутреннее состояние системы, что полезно делать в целях противодействия анализу системы;

  7. Функция генерации создаёт на выходе псевдослучайное число на основании полученных данных(дополнительный вход и внутреннее состояние) и генерирует новое внутреннее состояние для следующего запроса;

  8. Блок тестирования производит проверку корректности работы ГПСЧ.

Алгоритмы генерации псевдослучайных чисел

Регистр сдвига с линейной обратной связью

Рассматриваемый класс генераторов построен на идее использования регистров сдвига с линейной обратной связью(РСЛОС), т.е. преобразовании двоичного представления некоторого числа.

Регистр сдвига с линейной обратной связью. Источник: [3, стр. 105]Регистр сдвига с линейной обратной связью. Источник: [3, стр. 105]

Регистр сдвига состоит из n однобитовых ячеек b1, b2, . . . , bn и линейной обратной связи с коэффициентами C1 = 1, C2, C3 , . . . , Cn {0, 1}. Ненулевые коэффициенты называют отводами(рекомендуемые индексы отводов в зависимости от длины битового поля регистра можно найти в [8]). Выходная последовательность задаётся многочленом над полем Галуа GF(2), т.е происходит суммирование по модулю 2:

C(x) = С1xn + C2xn-1 + . . . + Cnx + 1,

который называют характеристическим многочленом РСЛОС. На каждом этапе генератор

  1. Суммирует по модулю 2 значения ячеек, индексы которых совпадают с индексами отводов, т.е. коэффициенты Ci которых равны 1;

  2. Сдвигает значения на одну ячейку влево;

  3. В самый правый бит записывает значение, полученное на шаге 1.

Выходом такого генератора является значение самого левого бита b1 после сдвига. Максимальный период выходной последовательности такого генератора равен 2n-1, причём он достигается только тогда, когда характеристический многочлен является примитивным.

Важно отметить, что РСЛОС не является криптографически устойчивым ГПСЧ, т.к. в случае, если известна структура РСЛОС, то внутреннее состояние генератора может быть восстановлено по n значениям на выходе. Кроме того, по 2n выходным значениям можно восстановить и внутреннее состояние, и структуру РСЛОС, что в свою очередь приводит к возможности восстановить все последующие и предыдущие значения генератора.

Регистр сдвига с обратной связью по переносу

Хочется обратить внимание на существующую модификацию генератора ГПСЧ на основе РСЛОС, а именно: регистр сдвига с обратной связью по переносу. Отличием от предыдущего случая является наличие дополнительного регистра переноса, который является не битом, а числом, возникающим в результате определённых преобразований(такое преобразование называется функцией обратной связи).

Алгоритм работы также очень похож на предыдущий:

  1. В начале каждой итерации складываются значения ячеек, индексы которых совпадают с индексами отводов, и значение регистра переноса;

  2. Значения сдвигаются на одну ячейку;

  3. Остаток от деления по модулю 2 полученного результата помещается в последнюю ячейку;

  4. Целая часть такого деления становится новым значением регистра переноса.

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

Хоть и становится очевидным, что одним из способов улучшения показателя криптостойкости является увеличение периода генерируемой последовательности, регистр сдвига с обратной связью по переносу не относят к криптографически стойким ГПСЧ.

Криптографически стойкие ГПСЧ на основе РСЛОС

Прежде чем перейти к рассмотрению более сложных алгоритмов, хотелось бы всё-таки понять, какие требования накладываются на ГПСЧ, чтобы его можно было считать криптографически стойким ГПСЧ(КСГПСЧ). Чтобы последовательность можно было считать криптографически безопасной псевдослучайной, она должна быть максимально непредсказуемой[9, п. 2.8], т.е. должно быть как можно труднее предсказать, каким будет следующий бит, даже если полностью известен алгоритм или устройство, генерирующее последовательность, и все предыдущие биты потока.

Для проверки того, насколько тот или иной ГПСЧ может считать КСГПСЧ, существует множество специально разработанных тестов, которые оценивают разные параметры генераторов. Довольно много таких тестов описано в [1], помимо этого можно ознакомиться с рекомендуемым набором тестов в [10] . Важно отметить, что под криптографической стойкостью стоит понимать не принципиальное отсутствие алгоритмов, которые могут предсказать выход генератора за полиномиальное время, а неизвестность таковых на данный момент.

Перейдём, наконец, к рассмотрению некоторых примеров "хороших" генераторов, основанных на уже разобранных выше методах.

Нелинейная комбинация РСЛОС

Одним из способов улучшения криптостойкости последовательности, генерируемой РСЛОС, является осуществление преобразования с помощью функции, содержащей нелинейные члены. Для большей ясности воспользуемся фактом из дискретного анализа: любая булева функция может быть единственным образом записана через полином Жегалкина:

Слева - поясняющая схема, справа - представление функции в виде полинома ЖегалкинаСлева - поясняющая схема, справа - представление функции в виде полинома Жегалкина

Т.е. если до этого функцию преобразования можно было представить как сумму по модулю 2 значений битов с отводами, то теперь в неё добавляются комбинации из произведений некоторых значений таких бит. Преимуществом данного метода заключается в том, что из-за нелинейности функции в общем случае неизвестен полиномиальный алгоритм восстановления состояния регистров по предыдущим выходам. Кроме того, сильно увеличивается период генерируемой последовательности. Для улучшения стойкости последовательности рекомендуется брать больше нелинейных членов полинома Жегалкина.

Генераторы с несколькими регистрами сдвига

Ещё одним способом улучшения криптографических свойств последовательности состоит в создании генераторов из нескольких регистров сдвига L1 . . . LM , выходы которых подсоединены к устройству преобразования, задаваемого некоторой булевой функцией.

В каждом i-м регистре ровно Li ячеек, причём регистры подобраны таким образом, чтобы значения их длин были взаимно-простыми величинами, т.е. НОД(Li, Lj) = 1 для ij. Булева функция f должна включать слагаемое по одному из входов, т.е. f = . . . + xi + . . . , чтобы значения на выходе функции были равновероятными. Период такого генератора может достигать величины 2L, где L - сумма длин всех регистров, что сильно увеличивает стойкость по сравнению с обычным РСЛОС.

Генератор "стоп-пошёл"

Генератор "стоп-пошёл" представляет из себя объединение двух РСЛОС(условно обозначим их РСЛОС-1 и РСЛОС-2). РСЛОС-2 работает только в том случае, если в предыдущий момент времени выходное значение РСЛОС-1 было равно 1. Такой принцип работы генератора РСЛОС-2 ещё называют тактирвоанием, т.е. можно говорить, что РСЛОС-1 тактирует РСЛОС-2.

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

Для увеличения криптостойкости и чтобы избавиться от указанного выше недостатка, может быть использован генератор "стоп-пошёл", состоящий из 3 РСЛОС. При такой конфигурации РСЛОС-2 меняет своё состояние при наличии 1 на выходе РСЛОС-1, а РСЛОС-3 при 0. Выходом генератора является операция побитового сложения выходов РСЛОС-2 и РСЛОС-3. В источнике [4] утверждается, что сложность и длина периода такого генератора обладают хорошими показателями стойкости.

Каскад Голлмана

Каскад Голлмана является некоторым обобщением генератора "стоп-пошёл": он состоит из последовательности РСЛОС, каждый из которых, кроме начального, тактируется предыдущим. Схема получается такая:

Каскад Голлмана, источник: [6, стр 50]Каскад Голлмана, источник: [6, стр 50]

Если выходом РСЛОС-1 является 1, то тактируется РСЛОС-2. Если выходом РСЛОС-2 является 1 - тактируется РСЛОС-3 и т.д. Выход последнего РСЛОС является выходом генератора.

Каскад Голлмана показывает хорошие результаты: с ростом числа генераторов последовательность приближается к случайной. В своей книге[9] Б. Шнайер рекоемендует использовать как минимум 15 РСЛОС в каскаде.

Алгоритм А5/1

Напоследок хотелось бы разобрать один из алгоритмов, который, хоть и не является криптографически устойчивым, но интересен с той точки зрения, что он применяется для шифрования данных в сетях мобильной связи стандарта GSM. Это так называемый алгоритм А5, первый вариант которого был разработан в 1987 году и и который сейчас обозначается как А5/1, т.к. на данный момент существуют модификации А5/2 и А5/3.

Рассмотрим работу такого генератора: он сотсоит из трёх РСЛОС, длинами 19, 22 и 23 бит. Ны выход подаётся сумма по модулю два всех трёх РСЛОС. В А5 используется условный сдвиг регистров, т.е. на каждом такое регистрв не обязаны сдвигаться.

Схема алгоритма А5/1, источник: [3, стр 113]Схема алгоритма А5/1, источник: [3, стр 113]Система уравнений для генератора А5/1Система уравнений для генератора А5/1

Относительно предыдущих случаев здесь применена обратная индексация.

В рассматриваемом алгоритме регистры сдвигаются по определённому правилу: в каждом регистре есть тктовый бит, который определяет сдвиг(восьмой бит C1 для первого регистра, десятый C2, C3- для второго и третьего). На каждом такте вычисляется мажоритарное значение тактового бита m = majotiry (C1, C2, C3) , т.е. по большинству значений вычисляется 0 или 1. Если да данного регистра значение тактового бита совпадает с мажоритарным решением, то регистр сдвигается.

Заключение

Сегодня существует невероятное множество алгоритмов, генерирующих псведослучайные последовательности, которые необходимы во многих областях. В зависимости от решаемой задачи к ГПСЧ могут быть предъявлены различные требования. Для тестирования ГПСЧ на криптостойкость разработано большое количество тестов, оценивающих различные характеристки генераторов [10].

Список литературы:

  1. КнутД.Э. Искусство программирования (Том 2. Получисленные алгоритмы)

  2. nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-90Ar1.pdf

  3. ГабидулинЭ.М., КшевецкийА.С., КолыбельниковА.И. Защита информации: учебное пособие М.: МФТИ, 2019

  4. C.G. Gunter, Alternating Step Generators Contolled by de Bruijn Sequenc-es, Advances in Cryptology EUROCRYPT 87 Proceedings, Springer-Verlag, 1988

  5. Блейхут Р. Быстрые алгоритмы цифровой обработки сигналов. М.: Мир. 1989

  6. Слеповичев И.И. Генераторы псевдослучайных чисел: учебное пособие, 2017

  7. https://software.intel.com/sites/default/files/m/d/4/1/d//441IntelR_DRNGSoftwareImplementationGuidefinalAug7.pdf

  8. https://www.xilinx.com/support/documentation/application_notes/xapp052.pdf

  9. Шнайер Б. Прикладная криптография. Протоколы, алгоритмы, исходные тексты на языке Си. Триумф, 2013. 816с

  10. https://csrc.nist.gov/publications/detail/sp/800-22/rev-1a/final

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru