Научная статья DOI: 10.18287/2541-7525-2020-26-3-17-29
УДК 519.725 Дата: поступления статьи: 13.03.2020
после рецензирования: 27.03.2020 принятия статьи: 25.05.2020
С.М. Рацеев
Ульяновский государственный университет, г. Ульяновск, Российская Федерация E-mail: [email protected]. ORCID: https://orcid.org/0000-0003-4995-9418
О.И. Череватенко Ульяновский государственный педагогический университет имени И.Н. Ульянова, г. Ульяновск, Российская Федерация E-mail: [email protected]. ORCID: https://orcid.org/0000-0003-3931-9425
ОБ АЛГОРИТМАХ ДЕКОДИРОВАНИЯ ОБОБЩЕННЫХ КОДОВ РИДА — СОЛОМОНА НА СЛУЧАЙ ОШИБОК И СТИРАНИЙ
АННОТАЦИЯ
В статье приводятся алгоритмы декодирования обобщенных кодов Рида — Соломона на случай ошибок и стираний. Данные алгоритмы строятся на основе алгоритма Гао, алгоритма Сугиямы, алгоритма Берлекэмпа-Месси (алгоритма Питерсона — Горенстейна — Цирлера). Первый из данных алгоритмов относится к алгоритмам бессиндромного декодирования, остальные — к алгоритмам синдромного декодирования. Актуальность данных алгоритмов состоит в том, что они применимы для декодирования кодов Гоппы, которые лежат в основе некоторых перспективных постквантовых криптосистем. При этом данные алгоритмы применимы для кодов Гоппы над произвольным полем, в отличие от хорошо известного алгоритма декодирования Паттерсона для двоичных кодов Гоппы.
Ключевые слова: помехоустойчивые коды, коды Рида — Соломона, коды Гоппы, декодирование кода.
Цитирование. Рацеев С.М., Череватенко О.И. Об алгоритмах декодирования обобщенных кодов Рида — Соломона // Вестник Самарского университета. Естественнонаучная серия. 2020. Т. 26, № 3. С. 17-29. DOI: http://doi.org/10.18287/2541-7525-2020-26-3-17-29.
Информация о конфликте интересов: авторы и рецензенты заявляют об отсутствии конфликта интересов.
© Рацеев С.М., 2020
Рацеев Сергей Михайлович — доктор физико-математических наук, доцент, профессор кафедры информационной безопасности и теории управления, Ульяновский государственный университет, 432017, Российская Федерация, г. Ульяновск, ул. Льва Толстого, 42.
©c Череватенко О.И., 2020 Череватенко Ольга Ивановна — кандидат физико-математических наук, доцент, доцент кафедры высшей математики, Ульяновский государственный педагогический университет имени И.Н. Ульянова, 432071, Российская Федерация, г. Ульяновск, площадь Ленина, 4/5.
Введение
Пусть а = (ао, а\,..., an_i), где а — различные элементы поля F = GF(q), y = (yo, yi,..., yn-i) — ненулевые (не обязательно различные) элементы из F. Тогда обобщенный код Рида — Соломона, обозначаемый GRSk(a,y), состоит из всех кодовых векторов вида:
u = (yob(ao), yib(ai),. .. ,yn_ib(an_i)), (1)
где b(x) — информационные многочлены над полем F степени не выше к — 1. Кодовое расстояние кода GRSk (а, y) равно d = n — к + 1. Если n = q — 1, вектор y состоит из единиц и ai = ai, i = 0,1,... ,n — 1, где а — примитивный элемент поля F, то в этом случае получаем код Рида — Соломона (РС).
Заметим, что, в отличие от кодов РС, в обобщенных кодах РС одна из компонент вектора а может быть нулевой, что нужно учитывать для некоторых алгоритмов декодирования. Нам понадобится вид проверочной матрицы кода ОКБи(а,у) (см., напр., [1]).
Теорема 1. Код, дуальный ОКБи(а, у)-коду, является ОДБп_д;(а, ш)-кодом для некоторого вектора ш, причем в качестве вектора ш можно взять ш = (шо,Ш1,... ,и>п_1), где
ViYlj=i(ai - aj)'
i = 0,1,...,n- 1.
Из данной теоремы следует, что проверочная матрица Н кода ОКБи (а, у) равна порождающей матрице кода ОКБп-к(а,ш):
(
H
1
а0
п—k — 1
\ «о
1
«1
^п-к-1
1
&п-1
п к 1 п1
\ / wo 0. . . 0
0 W1 . . 0
/ V 0 0. . Wn-1 J
(2)
Матрица Н содержит п — к = ! — 1 строк и п столбцов.
Для декодирования кодов Рида — Соломона на случай ошибок хорошо известны следующие алгоритмы [1-3]: алгоритм Гао, алгоритм Сугиямы, алгоритм Берлекэмпа-Месси, алгоритм Питерсона — Горенстейна — Цирлера. В дополнение к этим алгоритмам можно добавить алгоритм поиска ошибок Форни. Для обобщенных кодов Рида — Соломона и кодов Гоппы подобные алгоритмы рассматривались в работах [4-6].
Для декодирования кодов Гоппы хорошо известен алгоритм Паттерсона [7]. Этот алгоритм предлагается для использования в криптосистеме Мак-Элиса [8; 9]. Но алгоритм Паттерсона применим только для двоичных кодов Гоппы и не применим для случая, когда в канале связи действуют ошибки и стирания. В работе [10] приводится алгоритм списочного декодирования двоичных кодов Гоппы. При этом такой вариант не применим для криптосистемы Мак-Элиса, так как для нее нужны алгоритмы однозначного декодирования.
В данной статье приводятся алгоритмы декодирования для обобщенных кодов РС на случай ошибок и стираний: декодирование на основе алгоритма Гао, на основе алгоритма Сугиямы, на основе алгоритма Берлекэмпа-Месси (алгоритма Питерсона — Горенстейна — Цирлера). Понятно, что любой из этих алгоритмов применим и для случая канала связи только с ошибками. Актуальность таких алгоритмов декодирования состоит в том, что все алгоритмы декодирования для обобщенных кодов РС можно применять для декодирования кодов Гоппы, при этом именно на основе кодов Гоппы строятся некоторые перспективные постквантовые криптосистемы [11].
1
W =
1
1. Декодирование ОРС кодов на основе алгоритма Гао на случай ошибок и стираний
Предположим, что в канале связи действуют ошибки и стирания. Пусть кодовый вектор и € € ОКБ к (а, у) получен на основе информационного вектора Ь с помощью правила (1), а после передачи вектора и на приемной стороне получен вектор V, в котором £ ошибок и в стираний. Пусть Б — позиции стертых символов в векторе V. На основе векторов V, а, у составим соответствующие векторы к, в, г путем удаления всех компонент с номерами из множества Рассмотрим код ОКБь(в,%) длины к = п — в и размерности к = к, который получается из кода ОКБи(а,у) путем выкалывания компонент с номерами из множества Для кодового расстояния кода ОКБи (в,г) выполнено равенство ! = П — к + 1 = п — в — к + 1. Если ! ^ 2Ь + в + 1, то для кодового расстояния ! кода ОКБ и (в,г) выполнено неравенство ! ^ 2Ь + 1. Тогда вектор к, в котором только ошибки, можно декодировать.
Для описания алгоритма из данного параграфа будем следовать работам [2; 12].
На основе компонент вектора в определим многочлен:
т(х) = (х — во)(х — в1) ... (х — вп-1).
Пусть Х1 = вгг,... XI = ви — локаторы ошибок. В данном алгоритме многочлен локаторов ошибок запишем в виде:
а(х) = (х — Х1) ... (х — Х^.
Если ошибок не было, то будем полагать, что а(х) = 1. Пусть к — вектор, полученный из и путем выкалывания компонент с номерами из Б. Понятно, что к € ОКБи(в, %). Так как п — к +1 = ! ^ 2£ + в + 1,
то п — в ^ 2Ь + к ^ к, поэтому вектор и получен с помощью кодирования информационного многочлена Ь(х) = Ьо + Ъ\х + ... + Ьк-1хк-1 (на основе которого получен вектор и) с помощью правила:
и = (гоЬ(во), гфв),..., гя-1Ь(вя-1)).
Если Пг = щ, то Пг = ггЬ(вг). Если Пг = иг, то на позиции г произошла ошибка, поэтому а(вг) = 0. Из этого следует, что
а(вг)х-1щ = а(вг)Ь(вг), г = 0,1,...,П — 1. Обозначим р(х) = а(х)Ь(х). Тогда:
а(вг)г-1 п = р(вг), г = 0,1,. .. ,П — 1.
Построим интерполяционный многочлен Лагранжа /(х) степени не выше П — 1, проходящий через точки
(во,^-хПо), (в1,г-11!1),..., (вл-1,г--1:йт-1):
/ (вг) = Х^щ, г = 0,1,..., п — 1, deg / (х) < П — 1.
Тогда из равенств: получаем сравнение:
*(Pi)f Ш= Р(.вг), i = 0,1,..., П — 1,
a(x)f(x) = p(x) (mod m(x)). (3)
Алгоритм 1 (декодирование ОРС кодов на основе алгоритма Гао на случай ошибок и стираний).
Вход: принятый вектор V.
Выход: исходный информационный вектор Ь, если в соответствующем кодовом векторе и произошло в стираний и не более £ ошибок при ! ^ 2Ь + в + 1.
1. Пусть Б — позиции стертых символов в векторе V. На основе векторов V, а, у составить соответствующие векторы П, в, х путем удаления всех компонент с номерами из множества Б. После этого вектор П рассматривается как вектор, в котором только ошибки и который соответствует некоторому кодовому вектору кода ОКБк(в,х) длины П = п — в и размерности п = к. Определяется многочлен:
п-1
т(х) = ]^[(х — вг).
г=0
2. Интерполяция. Строится интерполяционный многочлен /(х), для которого
/ (вг) = г = 0, 1,...,п — 1.
3. Незаконченный обобщенный алгоритм Евклида. Пусть г-1(х) = т(х), го(х) = /(х), v-l(x) = 0, vо(x) = 1. Производится последовательность действий обобщенного алгоритма Евклида:
гг-2 (х) = тг-1(х)дг-1(х) + п(х), Vi(x) = Vi-2(x) — vi-l(x)qi-l(x), г > 1, до тех пор, пока не достигается такого т^(х), для которого:
, . . П + к П + к
deg тз-1(х) > ——, deg т^ (х) < ——.
4. Деление. Информационный многочлен кода ОКБк(в,г), соответствующий кодовому вектору и, ра-
гз (х) (х)'
вен b(x) = rj (x)
Теорема 2. Если в кодовом векторе произошло £ ошибок и в стираний, причем ! ^ 2Ь + в + 1, то алгоритм декодирования 1 всегда приводит к единственному решению, а именно к исходному информационному вектору Ь.
Доказательство. После применения к вектору V шага 1 алгоритма 1 получим вектор к, в котором только ошибки. Однозначность декодирования вектора к с помощью шагов 2-4 алгоритма 1 следует из теоремы 1 работы [5]. □
Пример 1. Рассмотрим обобщенный код РС над полем СЕ(11) с параметрами п = 9, к = 4, ! = 6, а = (0,1,..., 8), у = (2,1, 3,1,4,1, 5,1, 6).
Данный [9,4, 6]-код СКБ^(а,у) может исправлять до двух ошибок и одно стирание, либо одну ошибку и до трех стираний, либо до пяти стираний. Рассмотрим случай двух ошибок и одного стирания.
Пусть Ь = (4, 2,1, 7) — информационный вектор, который соответствует многочлену Ь(х) = 4 + 2х + + х2 + 7х3. После кодирования вектора Ь получаем кодовый вектор:
и = (у0Ь(0), у1Ь(1),..., у8Ь(8)) = (8, 3, 6,10,1,1,10, 4, 8).
Пусть после отправки вектора и на приемном конце получен вектор V:
V = (1, 3, 6,10, 9,1,10, *, 8),
т. е. произошли две ошибки на 0-й и 4-й позициях (нумеруя с нуля) и одно стирание на 7-й позиции. 1. Удалив в векторе V стертые символы, получим новый вектор:
V = (1, 3, 6,10, 9,1,10, 8),
в котором только две ошибки. Пусть в и г — векторы длины 8, которые получаются соответственно из векторов а и у путем удаления 7-й компоненты:
в = (0,1, 2, 3,4, 5, 6, 8), г = (2,1, 3,1,4,1, 5, 6).
Множество Б позиций стертых символов равно Б = {7}. Составляем многочлен т(х):
т(х) = х(х — 1)(х — 2)(х — 3)(х — 4)(х — 5)(х — 6)(х — 8) =
= 4х + 4х2 + 6х3 + 2х4 + 10х5 + 2х6 + 4х7 + х8.
Ниже приведена матрица Вандермонда V на основе вектора в, обратная к ней матрица V-1 и диагональная матрица Z на основе вектора г:
V
1 1 1 1 1 1 1 1 \ 1 1 7 6 8 6 1 3
0 1 2 3 4 5 6 8 0 10 9 2 7 10 4 3
0 1 4 9 5 3 3 9 0 1 7 5 3 4 8 5
0 1 8 5 9 4 7 6 , V—1 = 0 7 2 2 6 3 10 3
0 1 5 4 3 9 9 4 0 9 3 6 6 2 5 2
0 1 10 1 1 1 10 10 0 1 10 9 10 10 8 7
0 1 9 3 4 5 5 3 0 3 9 6 8 7 10 1
0 1 7 9 5 3 8 2 / 0 1 8 8 7 2 9 9
Z = Diag(2,1, 3,1, 4,1, 5, 6).
2. Интерполяция. Вычисляем коэффициенты многочлена f(x) = fo + fix + ... + frx7:
(fo, fi,..., f7) = VZ-1V-1 = (6,0,10, 9, 6, 5,1,10), f (x) = 6 + 10x2 + 9x3 + 6x4 + 5x5 + x6 + 10x7.
3. Применение неполного обобщенного алгоритма Евклида. Определяем r-i(x) = m(x), ro(x) = f (x), v_i(x) =0, vo(x) = 1 и применяем алгоритм Евклида:
Г— i (x) = ro(x)qo(x) + r i (x), qo(x) = 6 + 10x,
r1(x) = 8 + 10x + 10x2 + 6x3 + 8x4 + 8x5 + x6, vi(x) = v_i(x) — qo(x)vo(x) = 5 + x, ro(x) = r i (x)qi(x) + r2(x), qi(x) = 9 + 10x,
r2(x) = 6x + 7x2 + 9x3 + 6x4 + 7x5,
Так как (V + V)/2 ливаемся.
4. Деление:
v2(x) = vo(x) — qi(x)vi(x) = 7x + x2. 6, deg ri(x) = 6, deg r2(x) = 5, то после второго шага алгоритма Евклида останав-
b(x)
r2(x) v2(x)
4 + 2x + x2 +7x3.
2. Декодирование ОРС кодов на основе алгоритма Сугиямы
и г- и
на случаи ошибок и стирании
Пусть V — полученный на приемной стороне вектор, в котором могут быть ошибки и стирания. Пусть £ — максимальное число возможных ошибок при фиксированном числе стираний в в векторе V, ! ^ 2£ + в + 1, £ = [(! — в —1)/2]. Так как позиции стертых символов известны, то заменим эти символы в векторе V, например, на нули и будем обращаться с полученным вектором V как с вектором, содержащим только ошибки. Пусть ошибки произошли на позициях ;ч ,...,ц, а стирания на позициях ¿1+1,... , При этом известны только позиции ¿¿+1,... ,ц+е. После того как на данные позиции поместили нули, с
какими-то позициями могли угадать (если в кодовом векторе там действительно стояли нули). Поэтому V = и + е, где е — вектор ошибок веса не более £ + в. Вычисляя синдромный вектор, получаем:
Б = ЪНТ = еНТ = ( ..., е
// 1
«о
1
«1
1
. . п—к —1 п—к —1
W «0 «1
«п-1
пк1 «п 1
• ••, eit+s , • •• )x
/ wo 0 • • 0
0 w1 • • • 0
0 0 • • Wn-
wi V
\ ))
eil Wii «h + • • • + eit+s wit + s «it +
s + s
/
. е. ап-к-1 + +е. ап-к-1 \ е11 шг\а11 + ... + егь+Б ШЧ+3 аи+в
Пусть Х\ = а^1,.. .XI = а¿г — неизвестные локаторы ошибок, Xt+l = аъг+1,..., = — известные локаторы стираний, У = е^1,..., = егг+в — значения ошибок. Обозначим Zj = У^гЮ16, ] = 1,... + в. Тогда:
Бо = Zl + ... + Zt + Zt+l + ... + Zt+s,
Б1 = ZlXl + ... + ZtXt + Zt+lXt+l + ... + Zt+sZt+s, (4)
Б^-1 = ZlX¡t+s-1 + ... + ZtX^t+s~1 + Zt+lX¡++ в-1 + ... + Zt+sX¡t++ss-1.
При этом из с! = п — к + 1 ^ 2Ь + в + 1 следует, что п — к ^ 2Ь + в. Запишем синдромный многочлен в виде:
2t+s-1
2t+s-1 t+s
S(x) = J2 Six = E ZjXi 1 x =^ ' Zj
t+s
Zz
j=1
Полагая
1 - (Xjx)
1- X, x
t+s
j=1
2t+s t+s
t+s /2t+s-1 \
J2ZA E (Xx)M =
j = 1 V i=0 )
E
j=1
t+s Z X2t+s 2t+s V^ ZjXj
1- X, x
t+s
E
j=1
1 - X, x
F(x)^H(1 - Xix) = ¿2 sixi, сто = 1,
t+s
t+s
(x) = E Zi П (1 - Xjx), ф(x) = Z ZiXt2t+s П (1 - Xjx)
^j
¿=1 + ¿=1 после приведения всех дробей к общему знаменателю получим:
б (х) = ЗХ—^ ад
l<3<t+s,
(x)
(x)
Тогда
S(x)S(x) = C(x) - x2t+sФ(x). Данное выражение называют ключевым уравнением, которому можно придать иной вид:
a(x)S(x) = S(x) (mod x2t+s). (5)
Заметим, что a(x) = a(x)v(x), где a(x) — это многочлен неизвестных локаторов ошибок, v(x) —
многочлен известных локаторов стираний:
t
(x) = (1 - Xix
1 i=1
a(x) = ^(1 - Xix^(1 - Xt+ix) = a(x)v(x).
Введем в рассмотрение многочлен Б(х) = Б(х)и(х) — модифицированный синдромный многочлен. Тогда ключевое уравнение (5) примет вид:
где
Рассмотрим сравнение
a(x)S(x) = s(x) (mod x2t+s), deg a(x) ^ t, deg uS(x) ^ t + s - 1, <r(0) = 1. a(x)S(x) = b(x) (mod x2t+s)
(6)
(7)
x
j
относительно неизвестных многочленов a(x),b(x) £ F[x] с условием
deg a(x) < t, deg b(x) < t + s — 1, a(0) = 1. (9)
Из (6) и (7) следует, что сравнение (8) с условием (9) имеет решение.
Теорема 3. 1. Многочлены a(x) и b(x) являются решением сравнения (8) с условием (9) тогда и только тогда, когда для некоторого многочлена ¡(x) £ F[x] выполнены равенства a(x) = ¡(x)a(x), b(x) = = ¡j,(x)uj(x).
2. Многочлены a(x) и uS(x) являются единственным решением сравнения (8) с условием (9) и условием взаимной простоты.
Доказательство. 1. Если a(x) = ¡(x)a(x), b(x) = ¡(x)oj(x), то
a(x)S(x) = ¡(x)a(x)S(x) = ¡(x)ui(x) = b(x) (mod x2t+s).
Обратно, пусть a(x) и b(x) — некоторое решение сравнения (8) с условием (9). Рассмотрим два сравнения:
b(x) = a(x)S(x) (mod x2t+s), S(x) = a(x)S(x) (mod x2t+s). Умножив первое сравнение на o~(x), а второе на a(x), получим:
b(x)a(x) = a(x)a(x)S(x) = uS(x)a(x) (mod x2t+s).
Учитывая первые два неравенства из условия (9) для многочленов a(x), b(x), a(x), uj(x), из сравнения b(x)a(x) = ¡S(x)a(x) (mod x2t+s) следует равенство:
b(x)a(x) = uj(x)a(x). (10)
Так как a(x) | <S(x)a(x) и a(x) и uj(x) взаимно просты, то a(x) | a(x). Поэтому найдется многочлен ¡(x), для которого a(x) = ¡(x)a(x). При этом из (10) следует, что:
b(x) a(x) )
uj (x) a(x)
Таким образом, a(x) = ¡(x)a(x), b(x) = ¡(x)oj(x).
2. Пусть a(x) и b(x) — некоторое решение сравнения (8) с условием (9), причем a(x) и b(x) взаимно просты. Из пункта 1 следует, что для некоторого многочлена ¡(x) выполнено a(x) = ¡(x)a(x), b(x) = = ¡(x)oj(x). В силу взаимной простоты a(x) и b(x) многочлен ¡(x) должен являться константой. А в силу условия ст(0) = a(0) = 1 эта константа равна единице, поэтому а(x) = a(x), b(x) = uS(x). □
Определим для обобщенного алгоритма Евклида следующие многочлены:
r-i(x)= x2t+s, r0(x) = S(x), u_i(x) = 1, uo(x) = 0, v_i(x) = 0, vo(x) = 1. Произведем последовательность действий обобщенного алгоритма Евклида (i ^ 1):
ri_2(x) = ri_i(x)qi(x) + ri(x), Ui (x) = Ui_2(x) — Ui_i(x)qi_i(x), Vi(x) = Vi_2(x) — Vi_i(x)qi_i(x).
При этом будем получать такие равенства:
ui(x)x2t+s + Vi (x)S(x) = ri(x),
из которых следуют сравнения:
ri(x) = vi(x)S(x) (mod x2t+s).
Учитывая, что степени остатков ri(x) строго убывают, будем применять алгоритм Евклида до тех пор, пока не достигнем такого rj (x), что
deg rj_i(x) ^ t + s, deg rj (x) ^ t + s — 1. (11)
Тогда в качестве a(x) и b(x) возьмем такие многочлены:
a(x) = Xvj (x), b(x) = Xrj (x), (12)
где константа A £ F задается так, чтобы удовлетворялось условие a(0) = 1 (в теореме 4 приводится обоснование того, что vj(0) =0, поэтому такая константа существует). В этом случае:
b(x) = Arj(x) = Avj(x)S(x) = a(x)S(x) (mod x2t+s),
deg Ь(х) = deg г^ (х) ^ Ь + в — 1, degа(х) = degи^(х) = degх2г+11 — degг^-1(х) ^ 2Ь + в — Ь — в = Ь. Поэтому такой алгоритм приводит к решению а(х) и Ь(х) сравнения (8) с условием (9).
Теорема 4. Пусть и^ (х) и г^ (х) — многочлены из обобщенного алгоритма Евклида с условием (11). Тогда найдется такая ненулевая константа Л € Е, для которой а(х) = Ли^ (х), ш(х) = Лг^ (х).
Доказательство. Для многочленов и^ (х) и г^ (х), а также для многочленов а(х) и ш(х) выполнены равенства:
пз (х)х2*+е + из (х)Б(х) = гз (х), (13)
Ф (х)х2*+ + а(х) §(х) = Ш (х). (14)
Домножив обе части первого равенства на о~(х), а второго — на и^ (х), получим:
(15)
a(x)uj (x)x2t+s + a(x)vj (x) S(x) = a(x)rj (x), vj (x)i> (x)x2t+s + vj (x)a(x) S(x) = vj (x)oj(x).
Из данных равенств следует сравнение:
a(x)rj(x) = vj(x)uS(x) (mod x2t+s).
Учитывая степени многочленов в данном сравнении, получаем равенство:
a(x)rj (x) = vj (x)uj(x).
Поэтому из (15) с учетом последнего равенства следует такое равенство:
a(x)u,j (x) = vj (x)^> (x).
Из свойства взаимной простоты многочленов uj(x) и vj(x) следует, что vj(x) | a(x), поэтому для некоторого многочлена ¡(x) выполнено a(x) = ¡(x)vj(x). Подставим это равенство в (14):
Ф (x)x2t+s + ¡(x)vj (x) S(x) = S(x).
Теперь домножим равенство (13) на ¡ (x):
¡(x)uj (x)x2t+s + ¡(x)vj (x)S(x) = ¡(x)rj (x).
Учитывая степени многочленов u(x), ¡(x) и rj(x), из последних двух равенств следует равенство uS(x) = = ¡(x)rj (x).
Таким образом, a(x) = ¡(x)vj(x), <S(x) = ¡(x)rj(x). Так как многочлены a(x) и uS(x) взаимно просты, то многочлен ¡ (x) является ненулевой константой. □
Замечание. Вернемся к вопросу о наличии в векторе а нулевой компоненты. В предыдущем алгоритме этот факт не имел значения. Здесь же нужно это учитывать. Предположим, что а,, = 0. Пусть на i-й позиции кодового вектора произошла ошибка. Так как Xo = а =0, то данный локатор ошибки не оказывает влияния на многочлен a(x). С помощью данного многочлена можно найти только ненулевые локаторы ошибок и соответствующие им значения ошибок. Поэтому в самом конце следующего алгоритма после нахождения всех ошибок, соответствующих ненулевым локаторам, необходимо проверить, была ли еще одна ошибка на i-й позиции. Пусть u — вектор, в котором исправлены все ошибки в векторе S, соответствующие ненулевым локаторам. Так как i-й столбец матрицы H имеет только одно ненулевое значение на первой позиции, равное wi, то необходимо найти значение Zo, равное скалярному произведению вектора u на первую строку матрицы H. Если Zo = 0, то на i-й позиции ошибок не
^o
было. В противном случае значение ошибки на г-й позиции равно Уо = Zowi 1.
Пусть теперь на г-й позиции произошло стирание. Тогда значение ошибки равно Уо = Zоwi 1.
Алгоритм 2 (декодирование ОРС кодов на основе алгоритма Сугиямы на случай ошибок и стираний).
Вход: принятый вектор и, в котором в стираний и не более Ь ошибок.
Выход: исходный кодовый вектор п, если ! ^ 2Ь + в + 1.
1. Определяется Ь = [(! — в —1)/2]. В векторе и все стирания заменяются нулями, получая тем самым вектор Б. Находятся компоненты Бо, Б1,..., 5^+8-1 синдромного вектора БНТ. Если они все равны нулю, то возвращается вектор Б, и процедура окончена.
Вычисляются значения локаторов стираний Х^1 = а^ ,...,Х(+3 = ана основе известных позиций стираний %1+1,... Вычисляются коэффициенты модифицированного синдромного многочлена Б(х).
2. Пусть r-1(x) = x2t+s, ro(x) = S(x), v-1(x) = 0, vo(x) = 1. С помощью обобщенного алгоритма Евклида производится последовательность вычислений (i ^ 1):
ri-2 (x) = ri-1(x)qi-1(x) + ri(x),
Vi(x) = Vi-2(x) - Vi-1(x)qi-1(x)• Процесс прекращается, как только для некоторого rj (x) будет выполнено:
Тогда:
deg rj-1(x) ^ t + s, deg rj (x) ^ t + s - 1.
a(x) = Xvj (x), s(x) = Xrj (x),
(16)
где константа Л € Е задается так, чтобы удовлетворялось условие <г(0) = 1. Пусть I = deg а(х).
3. Отыскиваются I корней многочлена а(х) последовательной подстановкой в него ненулевых элементов поля Е. При этом локаторы ошибок — это величины, обратные корням многочлена а(х).
4. При вычислении значений ошибок выполняется один из следующих пунктов.
4.1. Если среди локаторов стираний Xt+l,..., Xt+s имеется нулевое значение (в противном случае переходим в пункт 4.2), скажем, Xp = 0, то пусть:
М = {1,...,1}и{г + 1,...,г + в}\{р}
— множество индексов локаторов ошибок и стираний без учета индекса р. Находятся Zj, ] € М, например, с помощью алгоритма Форни для обобщенных кодов РС:
Zj =
s(X-1)
]lieM\{j}(1 - XiXj 1)7
j е M.
(17)
После этого находятся значения ошибок Уj = Zj, ] € М. У вектора V из г^-го символа, Xj = , вычитается значение Уj, ] € М. При этом получается вектор п. Пусть для некоторого г выполнено а4 = = 0 (в противном случае все локаторы стираний были бы ненулевые). Вычисляется значение Zp, равное скалярному произведению вектора V на первую строку матрицы Н. Вычисляется значение ошибки Ур = = Zp/w¿. Осталось в векторе V из г-го символа вычесть Ур.
4.2. Если условие 4.1 не выполнено, то пусть М = {1,...,/} и {£ + 1,...,Ь + в}. По формуле (17) находятся значения Zj, затем значения ошибок Уj = Zj/w¿j, ] € М. У вектора V из г^-го символа, Xj = , вычитается значение Уj, ] € М. При этом получается вектор V.
Если а^ = 0 для некоторого г, то вычисляется значение Zо, равное скалярному произведению вектора V на первую строку матрицы Н. Если Zо = 0, то вычисляется значение ошибки Уо = Zо/w¿. Осталось в векторе V из г-го символа вычесть Уо.
Пример 2. Продолжим рассмотрение примера 1, в котором рассматривался код СЯБ4(а, у). Порождающая и проверочная матрицы кода ОКБ^(а,у), учитывая теорему 1, будут иметь вид:
G =
/21314151 6 \
01635587 4
01199345 10
\01253422 3 J
, H
10 5 7 2 9 2 2 5 7
0 5 3 6 3 10 1 2 1
0 5 6 7 1 6 6 3 8
0 5 1 10 4 8 3 10 9
0 5 2 8 5 7 7 4 6
где первая строка матрицы Н совпадает с вектором w.
Пусть на приемном конце получен тот же вектор V = (1, 3, 6,10, 9,1,10, *, 8). Применим алгоритм декодирования 2.
1. Определяем в = 1, Ь = [(! — в — 1)/2] = 2. Заменим в векторе V все стирания нулями:
V = (1, 3, 6,10, 9,1,10, 0, 8).
Находим синдромный вектор (Бо,Б1,Б2,Бз, Б4) = VHТ = (4, 5, 7, 3, 2). Вычисляем известные локаторы стираний: Xз = а7 = 7. Поэтому
S(x) = S(x)v(x) = (4 + 5x + 7x2 + 3x3 + 2x4)(1 - 7x) =
= 4+10x + 5x2 + 9x3 + 3x4 + 8x5.
2. Определяем т-1(х) = х5, то(х) = Б(х), у-1(х) = 0, Уо(х) = 1. Выполняем неполный алгоритм Евклида:
Т-!(х) = то(х)до(х) + т'1 (х), Яо(х) = 7,
т\(х) = 5 + 7х + 9х2 + 3х3 + х4, Ух(х) = У-х(х) — до(х)уо(х) = 4, то(х) = т1(х)д1(х) + Т2(х), дг(х) = 1 + 8х, Т2(х) = 10 + 7х + бх2, У2(х) = Уо(х) — д1(х)у1 (х) = 8 + х.
Так как Ь + в = 3, deg Т1 (х) = 4, deg Т2(х) < 3, то после второго шага останавливаемся. Тогда
о(х) = \У2(х), ш(х) = Хт2(х).
При Л = 7 получаем о(0) = 1, поэтому:
о(х) = 1 + 7х, ш (х) = 4 + 5х + 9х2.
3. Корнем многочлена о(х) является х1 = 3, поэтому Х1 = х-1 = 4 = а4. Это значит, что ошибка произошла на 4-й позиции. Итак, на 4-й позиции вектора Б точно имеется ошибка, а на позиции 7, возможно, есть ошибки (после замены стертых символов нулями мы могли поставить некоторые символы верно).
4. Так как среди локаторов стираний нет нулевых, то попадаем в пункт 4.2 алгоритма 2. Находим значения ошибок:
= Ш (Х-1 , = 6, ¥1 = Zlw-Í1 =8, 1 (1 — Х3Х-1) ' 1 1 4 '
Zз = Ш(Х-1) , =2, ¥3 = Z3w7-1 =7. 3 (1 — Х1Х-1) 37
Вычитая из 4-й и 7-й позиций в векторе V соответственно значения 8 и 7, получаем вектор:
V = (1, 3, 6,10,1,1,10, 4, 8).
Осталось проверить, была ли ошибка на 0-й позиции, которая соответствует элементу ао = 0. Вычисляя скалярное произведение вектора V на первую строку матрицы Н, получаем Zо = 7. Это означает, что на 0-й позиции имеется ошибка со значением ¥о = Zо'w-1 = 4. Окончательно:
u
= и - (4, 0, 0,0,0,0, 0) = (8, 3, 6,10,1,1,10, 4, 8).
3. Декодирование ОРС кодов на основе алгоритма Берлекэмпа — Месси (алгоритма Питерсона — Горенстейна — Цирлера)
Продолжим рассмотрение сравнения (6). Пусть ! ^ 21 + в + 1,
Б(х) = Бо + + ... + Б2г+2э-1х2г+2*-1 =
= Б(хУ (х) = ( Бо + Б1х + ... + Б2г+з-1х2*+"-1)(^о + VlX + ... + vsxs),
где vо = 1, VI = ( — 1)го'г(Х{:+1,...,Х{:+^ — элементарный симметрический многочлен от Хь+1,..., Хь+ц, г = 1, . . . , в.
Так как в сравнении (6) deg ш(х) ^ Ь + в — 1, deg Б(х) ^ 2Ь + 2в — 1, deg о(х) ^ Ь, то необходимым условием выполнения данного сравнения является тот факт, что коэффициенты многочлена о(х)Б(х) при степенях ] = Ь + в,Ь + в + 1,..., 2Ь + в — 1 равны нулю. Поэтому получаем такую систему линейных уравнений:
оо Ss+t + 01Б+- + ... + ог Б^ = 0, Бs+t+l + °1 + ... + °г Бв+1 = ^
Оо Бs+2t-1 + 01 Ss + 2t-2 + ... + Ог Ss+t-1 = 0. Так как о о = 1, то данная система в матричной форме примет такой вид:
\ / оt \ ( — Б+ь 4
( и Ss+1 . . Ss + t-1
Ss+1 Ss + 2 . . Ss+t
\ Ss+t-1 Ss + t . . Ss+2t-2
1
и
s+t+1
J \ а 1 ) \ -Ss+2t-1 J
Обозначим матрицу этой системы через М(Ь,в). Выясним, в каком случае эта система разрешима. Лемма. Для любого ] =0,1,..., 2Ь — 2 выполнено равенство:
Ss+j — Zk Xk П - Xt+i).
k=1 i=1
Доказательство. Пусть, как и ранее, V = ( — 1) ^^(Х^+1,... ,Хг+я) элементарный симметрический многочлен от Хг+1,..., Хг+я. Обозначим а^ = а.ь(Хг+1,..., Хг+я). Учитывая определение многочлена Б(х) и равенство:
° ь + 1 < к < г + в,
J2(-i)s
°s-iXk — I j"|
HUXk -Xt+i), k^[t + I,...,t + s},
получаем:
J2J2zkXi+i(-i)s
s t+s
Ss+j Sj+iVs-i — ? ,ZkXk
i=0 i=0k=l t+s s t s
j^Zk xkj2 xk (-i)s-i°— — E Zk xkJ2 xk (-i)s-it
k=1 i=0
kxk / Xk
k=1 i=0
YZkXkH (Xk - Xt+i).
k=1 i=1
□
Теорема 5. Пусть произошло в стираний. Матрица М(г, в) невырождена тогда и только тогда, когда произошло г ошибок.
Доказательство. Обозначим через А, В, С следующие квадратные матрицы порядка Ь:
( 1 1 ... 1 \
Х1 Х2 ... Хг
A —
B
\X¡-1 X— ... Xt-1 ) ( ns=i(Xi - Xt+i) 0
Z1 0. . . 0 \
0 Z2 . . . 0
0 0. . . Zt )
C —
0
Y\l=1(X2 -Xt+i) ...
\
0 0 ... П1=1(Хг — Х+) )
Покажем, что М(Ь,в) = АВСАТ. По лемме элемент матрицы М(Ь,в) с индексами г и ] равен:
г я
(М(I, в= Бя+г+з-2 = Е ZkXik+j-2Y{(Хк — Хг+1).
к=1 1=1
Учитывая, что
(A)ij — Xj \ (BC)ij — Sij Zi\\ (Xi - Xt+k)
k=1
где 5ij — символ Кронекера, найдем элемент с соответствующими индексами матрицы ABCAT:
t t t (ABCA)ij = Y;(ABC)im(AT)mj = Yj Y/Aik(BC)kmAjm =
m=1 m=1 k=1
t t s t s
= Y, SkmZkH (Xk - Xt+l)X— = £ Zk Xj П (Xk - Xt+i).
m=1 k = 1 l=1 k=1 l=1
Следовательно, M(t, s) = ABCAT.
Если произошло t ошибок, то все X1,... ,Xt+s различные, а все Z1,..., Zt отличны от нуля, поэтому определитель матрицы ABCAT отличен от нуля. Если произошло менее чем t ошибок, то хотя бы один диагональный элемент матрицы B равен нулю, поэтому матрица ABCAT будет вырожденной. □
Алгоритм 3 (декодирование ОРС кодов на основе алгоритма Берлекэмпа — Месси на случай ошибок и стираний).
Вход: принятый вектор v, в котором s стираний и не более t ошибок.
si
Выход: исходный кодовый вектор и, если ! ^ 2Ь + в + 1.
1. Определяется Ь = [(! — в —1)/2]. В векторе V все стирания заменяются нулями, получая тем самым вектор Б. Находятся компоненты Бо, Б\,..., Б2Ь+ц-1 синдромного вектора БНТ. Если они все равны нулю, то возвращается вектор Б, и процедура окончена.
Вычисляются значения локаторов стираний Хь+1 = а^+1,... ,Xt+s = агг+в на основе известных позиций стираний 1^1,... Вычисляются коэффициенты модифицированного синдромного многочлена Б (х).
2. Определяется Н := Ь.
Цикл: пока \М(Н, в)| =0, переопределить Н := Н — 1.
Если Н > 0, то находятся 01,...,0ь — решение системы (18). Это можно сделать с помощью алгоритма Берлекэмпа — Месси (или методом Гаусса). После этого составляется многочлен о(х). Пусть / = deg о(х).
3. Отыскиваются / корней многочлена о(х) последовательной подстановкой в него ненулевых элементов поля Е. При этом локаторы ошибок — это величины, обратные корням многочлена о(х).
4. При вычислении значений ошибок выполняется один из следующих пунктов.
4.1. Если среди локаторов стираний Хь+1, ..., Хь+ц имеется нулевое значение (в противном случае переходим в пункт 4.2), скажем, Хр = 0, то пусть
М = {1,...,/}и{г + 1,...,г + в>\{^>.
Находятся Zj, ] € М, например, с помощью формул Форни (17). После этого находятся значения ошибок ¥ = Zj , ] € М .У вектора V из г^-го символа, Х^ = а, вычитается значение ¥, ] € М. При этом получается вектор и. Пусть для некоторого г выполнено аг = 0. Вычисляется значение Zv, равное скалярному произведению вектора и на первую строку матрицы Н. Вычисляется значение ошибки ¥р = = Zv/w^. Осталось в векторе Б из г-го символа вычесть ¥р.
4.2. Если условие 4.1 не выполнено, то пусть М = {1,...,/} и {Ь +1,...,Ь + в}. По формуле (17) находятся значения Zj, затем значения ошибок ¥^ = Zj, ] € М. У вектора Б из г^-го символа, Х^ = а, вычитается значение , ] € М. При этом получается вектор и.
Если аг =0 для некоторого г и deg о(х) < Н, то вычисляется значение Zо, равное скалярному произведению вектора и на первую строку матрицы Н, а затем вычисляется значение ошибки ¥о = Zо/w^. Осталось в векторе Б из г-го символа вычесть ¥о.
Пример 3. Продолжим рассматривать примеры 1 и 2. Пусть на приемной стороне получен все тот же вектор V = (1,3,6,10,9,1,10, *, 8). После замены стертых символов нулями получаем вектор V = (1, 3, 6,10, 9,1,10,0, 8). Компоненты синдромного вектора Б вычислены в предыдущем примере: Б = = (4,10, 5, 9, 3, 8). Определяем в = 1, Ь = [(! — в — 1)/2] = 2. Составляем матрицу системы (18):
( S S -Sj \ = ( 10 5 -9 ^ ^ S2 S3 -SA ) \ 5 9 -3 )
Так как определитель матрицы М(2,1) ненулевой, то из данной системы находим 01 = 7, 02 = 0. Поэтому о(х) = 1 + 7х. После этого осталось повторить шаги 3 и 4 предыдущего примера. Только проверять, была ли ошибка на 0-й позиции, не нужно, так как факт ее наличия следует из неравенств degо(х) < 2, \М(2,1)\ =0.
Литература
[1] Блейхут Р. Теория и практика кодов, контролирующих ошибки / пер. с англ. Москва: Мир, 1986. 576 с. URL: http://publ.lib.ru/ARCHIVES/B/BLEYHUT_Richard_E/_Bleyhut_R.E..html.
[2] Gao S. A new algorithm for decoding Reed-Solomon codes. In: Bhargava V.K., Poor H.V., Tarokh V., Yoon S. (eds) // Communications, Information and Network Security. The Springer International Series in Engineering and Computer Science (Communications and Information Theory). V. 712. Boston: Springer, MA. DOI: https://doi.org/10.1007/978-1-4757-3789-9_5.
[3] Huffman W.C., Pless V. Fundamentals of Error-Correcting Codes. Cambridge: Cambridge University Press, 2003. 646 p. DOI: https://doi.org/10.1017/CBO9780511807077.
[4] Рацеев С.М. Об алгоритмах декодирования кодов Гоппы // Челяб. физ.-матем. журн. 2020. Т. 5, № 3. С. 327-341. DOI: https://doi.org/10.47475/2500-0101-2020-15307.
[5] Рацеев С.М., Череватенко О.И. О простом алгоритме декодировании кодов БЧХ, кодов Рида — Соломона и кодов Гоппы // Вестник СибГУТИ. 2020. № 3. С. 3-14. URL: https://www.elibrary.ru/item.asp?id=44408789.
[6] Рацеев С.М., Череватенко О.И. Об алгоритмах декодирования обобщенных кодов Рида — Соломона // Системы и средства информатики. 2020. Т. 30, № 4. С. 83-94. DOI: https://doi.org/10.14357/08696527200408.
[7] Patterson N.J. The algebraic decoding of Goppa codes // IEEE Transactions on Information Theory. 1975. Vol. 21, № 2. P. 203-207. DOI: https://doi.org/10.1109/TIT.1975.1055350.
[8] McEliece R.J. A Public-Key Cryptosystem Based On Algebraic Coding Theory // DSN Progress Report 1978. 42-44. P. 114-116.
[9] Marek Repka, Pavol Zaj. Overview of the Mceliece Cryptosystem and its Security // Tatra Mountains Mathematical Publications. 2014. Vol. 60. P. 57-83. DOI: http://doi.org/10.2478/tmmp-2014-0025.
[10] Bernstein Daniel J. List decoding for binary Goppa codes. In: Chee Y.M. et al. (eds) Coding and Cryptology. IWCC 2011. Lecture Notes in Computer Science, vol 6639. Springer, Berlin, Heidelberg. DOI: https://doi.org/10.1007/978-3-642-20901-7_4.
[11] Status Report on the First Round of the NIST Post-Quantum Cryptography Standardization Process: Internal Report 8240. National Institute of Standards and Technology, January, 2019. 27 p. DOI: https://doi.org/10.6028/NIST.IR.8240
[12] Федоренко С.В. Простой алгоритм декодирования алгебраических кодов // Информационно-управляющие системы. 2008. № 3. С. 23-27. URL: https://cyberleninka.ru/article/n/prostoy-algoritm-dekodirovaniya-algebraicheskih-kodov/viewer.
DOI: 10.18287/2541-7525-2020-26-3-17-29 Submited: 13.03.2020
Revised: 27.03.2020 Accepted: 25.05.2020
S.M. Ratseev
Ulyanovsk State University, Ulyanovsk, Russian Federation E-mail: [email protected]. ORCID: https://orcid.org/0000-0003-4995-9418
O.I. Cherevatenko
Ulyanovsk State University of Education, Ulyanovsk, Russian Federation E-mail: [email protected]. ORCID: https://orcid.org/0000-0003-3931-9425
ON DECODING ALGORITHMS FOR GENERALIZED REED — SOLOMON CODES WITH ERRORS AND ERASURES
ABSTRACT
The article is devoted to the decoding algorithms for generalized Reed — Solomon codes with errors and erasures. These algorithms are based on Gao algorithm, Sugiyama algorithm, Berlekamp — Massey algorithm (Peterson — Gorenstein — Zierler algorithm). The first of these algorithms belongs to syndrome-free decoding algorithms, the others — to syndrome decoding algorithms. The relevance of these algorithms is that they are applicable for decoding Goppa codes, which are the basis of some promising post-quantum cryptosystems. These algorithms are applicable for Goppa codes over an arbitrary field, as opposed to the well-known Patterson decoding algorithm for binary Goppa codes.
Key words: error-correcting codes, Reed — Solomon codes, Goppa codes, code decoding.
Citation. Ratseev S.M., Cherevatenko O.I. On decoding algorithms for generalized Reed — Solomon codes with errors and erasures. Vestnik Samarskogo universiteta. Estestvennonauchnaia seriia = Vestnik of Samara University. Natural Science Series, 2020, vol. 26, no. 3, pp. 17-29. DOI: http://doi.org/10.18287/2541-7525-2020-26-3-17-29. (In Russ.)
Information about the conflict of interests: authors and reviewers declare no conflict of interests.
© Ratseev S.M., 2020
Ratseev Sergey Mihaylovich — Doctor of Physical and Mathematical Sciences, associate professor, Department of Information Security and Control Theory, Ulyanovsk State University, 42, Leo Tolstoy Street, Ulyanovsk, 432017, Russian Federation.
©c Cherevatenko O.I., 2020 Cherevatenko Olga Ivanovna — Candidate of Physical and Matheatical Sciences, associate professor, Department of Higher Mathematics, Ulyanovsk State University of Education, 4/5, Lenin Square, Ulyanovsk, 432063, Russian Federation.
References
[1] Blahut, Richard E. Theory and practice of error control codes. Translation from English. Moscow: Mir, 1986, 576 p. Available at: http://publ.lib.ru/ARCHIVES/B/BLEYHUT_Richard_E/_Bleyhut_R.E..html. (In Russ.)
[2] Gao S. A new algorithm for decoding Reed—Solomon codes. In: Bhargava V.K., Poor H.V., Tarokh V., Yoon S. (eds) Communications, Information and Network Security. The Springer International Series in Engineering and Computer Science (Communications and Information Theory), vol 712. Springer, Boston, MA. DOI: https://doi.org/10.1007/978-1-4757-3789-9_5.
[3] Huffman W. Cary. Fundamentals of Error-Correcting Codes. Cambridge: Cambridge University Press, 2003. 646 p. DOI: https://doi.org/10.1017/CBO9780511807077.
[4] Ratseev S.M. On decoding algorithms for Goppa codes. Chelyabinskiy Fiziko-Matematicheskiy Zhurnal [Chelyabinsk Physical and Mthematical Journal], 2020, vol. 5, no. 3, pp. 327-341. DOI: https://doi.org/10.47475/2500-0101-2020-15307. (In Russ.)
[5] Ratseev S.M., Cherevatenko O.I. On a simple algorithm for decoding BCH codes, Reed — Solomon codes, and Goppa codes. ( Vestnik SibGUTI), 2020, no. 3(51), pp. 3-14. Available at: https://www.elibrary.ru/item.asp?id=44408789. (In Russ.)
[6] Ratseev S.M., Cherevatenko O.I. On decoding algorithms for generalized Reed — Solomon codes. Sistemy i sredstva informatiki [Systems and Means of Informatics], 2020, vol. 30, no. 4, pp. 83-94. DOI: https://doi.org/10.14357/08696527200408. (In Russ.)
[7] Patterson N.J. The algebraic decoding of Goppa codes. IEEE Transactions on Information Theory, 1975, vol. 21, issue 2, pp. 203-207. DOI: https://doi.org/10.1109/TIT.1975.1055350.
[8] McEliece R.J. A Public-Key Cryptosystem Based On Algebraic Coding Theory. DSN Progress Report, 1978, vol. 42-44, pp. 114-116.
[9] Marek Repka, Pavol Zaj. Overview of the Mceliece Cryptosystem and its Security. Tatra Mountains Mathematical Publications, 2014, vol. 60, pp. 57-83. DOI: http://doi.org/10.2478/tmmp-2014-0025.
[10] Bernstein Daniel J. List decoding for binary Goppa codes. In: Chee Y.M. et al. (eds) Coding and Cryptology. IWCC 2011. Lecture Notes in Computer Science, vol 6639. Springer, Berlin, Heidelberg. DOI: https://doi.org/10.1007/978-3-642-20901-7_4.
[11] Status Report on the First Round of the NIST Post-Quantum Cryptography Standardization Process: Internal Report 8240. National Institute of Standards and Technology, January, 2019, 27 p. DOI: https://doi.org/10.6028/NIST.IR.8240.
[12] Fedorenko S.V. A simple algorithm for decoding algebraic codes. Informatsionno-upravliaiushchie sistemy [Information and Control Systems], 2008, no. 3, pp. 23-27. Available at: https://cyberleninka.ru/article/n/prostoy-algoritm-dekodirovaniya-algebraicheskih-kodov/viewer. (In Russ.)