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

Булева логика

Как создаются S-блоки

18.12.2020 12:07:33 | Автор: admin

Шифрование с симметричным ключом используется повсеместно в современном мире - хранение и передача информации, электронная почта, даже просмотр видео на YouTube. Сильные симметричные шифры включают в себя правильно построенные S-блоки. В своей статье я разберу различные способы создания S-блоков и сравню их.

1. Что такое S-блок

S-блок - функция, принимающая на входе n бит, преобразующая их по определённому алгоритму и возвращающая на выходе m бит. S-блоки широко используются в большинстве блочных шифров. Они могут различаться по входным и выходным размерам (n и m), могут создаваться детерминировано или случайно, а также могут быть неизменными (фиксированными) или генерироваться на основе ключа. S-блоки могут быть представлены или в виде таблицы (как в DES), или в качестве алгебраической булевой функции (как в AES). Важными критериями при составлении S-блока являются его нелинейность и критерий распространения булевых функций. Для того, чтобы рассматривать S-блок как последовательность булевых функций, сначала поймём, какое вообще отношение имеют булевы функции к криптографии.

2. Булевы функции в криптографии

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

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

Стандартно секретный ключ размножается до гаммы с помощью устройств, называемых регистрами сдвига с линейной обратной связью (Linear Feedback Shift Register, сокращённо LSFR).

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

Пусть, например, длина секретного ключа равна L. Этот ключ можно разделить между несколькими регистрами длин L_i так, чтобы L_1 + L_2 + ... + L_n = L , и комбинировать выходы всех n регистров посредством булевой функции f .

Чтобы идти дальше, нужно ввести несколько терминов.

3. Немного булевой линейной алгебры

Пусть F_2 -поле Галуа порядка 2 (или просто набор \{ 0, 1\} ), а F_2^j - j -размерное векторное пространство над полем F_2 .

S-блок размерами s \times t может быть представлен в качестве отображения:

S: F_2^{s} \longrightarrow F_2^{t}

Булева функция s аргументов это отображение:

f: F_2^{s} \longrightarrow F_2

Таким образом, S-блок может быть представлен в виде последовательности булевых функций:

S(x_1, x_2, ..., x_s) = (f_1(x_1, x_2, ..., x_s), f_2(x_1, x_2, ..., x_s), ..., f_t(x_1, x_2, ..., x_s))

Пусть для булевой функции s аргументов f_i: F_2^{s} \longrightarrow F_2, i = 1, 2, ..., t целое число z - десятичное представление её аргументов (x_1, x_2, ..., x_s). Пусть y_z = f(x_1, x_2, ..., x_s) . Обозначим таблицу истинности функции f как

[y_0, y_1, ..., y_{2^{s} - 1}].

Булева функция также может быть представлена в виде алгебраической нормальной формы (полинома Жегалкина) с 2^s коэффициентами:

\displaystyle f(x) = a_o \oplus \sum_{i = 1}^{s}a_{i}x_{i} \oplus \sum_{1 \leq i < j \leq s}{}a_{ij}x_{i}x_{j} \oplus ... \oplus a_{12..s}x_{1}x_{2}...x_{s},

где \sum обозначает суммирование по модулю 2.

Булева функция s аргументов называется аффинной, если её можно представить в виде:

f(x_1, x_2, ..., x_{s}) = a_{0} \oplus a_{1}x_{1} \oplus a_{2}x_{2} \oplus ... \oplus a_{s}x_{s}, a_{i} \in F_{2}.

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

4.Нелинейные булевы функции

Булева функция f: F_2^s \longrightarrow F_2 , не являющаяся аффинной, называется нелинейной булевой функцией.

Вес Хэмминга бинарного вектора x \in F_2^s , обозначаемый как hwt(x) - это количество единиц в этом векторе. Расстояние Хэмминга между двумя булевыми функциями f, g: F_{2}^{s} \longrightarrow F_2 определяется как:

\displaystyle d(f, g) = \sum_{x \in \{ 0, 1 \}^s}f(x) \oplus g(x).

