From da5d928fb3d823df13c86352615b99c598341b11 Mon Sep 17 00:00:00 2001 From: ShGulnaz Date: Tue, 18 Jun 2024 15:20:07 +0300 Subject: [PATCH 1/3] translate cryptography to ru --- src/algorithms/cryptography/hill-cipher/README.ru-RU.md | 0 src/algorithms/cryptography/polynomial-hash/README.ru-RU.md | 0 src/algorithms/cryptography/rail-fence-cipher/README.md | 4 ++-- src/algorithms/cryptography/rail-fence-cipher/README.ru-RU.md | 0 src/algorithms/graph/bellman-ford/README.ru-RU.md | 0 5 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 src/algorithms/cryptography/hill-cipher/README.ru-RU.md create mode 100644 src/algorithms/cryptography/polynomial-hash/README.ru-RU.md create mode 100644 src/algorithms/cryptography/rail-fence-cipher/README.ru-RU.md create mode 100644 src/algorithms/graph/bellman-ford/README.ru-RU.md diff --git a/src/algorithms/cryptography/hill-cipher/README.ru-RU.md b/src/algorithms/cryptography/hill-cipher/README.ru-RU.md new file mode 100644 index 00000000..e69de29b diff --git a/src/algorithms/cryptography/polynomial-hash/README.ru-RU.md b/src/algorithms/cryptography/polynomial-hash/README.ru-RU.md new file mode 100644 index 00000000..e69de29b diff --git a/src/algorithms/cryptography/rail-fence-cipher/README.md b/src/algorithms/cryptography/rail-fence-cipher/README.md index d01395f5..de5575bb 100644 --- a/src/algorithms/cryptography/rail-fence-cipher/README.md +++ b/src/algorithms/cryptography/rail-fence-cipher/README.md @@ -24,5 +24,5 @@ It's time to start populating the next rail once the number of visited fence pos ## References -- [Rail Fence Cipher on Wikipedia](https://en.wikipedia.org/wiki/Rail_fence_cipher) -- [Rail Fence Cipher Calculator](https://crypto.interactive-maths.com/rail-fence-cipher.html) +- [Шифр ограждения рельсов в Википедии](https://en.wikipedia.org/wiki/Rail_fence_cipher) +- [Калькулятор шифа ограждения рельсов](https://crypto.interactive-maths.com/rail-fence-cipher.html) diff --git a/src/algorithms/cryptography/rail-fence-cipher/README.ru-RU.md b/src/algorithms/cryptography/rail-fence-cipher/README.ru-RU.md new file mode 100644 index 00000000..e69de29b diff --git a/src/algorithms/graph/bellman-ford/README.ru-RU.md b/src/algorithms/graph/bellman-ford/README.ru-RU.md new file mode 100644 index 00000000..e69de29b From 7fed9625e0c8059c104de11ab4817f4e4e37f3c0 Mon Sep 17 00:00:00 2001 From: ShGulnaz Date: Tue, 18 Jun 2024 15:24:15 +0300 Subject: [PATCH 2/3] translate cryptography to ru --- .../cryptography/hill-cipher/README.ru-RU.md | 96 ++++++++++++++++++ .../polynomial-hash/README.ru-RU.md | 97 +++++++++++++++++++ .../rail-fence-cipher/README.ru-RU.md | 28 ++++++ .../graph/bellman-ford/README.ru-RU.md | 16 +++ 4 files changed, 237 insertions(+) diff --git a/src/algorithms/cryptography/hill-cipher/README.ru-RU.md b/src/algorithms/cryptography/hill-cipher/README.ru-RU.md index e69de29b..4a90881d 100644 --- a/src/algorithms/cryptography/hill-cipher/README.ru-RU.md +++ b/src/algorithms/cryptography/hill-cipher/README.ru-RU.md @@ -0,0 +1,96 @@ +# Шифр Хилла + +**Шифр Хилла** - это [полиграфическая замена](https://en.wikipedia.org/wiki/Polygraphic_substitution) шифр, основанный на линейной алгебре. + +Каждая буква представлена числом [по модулю](https://en.wikipedia.org/wiki/Modular_arithmetic) `26`. Хотя это не является существенной особенностью шифра, эта простая схема часто используется: + +| **Буква** | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | +| ------ | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| **Число** | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | + +## Шифрование + +Чтобы зашифровать сообщение, каждый блок из `n` букв (рассматриваемый как вектор, состоящий из `n` компонентов) умножается на обратимую матрицу `n × n` по модулю `26`. + +Матрица, используемая для шифрования, называется _ключом шифра_, и она должна быть выбрана случайным образом из набора обратимых матриц `n × n` (по модулю `26`). Шифр, конечно, может быть адаптирован к алфавиту с любым количеством букв; все арифметические действия просто должны выполняться по модулю количества букв, а не по модулю `26`. + +Рассмотрим сообщение `ACT` и приведенный ниже ключ (или `GYB/NQK/URP` буквами): + +``` +| 6 24 1 | +| 13 16 10 | +| 20 17 15 | +``` + +Поскольку `A` равно `0`, `C` равно `2`, а `T` равно `19`, сообщение является вектором: + +``` +| 0 | +| 2 | +| 19 | +``` + +Таким образом, зашифрованный вектор задается формулой: + +``` +| 6 24 1 | | 0 | | 67 | | 15 | +| 13 16 10 | | 2 | = | 222 | ≡ | 14 | (mod 26) +| 20 17 15 | | 19 | | 319 | | 7 | +``` + +что соответствует зашифрованному тексту `POH`. + +Теперь предположим, что наше сообщение вместо этого `CAT` (обратите внимание, что здесь мы используем те же буквы, что и в `ACT`), или: + +``` +| 2 | +| 0 | +| 19 | +``` + +На этот раз зашифрованный вектор задается формулой: + +``` +| 6 24 1 | | 2 | | 31 | | 5 | +| 13 16 10 | | 0 | = | 216 | ≡ | 8 | (mod 26) +| 20 17 15 | | 19 | | 325 | | 13 | +``` + +который соответствует зашифрованному тексту `FIN`. Каждая буква была изменена. + +## Расшифровка + +Для расшифровки сообщения каждый блок умножается на величину, обратную матрице, используемой для шифрования. Мы преобразуем зашифрованный текст обратно в вектор, а затем просто умножаем на обратную матрицу ключевой матрицы (`IFK/VIV/VMI` буквами). (Смотрите [обращение матрицы](https://en.wikipedia.org/wiki/Matrix_inversion) о методах вычисления обратной матрицы.) Мы находим, что по модулю 26 обратная матрица, используемая в предыдущем примере, равна: + +``` + -1 +| 6 24 1 | | 8 5 10 | +| 13 16 10 | (mod 26) ≡ | 21 8 21 | +| 20 17 15 | | 21 12 8 | +``` + +Взяв предыдущий пример зашифрованного текста `POH`, мы получаем: + +``` +| 8 5 10 | | 15 | | 260 | | 0 | +| 21 8 21 | | 14 | = | 574 | ≡ | 2 | (mod 26) +| 21 12 8 | | 7 | | 539 | | 19 | +``` + +что возвращает нас к `ACT`, как и ожидалось. + +## Определение матрицы шифрования + +При выборе матрицы шифрования возникают две сложности: + +1. Не все матрицы имеют обратное значение. Матрица будет иметь обратное значение тогда и только тогда, когда ее [определитель](https://en.wikipedia.org/wiki/Determinant) не равен нулю. +2. Определитель шифрующей матрицы не должен иметь каких-либо общих множителей с модульной базой. + +Таким образом, если мы работаем по модулю `26`, как указано выше, определитель должен быть отличным от нуля и не должен делиться на `2` или `13`. Если определитель равен `0` или имеет общие множители с модульной базой, то матрица не может быть использована в шифре Хилла, и необходимо выбрать другую матрицу (в противном случае ее невозможно будет расшифровать). К счастью, матрицы, которые удовлетворяют условиям, используемым в шифре Хилла, довольно распространены. + +## Ссылки + +- [Шифр Хилла в Википедии](https://en.wikipedia.org/wiki/Hill_cipher) +- [Инверсия матрицы на MathIsFun](https://www.mathsisfun.com/algebra/matrix-inverse.html) +- [GeeksForGeeks](https://www.geeksforgeeks.org/hill-cipher/) + diff --git a/src/algorithms/cryptography/polynomial-hash/README.ru-RU.md b/src/algorithms/cryptography/polynomial-hash/README.ru-RU.md index e69de29b..6052885b 100644 --- a/src/algorithms/cryptography/polynomial-hash/README.ru-RU.md +++ b/src/algorithms/cryptography/polynomial-hash/README.ru-RU.md @@ -0,0 +1,97 @@ +# Полиномиальный скользящий хэш + +## Хэш-функция + +**Хэш-функции** используются для сопоставления больших наборов данных, состоящих из элементов произвольной длины (*ключей*), с меньшими наборами данных, состоящими из элементов фиксированной длины (*хэш-суммой*). + +Основным применением хеширования является эффективная проверка равенства ключей путем +сравнения их хеш-суммой. + +*Коллизия* возникает, когда два разных ключа имеют одинаковый отпечаток. Способ обработки коллизий имеет решающее значение в большинстве приложений хэширования. +Хеширование особенно полезно при построении эффективных практических алгоритмов. + +## Скользящий хеш + +**Скользящий хэш** (также известный как рекурсивное хэширование или скользящая контрольная сумма) - это хэш +-функция, при которой входные данные хэшируются в окне, которое перемещается по входным данным. + +Несколько хеш—функций позволяют очень быстро вычислять переходящий хеш-код - новое значение хеш-кода быстро вычисляется, учитывая только следующие данные: + +- старое значение хеш-кода, +- старое значение, удаленное из окна, +- и новое значение, добавленное в окно. + +## Полиномиальное хеширование строк + +Идеальная хэш-функция для строк, очевидно, должна зависеть как от "мультимножества" символов, присутствующих в ключе, так и от "порядка" символов. Наиболее распространенное семейство таких хэш-функций обрабатывает символы строки как коэффициенты *многочлена* с целочисленной переменной `p` и вычисляет ее значение по модулю целой константы `M`: + +*Алгоритм поиска строк Рабина–Карпа* часто объясняется с помощью очень простой скользящей хэш-функции, которая использует только умножение и сложение - **полиномиальный скользящий хэш**: + +> H(s0, s1, ..., sk) = s0 * pk-1 + s1 * pk-2 + ... + sk * p0 + +где `p` - константа, а *(s1, ... , sk)* - входные +символы. + +Например, мы можем преобразовать короткие строки в ключевые числа, умножив цифровые коды на степени константы. Трехбуквенное слово `ace` можно преобразовать в число, вычислив: + +> ключ = 1 * 262 + 3 * 261 + 5 * 260 + +Чтобы избежать манипулирования огромными значениями `H`, вся математика выполняется по модулю `M`. + +> H(s0, s1, ..., sk) = (s0 * pk-1 + s1 * pk-2 + ... + sk * p0) mod M + +Тщательный выбор параметров `M`, `p` важен для получения “хороших” свойств хэш-функции, т.е. низкой частоты коллизий. + +Желательным свойством этого подхода является использование всех символов во входной строке. Вычисленное значение ключа затем может быть хэшировано в индекс массива +обычным способом: + +```javascript +function hash(key, arraySize) { + const base = 13; + + let hash = 0; + for (let charIndex = 0; charIndex < key.length; charIndex += 1) { + const charCode = key.charCodeAt(charIndex); + hash += charCode * (base ** (key.length - charIndex - 1)); + } + + return hash % arraySize; +} +``` + +Метод `hash()` не так эффективен, как мог бы быть. Помимо преобразования символов, в цикле есть два умножения и сложение. Мы можем исключить одно умножение, используя *метод Хорнера*: + +> a4 * x4 + a3 * x3 + a2 * x2 + a1 * x1 + a0 = (((a4 * x + a3) * x + a2) * x + a1) * x + a0 + +Другими словами: + +> Hi = (P * Hi-1 + Si) mod M + +Функция `hash()` не может обрабатывать длинные строки, поскольку значение hashVal превышает размер int. Обратите внимание, что размер ключа всегда оказывается меньше размера массива. +В методе Хорнера мы можем применять оператор по модулю (%) на каждом шаге вычисления. Это дает тот же результат, что и однократное применение оператора по модулю в +конце, но позволяет избежать переполнения. + +```javascript +function hash(key, arraySize) { + const base = 13; + + let hash = 0; + for (let charIndex = 0; charIndex < key.length; charIndex += 1) { + const charCode = key.charCodeAt(charIndex); + hash = (hash * base + charCode) % arraySize; + } + + return hash; +} +``` + +Полиномиальное хеширование обладает свойством плавного перехода: хэш-сумма может эффективно обновляться при добавлении или удалении символов в концах строки +(при условии, что сохранен массив степеней p по модулю M достаточной длины). +Популярный алгоритм сопоставления Рабина–Карпа основан на этом свойстве + +## Ссылки + +- [Где использовать полиномиальное хеширование строк](https://www.mii.lt/olympiads_in_informatics/pdf/INFOL119.pdf) +- [Хеширование на uTexas](https://www.cs.utexas.edu/~mitra/csSpring2017/cs313/lectures/hash.html) +- [Хэш-функция в Википедии](https://en.wikipedia.org/wiki/Hash_function) +- [Скользящий хэш в Википедии](https://en.wikipedia.org/wiki/Rolling_hash) diff --git a/src/algorithms/cryptography/rail-fence-cipher/README.ru-RU.md b/src/algorithms/cryptography/rail-fence-cipher/README.ru-RU.md index e69de29b..1eff03c5 100644 --- a/src/algorithms/cryptography/rail-fence-cipher/README.ru-RU.md +++ b/src/algorithms/cryptography/rail-fence-cipher/README.ru-RU.md @@ -0,0 +1,28 @@ +# Шифр ограждения рельсов + +**Шифр ограждения рельсов** (также называемый зигзагообразным шифром) - это [транспозиционный шифр](https://en.wikipedia.org/wiki/Transposition_cipher), в котором сообщение разбивается на несколько рельсов для кодирования. Ограждение заполняется символами сообщения, начиная с верхнего левого угла и добавляя по символу в каждую позицию, пересекая их по диагонали до самого низа. Дойдя до последней рельсы, поверните по диагонали и зигзагообразными движениями направьте надпись вверх до самой первой рельсы. Повторяйте, пока надпись полностью не расположится поперек ограждения. Закодированное сообщение является результатом объединения текста на каждом рельсе сверху вниз. + +Из [Википедии](https://en.wikipedia.org/wiki/Rail_fence_cipher) вот как выглядит сообщение `WE ARE DISCOVERED. FLEE AT ONCE` на ограждении из `3` рельсов: + +``` +W . . . E . . . C . . . R . . . L . . . T . . . E +. E . R . D . S . O . E . E . F . E . A . O . C . +. . A . . . I . . . V . . . D . . . E . . . N . . +------------------------------------------------- + WECRLTEERDSOEEFEAOCAIVDEN +``` + +Затем сообщение может быть расшифровано путем повторного создания закодированного ограждения с той же схемой обхода, за исключением того, что символы следует добавлять только к одному рельсу за раз. Чтобы проиллюстрировать это, можно добавить прочерк на рельсах, которые еще не должны быть заполнены. Вот как будет выглядеть забор после заполнения первого ограждения, черточки обозначают позиции, которые были посещены, но не заполнены. + +``` +W . . . E . . . C . . . R . . . L . . . T . . . E +. - . - . - . - . - . - . - . - . - . - . - . - . +. . - . . . - . . . - . . . - . . . - . . . - . . +``` + +Как только количество посещенных позиций ограждения сравняется с количеством символов в сообщении, можно приступать к заполнению следующего рельса. + +## Ссылки + +- [Шифр ограждения рельсов в Википедии](https://en.wikipedia.org/wiki/Rail_fence_cipher) +- [Калькулятор шифа ограждения рельсов](https://crypto.interactive-maths.com/rail-fence-cipher.html) diff --git a/src/algorithms/graph/bellman-ford/README.ru-RU.md b/src/algorithms/graph/bellman-ford/README.ru-RU.md index e69de29b..01f32f5a 100644 --- a/src/algorithms/graph/bellman-ford/README.ru-RU.md +++ b/src/algorithms/graph/bellman-ford/README.ru-RU.md @@ -0,0 +1,16 @@ +# Алгоритм Беллмана–Форда + +Алгоритм Беллмана–Форда - это алгоритм, который вычисляет кратчайшие пути от одной исходной вершины ко всем остальным вершинам взвешенного орграфа. Он медленнее алгоритма Дейкстры для решения той же задачи, но более универсален, поскольку способен обрабатывать графики, в которых некоторые веса ребер являются отрицательными числами. + +![Bellman-Ford](https://upload.wikimedia.org/wikipedia/commons/2/2e/Shortest_path_Dijkstra_vs_BellmanFord.gif) + +## Сложность + +Наихудшая производительность `O(|V||E|)` +Наилучшая производительность `O(|E|)` +Наихудшое использование памяти `O(|V|)` + +## Ссылки + +- [Википедия](https://en.wikipedia.org/wiki/Bellman%E2%80%93Ford_algorithm) +- [Michael Sambol на YouTube](https://www.youtube.com/watch?v=obWXjtg0L64&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) From 13d2020d690eebab580abbf4601cb1129fe32acc Mon Sep 17 00:00:00 2001 From: ShGulnaz Date: Tue, 18 Jun 2024 15:28:34 +0300 Subject: [PATCH 3/3] translate cryptography to ru --- src/algorithms/cryptography/rail-fence-cipher/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/algorithms/cryptography/rail-fence-cipher/README.md b/src/algorithms/cryptography/rail-fence-cipher/README.md index de5575bb..d01395f5 100644 --- a/src/algorithms/cryptography/rail-fence-cipher/README.md +++ b/src/algorithms/cryptography/rail-fence-cipher/README.md @@ -24,5 +24,5 @@ It's time to start populating the next rail once the number of visited fence pos ## References -- [Шифр ограждения рельсов в Википедии](https://en.wikipedia.org/wiki/Rail_fence_cipher) -- [Калькулятор шифа ограждения рельсов](https://crypto.interactive-maths.com/rail-fence-cipher.html) +- [Rail Fence Cipher on Wikipedia](https://en.wikipedia.org/wiki/Rail_fence_cipher) +- [Rail Fence Cipher Calculator](https://crypto.interactive-maths.com/rail-fence-cipher.html)