1. Общий подход
Алгоритм основан на методе преобразования входных данных (ВД) по открытому ключу (ОКЛ),
и методе перестановке полученных в результате преобразования данных по закрытому ключу (ЗКЛ).
ОКЛ передаётся вместе с полученной из ВД закодированной строкой (ЗСTP), а его расположение в ЗСТР вычисляется по алгоритму с ЗКЛ.
Последний известен только передающей и принимающей стороне. Получение ВД из ЗСТР происходит в обратном порядке.
Алгоритм может состоять из одного, или нескольких блоков, в каждом из которых действуют свои открытые и закрытые ключи. Включение нескольких последовательно включённых блоков повышает криптостойкость. На рис.1 показано два блока, но далее будет описан алгоритм работы одного из них. Другие работают точно также.
Алгоритм достаточно просто реализуется на любой платформе. Платформа должна поддерживать работу с десятичными и шестнадцатеричными числами (суммирование, вычитание и преобразование одного формата в другой), и иметь возможность работы с подстрокой. Платформенное ограничение определяется только размером ВД.
2. Описание алгоритма шифрования данных
2.1 Над ВД производится алгебраическое преобразование по алгоритму [1]. Это может быть простое суммирование с ОКЛ', причём ОКЛ' в общем случае может быть функцией от ОКЛ, ЗКЛ и других данных. Делать сложные преобразования в этой части алгоритма не имеет смысла, а задачей является маскировать ВД. Полученные данные будем называть Строкой.
2.2 Далее Строка преобразовывается методом перестановки с образованием так называемых "дыр". Дыры представляют собой места в полученной в после перестановки Строке, которые имеют свой порядковый номер, но пока не имеют значения. Порядок перестановки и образования дыр определяет ЗКЛ [2].
2.3 В дыры, полученные в п2.2, подставляется ОКЛ по алгоритму [3]. Места дыр определяет ЗКЛ. Таким образом ЗСТР содержит в себе преобразованные ВД и ОКЛ.

Рис.1
3. Описание алгоритма дешифрования данных
На рис.2 показана схема дешифрования данных. Схема состоит из двух последовательно включённых блоков, но далее будет описан алгоритм работы одного из них. Другие работают точно также.
3.1 Из ЗСТР с помощью ЗКЛ извлекается неизвестный пока ОКЛ по алгоритму [4].
3.2 ЗСТР преобразовывается методом перестановки по алгоритму [5]. Полученные данные далее будем называть Строкой.
3.3 Над Строкой производится алгебраическое преобразование по алгоритму [6]. В результате получаем ВД. ВД на входе (рис.1 Блок1) и ВД на выходе (рис.2 Блок1) эквивалентны.

Рис.2
4. Генерирование ЗКЛ
ЗКЛ не может быть любой комбинацией символов или чисел, его нужно генерировать по специальному алгоритму [8].
Причём для каждого блока (двухблочный пример на рис.1) он должен быть уникальным. Генерирование производится один раз, после чего ЗКЛ выдаётся передающей и принимающей стороне, и должен быть известен только им.
Реализация алгоритма — модуль UAcoder | Тестирование алгоритма и модуля
[1] Алгебраическое преобразование подразумевает любые алгебраические действия над данными:f(ВД,ОКЛ') — алгебраическая функция от ВД и ОКЛ', при этом в общем случае: ОКЛ'=f(ОКЛ,ЗКЛ,...);

Рис.3
[2] Эта часть Алгоритма является ключевой и предполагает перестановку Строки в зависимости от ЗКЛ. В результате перестановки получается новая Строка, и образуются так называемые "дыры", в которые затем подставляется ОКЛ. Введём определение: ВСТР — Строка до перестановки, ПСТР — Строка после перестановки, i — номер элемента в ВСТР, j — номер элемента в ПСТР, k — номер элемента в ЗКЛ.
Элементом строки будем называть значение одного символа строки, имеющего порядковый в ней номер. Все номера начинаем с нуля.
Алгоритм перестановки следующий. Производится последовательный поэлементный перебор ВСТР и ЗКЛ. При этом k=i до того момента, пока k меньше длины ЗКЛ. Далее k=(i)mod(L), где L — длина ЗКЛ, т.е. попросту говоря счёт k начинаем с нуля каждый раз, когда k достигает L. Переставляем i-тый элемент ВСТР в j-тый элемент ПСТР по правилу: j=i+Zk, где Zk — значение k-того элемента ЗКЛ. После перестановки всей ВСТР мы получаем ПСТР длиной, большей чем ВСТР на длину ЗКЛ минус единицу. Это означает, что ПСТР имеет "дыры" — т.е. места без значений.
[3] Алгоритм подстановки ОКЛ в дыры такой. В первую по счёту слева направо дыру подставляется первый элемент ОКЛ, во вторую второй, и т.д. до тех пор, пока все дыры не будут заполнены. Номера дыр ищутся по алгоритму [7]. В примере из [2] (рис.4) это будет выглядеть как: -BACDFEGH-- => 5BACDFEGHD0, где ОКЛ равен 5D0.
[4] Алгоритм извлечения ОКЛ из ЗСТР такой. Находим номера дыр по алгоритму [7], далее называемые НД.
Извлекаем значение из первого НД, и подставляем его на место первого элемента ОКЛ. На место второго элемента ОКЛ подставляем значение второго НД, и т.д., пока не получим все элементы ОКЛ. Т.е. это алгоритм, обратный алгоритму [3].
[5] Этот алгоритм перестановки — обратный алгоритму [2], только в данном случае ВСТР — известная Строка на входе, а ПСТР — пока неизвестная Строка на выходе алгоритма. Создаём ПСТР из нулей (или любых других значений) длиной, равной длине ВСТР минус количество дыр. Производим последовательный поэлементный перебор ВСТР и ЗКЛ. При этом k=i до того момента, пока k меньше длины ЗКЛ, а далее k=(i)mod(L). Подставляем вместо i-того элемента ВСТР j-тый элемент ПСТР по правилу: i=j-Zk, где Zk — значение k-того элемента ЗКЛ. Таким образом на выходе алгоритма получаем ПСТР длиной, меньшей, чем длина ВСТР на количество дыр.
[6] Алгоритм алгебраического преобразования должен быть обратным для алгоритма [1].
Рис.4
f(СТ,ОКЛ') — такая алгебраическая функция от СТ и ОКЛ, что СТ=f(ВД,ОКЛ'), при этом в общем случае: ОКЛ'=f(ОКЛ,ЗКЛ,...); такой же, как в [1].

Рис.5
[7] Алгоритм нахождения номеров дыр в строке сводится к проверке свободных мест в первых и последних N-1 номерах строки. N — основание системы счисления ОКЛ (например, для шестнадцатеричной системы счисления — это 16). В примере из [2] (рис.4) это будут места: 0,9,10.
Горчилин Вячеслав, 2004 г.
* Перепечатка статьи и применение модуля возможны с условием ссылки на сайт и соблюдением авторских прав