Порядок нелинейности (обозначается как ord(f) булевой функции f(x) - это максимальное количество переменных в произведении с ненулевым коэффициентом a_J , где J - подмножество множества \{1,2,...,s\} . Если J - пустое множество, этот коэффициент обозначается как a_0 и называется коэффициентом нулевого порядка. a_1, a_2, ..., a_s - коэффициенты первого порядка, a_{12}, a_{13}, ..., a_{(s-1)s} - коэффициенты второго порядка. Число всех коэффициентов АНФ - 2^s .

Обозначим число всех (нулевых и ненулевых) коэффициентов порядка i функции f как \sigma_{i}(f) . Для функции f s аргументов есть столько коэффициентов заданного порядка, сколько есть комбинаций из i элементов в s- элементном множестве,

\sigma_{i}(f) = \binom{s}i.

Расстояние от булевой функции f до множества X_s булевых функций s аргументов

\displaystyle \delta(f) = min_{g \in X_s} d(f, g).

Расстояние от функции f до множества A_s аффинных функций - это расстояние от функции f до ближайшей функции g \in A_s. Расстояние от функции f до множества всех аффинных функций называется нелинейностью функции f и обозначается как N_f,

\displaystyle N_f = min_{g \in A_{s}} d(f, g).

Известно, что \displaystyle N_f \leq min_{g \in A_{s}} d(f, g). Если s - чётное, тогда существуют функции с N_f = 2^{s - 1} - 2^{s/2 - 1} . Эти функции называются бент-функциями.

Рассмотрим бент-функции поподробнее.

5.Бент-функции

Бент-функция - булева функция с чётным числом переменным, для которой расстояние Хэмминга от множества аффинных булевых функций с тем же числом переменных максимально. Бент-функции в этом смысле обладают максимальной степенью нелинейности среди всех функций с данным числом переменных и благодаря этому широко применяются в криптографии.

Для того, чтобы рассмотреть некоторые алгоритмы генерирования бент-функций, введём ещё несколько определений.

Пусть N_0[y_0, y_1, ..., y_{{2^s} - 1}] - число нулей в таблице истинности [y_0, y_1, ..., y_{2^s - 1}] функции f , а N_1[y_0, y_1, ..., y_{2^s - 1}] - число единиц. Булева функция f называется сбалансированной, если N_0[y_0, y_1, ..., y_{2^s - 1}] = N_1[y_0, y_1, ..., y_{2^s - 1}] .

Булева функция f: F_2^{s} \longrightarrow F_2 называется идеально нелинейной тогда и только тогда, когда f(x) \oplus f(x \oplus \alpha) сбалансирована для любого \alpha \in F_2^{s} такого, что 1 \leq hwt(\alpha) \leq s . Для идеальной нелинейной булевой функции любое изменение входных данных приводит к изменению выходных данных с вероятностью \frac{1}{2} .

6. Алгоритмы генерирования бент-функций

6.1 Детерминированные алгоритмы

Пусть B_s - множество идеальных нелинейных функций s аргументов с чётным s .

Алгоритм 1.

Вход: a, b \in B_6, a \neq b .

Выход: бент-функции в множестве B_8 бент-функций 8 аргументов.

Метод: функция g: F_2^8 \longrightarrow F_2 , определённая как:

\begin{equation*} g(x_0, ..., x_7) = \begin{cases} a(x_0, ..., x_5), x_6 = 0, x_7 = 0\\ a(x_0, ..., x_5), x_6 = 0, x_7 = 1\\ b(x_0, ..., x_5), x_6 = 1, x_7 = 0\\ b(x_0, ..., x_5) \oplus 1, x_6 = 1, x_7 = 1 \end{cases} \end{equation*}

Алгоритм 2.

Вход: бент-функции s аргументов a(x) , b(x) и c(x) такие, что a(x) \oplus b(x) \oplus c(x) - бент-функция.

Выход: бент-функция g s+2 аргументов.

Метод:

g(x, x_{s + 1}, x_{s + 2}) = a(x)b(x) \oplus b(x)c(x) \oplus c(x)a(x) \oplus [a(x)b(x)]x_{s + 1} \oplus [a(x) \oplus c(x)]x_{s + 2} \oplus x_{s + 1}x_{s + 2}

Большинство известных конструкторов идеальных (или бент-) функций берут на входе идеальные нелинейные функции s аргументов и генерируют идеальные нелинейные функции s+2 аргументов. Большим недостатком этих методов является их детерминированность. Только идеальные нелинейные функции 4 и 6 аргументов выбираются случайно и результирующая функция получается по одной и той же детерминированной формуле каждый раз. Даже если есть какой-то "случайный" элемент в таком генерировании (например, добавочный линейный элемент), это не добавляет никакой новой особенности к сгенерированной функции.

Алгоритм 3.

Вход: биективное отображение \pi: F_2^{s/2} \longrightarrow F_2^{s/2} , функция g: F_2^{s/2} \longrightarrow F_2 , s - чётное.

Выход: бент-функция f_M:F_2^{s} \longrightarrow F_2 , называемая функцией Майорана.

Метод: f_M(x||y) = \pi(x) * y \oplus g(x), где x, y \in F_2^{s/2} , || - конкатенация и (a_{s/2 - 1}, a_{s/2 - 2}, ..., a_0) * (b_{s/2 - 1}, b_{s/2 - 2}, ..., b_0) = a_{s/2 - 1}b_{s/2 - 1} \oplus a_{s/2 - 2}b_{s/2 - 2} \oplus ... \oplus a_0b_0

Пусть (a_0, a_1, ..., a_7) - перестановка \{0, 1, ..., 7\} . Функция \widehat{f}(x_0, x_1, ..., x_7)= f_{M}(x_{a0}, x_{a1}, ..., x_{a7}), где f_M - функция Майорана, является бент-функцией. Я буду отсылаться к этим функциям как к функциям с переставленными входными данными.

6.2 Случайное генерирование бент-функций

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

Однако, найти все бент-функции случайным поиском по булевым функциям 6 аргументов невозможно. Здесь может пригодиться представление функции в виде полинома Жегалкина. Работа с ним позволяет контролировать нелинейные характеристики сгенерированных функций. Базовые особенности бент-функций могут быть использованы для того, чтобы существенно сузить область поиска, что делает генерирование бент-функций возможным даже на обычном ПК.

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

Количество коэффициентов степеней меньше или равных s/2 может быть зафиксировано или случайно выбрано внутри допустимого диапазона. Если количество коэффициентов для заданного порядка i зафиксировано, тогда все сгенерированные функции будут иметь такое же количество коэффициентов этого порядка, но сами коэффициенты будут разными в каждой сгенерированной функции. Если количество коэффициентов для заданного порядка i выбрано случайно, тогда все сгенерированные функции будут иметь не только разные коэффициенты, но и разное количество этих коэффициентов порядка i .

Разумеется, можно зафиксировать количество коэффициентов для некоторых порядков и использовать переменное количество коэффициентов других порядков.

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

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

Также у этого подхода есть свои ограничения. Во-первых, количество возможных функций растёт вместе с числом коэффициентов высших порядков (i > 2) и генерирование бент-функции становится невыполнимым. Поэтому алгоритм хорошо работает с небольшим количеством коэффициентов высших порядков (например, менее 6 для s = 8, i = 3, 4 ). Во-вторых, этот метод не генерирует все возможные бент-функции с равными вероятностями.

Алгоритм 4. (случайно сгенерированные бент-функции)

Вход:

  • s - число аргументов (s - чётное)

  • для каждого порядка ord такого, что 0 \leq s/2 определим минимальное cmin_{ord} и максимальное cmax_{ord} количество коэффициентов полинома Жегалкина,

0 \leq cmin_{ord} \leq cmax_{ord} \leq \binom{s}{ord}.

Выход:

  1. Повторять шаги (1.1) и (1.2) для каждого порядка ord такого, что 0 \leq ord \leq s/2 :

  • -случайно сгенерированная идеальная нелинейная функция f_{ANF} в представлении полинома Жегалкина

  • случайно сгенерированная идеальная нелинейная функция f_{TT} в форме таблицы истинности.

Метод:

  1. Повторять шаги (1.1) и (1.2) для каждого порядка ord такого, что 0 \leq ord \leq s/2 :

    • 1.1 генерировать случайное количество коэффициентов c_{ord} полинома Жегалкина для заданного порядка ord такого, что cmin_{ord} \leq c_{ord} \leq cmax_{ord} ,

      1.2 для полинома Жегалкина зафиксировать случайно значение 1 для коэффициентов порядка ord .

  2. Преобразовать f_{ANF} к f_{TT} .

  3. Вычислить расстояние от f_{TT} до множества аффинных функций.

  4. Если расстояние, вычисленное в шаге (3), равно 2^{s -1} - 2^{{s/2} - 1} , тогда f_{TT} и f_{ANF} - бент-функции, останавливаемся; иначе идём к (1).

Если s не задано, алгоритм 4 может быть использован даже для нечётного числа аргументов. Получившиеся функции не будут являться бент-функциями (т.к бент-функции не существуют для нечётного числа аргументов), поэтому шаг (4) алгоритма не выполняется - алгоритм должен выполняться в цикле, генерирующем случайные функции, многие из которых нелинейные.

7. Нелинейность S-блоков

Нелинейность S-блока - функции S: F_2^s \longrightarrow F_2^t такой, что S(x_1, x_2, ..., x_s) = (f_1(x_1, x_2, ..., x_s), f_2(x_1, x_2, ..., x_s), ..., f_t(x_1, x_2, ..., x_s)) , вычисляется как минимальная нелинейность всех линейных комбинаций функций, являющихся компонентами S . То есть,

N_S = min\{ N_{f_{J}} | f_{J} = \sum_{i \in J}, J \subseteq (1, 2, ..., t)\}.

Чтобы посчитать нелинейность одного S-блока, нужно построить 2t линейных комбинаций и посчитать их расстояния до аффинных функций. Наименьшая из посчитанных нелинейностей и будет нелинейностью S-блока.

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

График 1. Зависимость числа S-блоков, построенных из случайных булевых функций, от их нелинейности

График 2. Зависимость числа S-блоков, построенных из случайных сбалансированных булевых функций, от их нелинейности

Сравнивая графики 1 и 2, можем заметить, что сбалансированные булевы функции лучше для построения S-блоков, чем чисто случайные булевы функции, так как они создают больше S-блоков относительно высокой нелинейности (98 и 100).

График 3. Зависимость числа S-блоков, построенных из сконструированных булевых функций, от их нелинейности

Немного лучше, чем S-блоки из случайных сбалансированных булевых функций, справляются S-блоки из сконструированных бент-функций (Алгоритм 2) (см. График 3). Только при высокой нелинейности, равной 98, немного больше S-блоков строится с использованием сконструированных функций.

График 4. Зависимость числа S-блоков, построенных из случайно сгенерированных бент-функций, от их нелинейности

Другое распределение нелинейности характеризует S-блоки, построенные из случайно сгенерированных бент-функций (см. График 4). В этой группе существуют S-блоки наибольшей нелинейности 112, их около 5\% (их не видно на графике, так там наибольшее значение 104). Также здесь примерно в 20 раз больше S-блоков очень высокой нелинейности 100, чем в случае S-блоков, построенных из сконструированных бент-функций или из случайных сбалансированных функций.

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

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

8. Заключение

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

Мои источники

  1. И. Агафонова - Криптографические свойства нелинейных булевых функций

  2. Anna Grocholewska-Czurylo and Janusz Stoklosa - Random Generation of S-Boxes for Block Ciphers

  3. Meier, W., Staffelbach, O - Nonlinearity criteria for cryptographic functions

  4. Википедия - S-блок(информатика)

  5. Wikipedia - S-box

  6. Wikipedia - Bent functions

Подробнее..

Декодер для 7-сегментного индикатора

04.04.2021 00:20:12 | Автор: admin

7-сегментный индикатор

7-сегментный индикатор - один из самых популярных и простых видов отображение арабских цифр и других символов. Запатентованный еще в 1910 Фрэнком Вудом, он остается востребованным и по сей день.

Так как чаще всего в подобных индикаторах используются светодиоды, а как известно у них есть катод и анод, следовательно, и сами дисплеи делятся на 2 подтипа: с общим катодом и с общим анодом. Отличия минимальные, но иногда, есть случаи, когда есть один более приоритетный вариант.

Индикатор представляет собой набор светодиодов с объединенным либо анодом, либо катодом, в зависимости от типа. Как мы можем заметить, можно управлять каждым сегментом в отдельности.

Допустим, для примера мы возьмем дисплей с общим катодом. Давайте попробуем вывести несколько цифр на дисплей. Для начала возьмем 0; для того, чтобы вывести нам надо подключить пины 7, 6, 4, 2, 1, 9 (a, b, c, d, e, f - соответственно) к "+" питания, и не забываем про резисторы, чтобы светодиоды не перегорели; если вы используете питание 5V, то будет достаточно подключить резистор на 330Ohm от пина 3, 8 к GND. И вот, на индикаторе можно наблюдать 0. Также можно вывести 1; подключаем пины 6, 4 (b, c) к положительному контакту питания и можно видим единичку на дисплее. Остальные цифры выводятся аналогично.

Возникающие проблемы

Мы разобрались, как можно выводить различные символы на индикатор, но представим, что у нас есть какое-то электронное устройство, которое должно считать числа, и для удобства мы хотим использовать индикатор, но вот незадача, у нас осталось всего 4 свободных I/0 линии, или мы намеренно хотим это оптимизировать, чтобы не писать код на микроконтроллере для представления цифр на экране или более удобным для нас способом. Напомню, при простом подключении необходимо 8 таких линий.

Кодирование

Так как самая привычная для нас система счисления это десятичная, то будем использовать ее и цифры от 0 до 9. При желании также можно продолжить и для 16-ричной системы. Поскольку у нас все строится пока что на 5V логике, то было бы странно не использовать двоичную систему счисления. У нас есть 10 цифр, следовательно, нам нужно минимум 4 бита для представления всех возможных вариантов. Для удобства предлагаю сделать таблицу.

Decimal

0

1

2

3

4

5

6

7

8

9

Binary

0000

0001

0010

0011

0100

0101

0110

0111

1000

1001

Представим, что у нас есть 4-bit шина, по которой наше устройство передает сигнал в двоичном представлении. Теперь надо декодировать и передать его на дисплей.

Декодирование

Использование двоичной системы счисления, предпологает использование булевой логики. Поэтому будет целесообразно использовать ее. Поэтому для начала мы сделаем таблицу истинности для декодера.

Пока что мы будем использовать простую шину из 4 проводов, по каждому из которых будет передаваться сигнал. В нашем случае 5V - логическая единица, а GND - логический нуль. В таблице первый столбец только для ясности, какую цифру мы хотим отобразить. Исходя из этой таблицы нам надо создать устройство, которое при входных значениях в шине, на выходе выдавало бы 7 значений для индикатора. Для этого, мы будем использовать операции над булевыми значениями: конъюнкция (и, &), дизъюнкция (или, |), отрицание (не, ). Итак, приступим к созданию цепи логических вентилей.

Цепь для сегмента 'а'

Из таблицы истинности видно, что сегмент а должен быть включен всегда, кроме цифры 1 и 4. Для упрощения можно сделать так, чтобы логическая единица была только в этих 2 состояниях, и на выход добавить логическое НЕ. Тогда у нас всегда будет 1, кроме 2-ух состояний. Вот схема:

Я добавил дополнительную инвертированную шину для удобства и наглядности.

На выходе должен быть логический 0 при входных значениях 0 0 0 1 и 0 1 0 0 (на линиях 3, 2, 1, 0 соответственно). Поэтому я взял не инвертированную первую линию, а все остальные инвертированные, и получилось, что 0 0 0 1 трансформируется в 1' 1' 1' 1 ( ' - инвертированный сигнал), после все эти сигналы группируются в один общий, который идет в вентиль ИЛИ-НЕ, который на конце и инвертирует логическую 1 в 0, чтобы при этих входных параметрах сегмент а не был включен. То же самое проделывается для другого случая: 0 1 0 0 преобразуется в 1' 1 1' 1' и также идет в тот же вентиль ИЛИ-НЕ, как и при первом случае.

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

