1. Общие сведения
1.1 Модуль UAcoder.pm является реализацией украинского алгоритма на языке Perl.
Использована схема, состоящая из двух блоков, что является необходимым и достаточным на сегодняшний день.
Протестировать модуль можно здесь, а скачать — здесь.
1.2 Криптостойкость модуля 2.7*1025, что при скорости вычислений 1012 операций подбора в секунду обеспечивает время подбора 8.6*105 лет. Задача подбора осложняется тем, что на сегодняшний день не известен алгоритм последовательного перебора всех вариантов закрытого ключа. Если же применять перебор всех комбинаций чисел, то криптостойкость увеличивается до 3.4*1038.
1.3 Модуль может кодировать символы стандарта ANSI, куда входят все печатные символы латиницы и кириллицы, символы клавиатуры и др.,
а сама закодированная строка (ЗСТР) содержит символы в соответствии со стандартом передачи данных по протоколу HTTP.
1.4 Преимущество Алгоритма заключается в том, что секретную передачу и приём данных можно производить непосредственно по HTTP,
без применения протокола HTTPS или цифровой подписи. При этом, что немаловажно, длина строки передаваемых данных увеличивается всего на 34..40 символов. А если учитывать тот факт, что данные HTML-формы автоматически перекодируются броузером в символы стандарта ANSI с применением разделителя '%', то при больших размерах данных получаем даже экономию, потому что в ЗСТР разделители не используются.
1.5 Ещё одним важным преимуществом модуля является то, что ЗСТР не повторяется даже при одинаковых входных данных (ВД).
Это не позволяет определить ЗКЛ путём простого перебора даже, если известны ВД.
Данное преимущество даёт возможность использовать ЗСТР вместо цифровой подписи, и делать ЗСТР открытой
(например, применять ЗСТР в полях формы, и передавать эти поля как методом POST, так и методом GET). А если вести журнал входящих ЗСТР, то при двух одинаковых ЗСТР вторую из них можно считать ошибочной, что обеспечит максимальную защиту данных. При этом для журнала достаточно вести записи первых 12..15 символов ЗСТР.
Этот пункт очень важен, например, для хранения паролей в БД.
Известна следующая проблема: при извлечении паролей из их хешей — 60-70% подбирается сразу с помощью специальных таблиц.
Проблема состоит в том, что для двух одинаковых паролей в БД будут храниться два одинаковых хеша.
Шифрование паролей с помощью ЗСТР проблему решает: для двух одинаковых паролей в БД вместо хеша будут хранится две совершенно разные ЗСТР.
2. Особенности модуля
2.1 Особенностью модуля по сравнению с алгоритмом является то, что перед шифрованием ВД преобразуются в шестнадцатеричный формат по стандарту ANSI (рис.1). При дешифровании применяется обратное ANSI-преобразование (рис.2). Таким образом данные перед шифрованием и после дешифрования эквивалентны.
2.2 Для алгебраического преобразования [1] в модуле применены известные алгоритмы криптозащиты MD5, SHA1 (на выбор пользователя), а для алгоритма перестановки [2] используется закрытый ключ (ЗКЛ) [8], состоящий из 32 шестнадцатеричных чисел.
3. Работа шифратора модуля UAcoder
3.1 ВД поступают в модуль в виде одного или нескольких полей. Поле — это строка данных. Все поля объединяются в одну Строку и преобразовываются в шестнадцатеричный формат по стандарту ANSI (рис.1). Информация о количестве таких полей и длине каждого из них добавляется в начале Строки в виде: [M]a[L0]a[L1]...a, где [M] — количество полей, Li — длина строки i-того поля. Например, для двух полей с длинами строк соответственно 12 и 23, информация, добавляемая в Строку будет такой: 2a12a23a
3.2 Далее Строка подвергается обработке по украинскому алгоритму. Особенностью является то, что в качестве ОКЛ' используются данные, полученные на выходе известного алгоритма криптозащиты MD5 или SHA1 (выбор осуществляет пользователь модуля). В качестве входных данных для этого алгоритма выступают три величины: ЗКЛ, ОКЛ и j.
j=(iстр-(iстр)mod(Lзкл))/Lзкл, где: iстр — номер Строки над которым в данный момент производится алгебраическое преобразование [1], Lзкл — длина ЗКЛ. Lзкл для MD5 равна 32, а для SHA1 — 40. Например: iстр=12 Lзкл=32 => j=0, или: iстр=37 Lзкл=32 => j=1.
Пример входных и получившихся выходных данных алгоритма MD5:
$Okey = md5_hex('0123456712345678', 'e52fafa894ed12b', 0)
$Okey = 52c0a131e6cead39f49101591d3b24a2 — это и есть ОКЛ', который поэлементно суммируется со Строкой [1]. Если Строка оказывается длиннее ОКЛ', то $Okey получаем заново, устанавливая j=1, и т.д.
3.3 ОКЛ генерируется каждый раз разный. Он состоит из случайных пятнадцати шестнадцатеричных чисел. Например: e52fafa894ed12b
3.4 Далее Строка обрабатывается алгоритмом без особенностей: делается перестановка и подстановка ОКЛ на места дыр. Далее полученная Строка подаётся на блок 2 (рис.1), который работает аналогично. На его выходе получаем ЗСТР, которую и можем передавать по каналам связи.