Улучшение

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

Для начала, взглянем на таблицу истинности. Можно заметить, что для сегмента е больше логических 0, так что для него, можно не инвертировать выход (!! - двойное отрицание, то есть ничего не меняем). Также использование одного и того же модуля для цифры 1 происходит 4 раза! А для цифры 9 можно не делать модуль вообще (количество повторений одного модуля для цифры вынесено в последнюю колонку). Это существенная трата пространства и логических вентилей. После реинжинеринга, на выходе будет примерно такая схема:

Реализация

Есть три способа воплотить данный декодер в жизнь.

  1. Из готовых микросхем логических вентилей, например серия микросхем 74HCxx. Данный способ самый простой, не самый практичный, но вполне допустимый. Также его будет просто модернизировать для n-разярдных индикаторов. И отлично подходит для тестов.

  2. Более сложный, но более "крутой" способ, создание всех логических вентилей на ТТЛ, отлично подойдут транзисторы BC546 и его комплементарная пара BC556. Этот способ потребует дополнительного создания схемы на транзисторах, для их корректной работы. Будет занимать больше пространства, но можно сделать прозрачный корпус и поставить на полочку. Ведь применение ТТЛ в наше время, дело совсем незаурядное.

  3. Промышленный способ - изготовление полноценных кремниевых интегральных схем. Этот способ не самый быстрый, но позволяет наладить массовое производство. НО стоит отметить, что уже давно выпускаются подобные микросхемы, и это будет не слишком целесообразно.

Эпилог

В конце, хотелось отметить, что данный декодер являются не плохой практической работой для тренировки создания логических схем и для понимаю как устроенные простые электронные устройства. Идейным вдохновителем для создания данного исследования стал Ben Eater.

Подробнее..

Категории

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

  • Имя: Макс
    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