Рис.1
4. Работа дешифратора модуля UAcoder
4.1 ЗСТР поступает на вход модуля (рис. 2), и далее с ней происходят преобразования согласно украинскому алгоритму. Особенностью является получение ОКЛ'. Он получается точно также, как в п3.2.
4.2 На выходе, после обработки в двух блоках, получаем Строку, которую нужно опять разбить на поля (п3.1). Для этого используем информацию в начале Строки и разбиваем Строку на поля. Поля подвергаются обратному ANSI-преобразованию. Таким образом, получаем поля, порядок следования которых, и содержимое, эквивалентны полям до шифрования (п3.1).

Рис.2
Описание алгоритма |
Скачать модуль |
Тестирование алгоритма и модуля
5. Практические примеры применения модуля: шифрование
Для нормальной работы модуля UAcoder необходимо, чтобы был предустановлен любой из модулей: Digest::MD5 или Digest::SHA1. В зависимости от этого нужно создать объект по примеру 1, или примеру 2.
Пример №1 с MD5
use UAcoder;
my $ctx = new UAcoder();
$ctx->pass('8dfd16d3fdf4156d0123456712345678'); #пароль (п.7)
$ctx->field('Мой возраст=34'); #поле №1
$ctx->field('Это просто текст!'); #поле №2
my $L = $ctx->coding;
$L - это полученная ЗСТР, которую мы и передаём по каналам связи, например по HTTP в таком виде: http://mysite.com/m.cgi?$L
Пример №2 с SHA1
use UAcoder;
my $ctx = new UAcoder('SHA1');
$ctx->pass('8dfd16d3fdf4156d0123456712345678'); #пароль (п.7)
$ctx->field('Мой возраст=34'); #поле №1
$ctx->field('Это просто текст!'); #поле №2
my $L = $ctx->coding;
Пример №3 с заданием полей через встроенный объект $Q=new CGI
* объект $Q=new CGI создавать не нужно!
use UAcoder;
my $ctx = new UAcoder();
$ctx->pass('8dfd16d3fdf4156d0123456712345678'); #пароль (п.7)
$Q->param('Мой возраст'=>34); #поле №1
$Q->param('Это просто текст!'=>''); #поле №2
my $L = $ctx->coding;
* здесь мы задаём поля с помощью обычной подпрограммы param() модуля CGI, но
с обязательным условием этого модуля — наличием у поля значения (хотя-бы пустого)
* если имя поля может содержать символ '=',
то лучше пользоваться встроенными функциями, без объектов $Q и $A (примеры 1,2,4,6)
6. Практические примеры применения модуля: дешифрование
Получение полей возможно двумя способами: через объект: new UAcoder(), либо через встроенный в модуль объект $Q=new CGI.
В первом случае (пример №4) поля возвращаются такими, и в том же порядке, как они были перед шифрованием (например, пример №1).
Во втором случае (пример №5) поля возвращаются с помощью привычной подпрограммы модуля CGI — param() в виде: имя-значение.
Пример №4
use UAcoder;
my $ctx = new UAcoder();
$ctx->pass('8dfd16d3fdf4156d0123456712345678');
$ctx->line($L); # $L — это ЗСТР, которую мы должны дешифровать
my $D = $ctx->decoding;
при этом поля можно получить так:
my $field_1 = $D->[0]; #поле №1
my $field_2 = $D->[1]; #поле №2
$field_1 будет содержать 'Мой возраст=34'
$field_2 будет содержать 'Это просто текст!'
а в случае, если поля нужно получить в массиве @field:
my @field;
for( @{$D} ){ push(@field, $_) }
теперь в массиве @field поля будут хранится в виде:
for( @field ){ print "$_
" }
Мой возраст=34
Это просто текст!
Пример №5 (со встроенным объектом $A=new CGI)
* объект $A=new CGI создавать не нужно!
use UAcoder;
my $ctx = new UAcoder();
$ctx->pass('8dfd16d3fdf4156d0123456712345678');
$ctx->line($L);
$ctx->decoding;
при этом поля можно получить так:
my %field;
for( $A->param ){ $field{$_} = $A->param($_) }
теперь в хеше %field поля будут хранится в виде ключ-значение:
for( keys %field ){ print "$_ - $field{$_}
" }
Мой возраст - 34
Это просто текст! -
Или получить напрямую, без хеша:
$vozrast= $A->param('Мой возраст'); # $vozrast будет содержать число '34'
Примечание. Можно применять множественные значения для одного имени.
Для передачи: $Q->param(-name=>'Results', -values=>[2,4,5,12]);
Для приёма: @Results= $A->param('Results');
Пример №6 В нём показан вариант приёма ЗСТР по умолчанию. При этом ЗСТР должна быть передана одним из способов:
http://mysite.com/m.cgi?$L или http://mysite.com/m.cgi?Q=$L&Datas
где: $L — ЗСТР, Datas — другие поля.
Метод передачи может быть как POST, так и GET. В этом случае $L берётся из переменных окружения по умолчанию.
use UAcoder;
my $ctx = new UAcoder();
$ctx->pass('8dfd16d3fdf4156d0123456712345678');
$ctx->line(); # здесь не указывается ЗСТР
my $D = $ctx->decoding;
далее, как обычно...
7. Практические примеры применения модуля: получение ЗКЛ
В этом модуле ЗКЛ состоит из двух частей: ЗКЛ1 и ЗКЛ2, каждый для своего блока. Такой объединённый ЗКЛ называем далее паролем. Пароль содержит в себе 32 символа, и генерируется пользователю один раз. После чего пользователь прописывает его на передающей и приёмной стороне. Получение пароля:
use UAcoder;
my $pass = genPASS; #пароль
Горчилин Вячеслав, 2004 г.
* Перепечатка статьи и применение модуля возможны с условием ссылки на сайт и соблюдением авторских прав