Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Разработка моделей криптографической защиты информации. Монография

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
R
k
),(kRfk
k
k
R
c
~
k


2
C
n
1
Как видно из формулы, значение исходного числа.
!
n
1
)!(!
RnR
1
.
R
C
n
1
зависит только от длины и ранга
4. Вычисление подключа аналогичной процедуре вычисления подключа при шифровании. Структура подключа определяется рангом бинарного блока и структурой самого ключа.
Выбираемый подключ определяется некоторой функцией
Вычисление подключа
перестановку
представляет собой дешифрование данных, полученных на предыдущем этапе в зависимости от ранга блока преобразуемых данных.
основании метода, подробно изложенного в п. 2.2.
mod
5. Процедура дешифрования Вычисление
6. Вычисление
R
Ckk
n
1
, где
в зависимости от преобразуемых данных.
из ключа
- это ранг. Полученный подключ определяет
из ключа k.Эта процедура является
производится по формуле
)(1Nc
.Это по своей сути декодирование на
1
),(
kNfN
.
В результате выполнения данного преобразования получаем выходную
),...,,(
cccc
бинарную последовательность
Заметим сразу, что данный способ предпочтительнее либо при
небольшом значении затратам, либо при аппаратной реализации операции. Немаловажным достоинством разработанного метода является то, что в отличие от п!
перестановок двоичного вектора предусматривается раз), что экономит затрачиваемые на перестановку ресурсы.
Пусть
построенного алгоритма видно, что это множества одинаковой мощности, но
не совпадающие. Таких множеств может быть
1
, которое здесь приведет к меньшим вычислительным
1,1:
i
21 n
niciU
,
.
R
C
n
(меньшее в R!(n-R)!
1,1:
2
i
n
. Пусть G - некоторое
niciU
. Из
61
отображение элементов множества
1
2
2
1
b
a

~
~
2
102
U
в элементы множества
U
. Пусть
, UbUa
равенством:
. Тогда отображение
a
1 1
k
b
.
cc
kk
k
Это соответствует ситуации перестановки единиц
G
задается следующим
в блоке. На рис. 2.12 приведена схема, иллюстрирующая отображение G.
cccc
21 n
21 n
)',...,','('
cccc
),...,,(
G
0 1 1 0 1 0 .
1 0 0 1 0 1 .
Рисунок 2.12 – Схема управляемой перестановки с использованием
оператора G.
Количество возможных преобразований G составляет
стандартной длине блока n=32, поскольку
932
, согласно [2],
n
. При
количество возможных модификаций алгоритма при выполнении более одного раунда шифрования позволяет судить об эффективности и возможности использования разработанного алгоритма в реальных шифрующих системах. Подобная операция шифрования с может служить инструментом для разработки аппаратно-ориентированных скоростных блочных недетерминированных шифров.
Таким образом, с использованием метода кодирования на основе матрицы разработан новый криптографический примитив, ориентированный на программную и на аппаратную реализацию, реализующий операцию управляемой перестановки, зависящей от преобразуемых данных.
62
2.5 Программная реализация алгоритма криптографической
защиты с использованием матричного преобразования
Программа состоит из четырех модулей [47]:
1) модуль построения матрицы кодирования;
2) модуль кодирования и декодирования;
3) модуль шифрования и дешифрования;
4) модуль кодирования – шифрования / дешифрования –
декодирования выбранного файла.
Алгоритм реализован в среде Borland Builder C++ 6.0. Программа может работать в ОС Windows 95/98/2000/XP. Объем программы (исходного текста) составляет 29.67 Kбайт [47].
В настоящем параграфе прокомментируем наиболее важные места указанных выше модулей.
2.5.1 Модуль построения матрицы кодирования
Получение элементов матрицы кодирования производится по формулам
!
 
k
C
CM
j
i
1
, где
j
i
стандартным образом. Матрица размещается в оперативной памяти и находится в ней на время создания кода.
2.5.2 Модуль кодирования и декодирования
Процедура кодирования описана в п. 2.2. настоящей главы.
Опишем работу модуля.
Функция void__fastcall TMainForm::SpeedButton2Click(TObject
n
 
n
knk
;,
kn
)!(!
.,0
kn
(2.32)
*Sender), в модуле программы Glform.cpp работает по нажатию клавиши «Шифровать и дешифровать» в окне интерфейса и имеет вид:
if(RadioGroup1->ItemIndex==0)
{ Str = Edit4->Text;
Memo1->Lines->Add("Исходный код - "+Edit4->Text);
63
Chislo = ToDecimal(Edit4->Text); }
else
{ Chislo = StrToFloat(Edit4->Text);
Memo1->Lines->Add("Исходный код - "+Label_Ch->Caption);
Str = ToDecitich(Chislo); },
где Str -кодируемое число (Chislo) в символьном виде.
Ранг кодируемого числа можно задать самостоятельно, либо вычислять автоматически. «Ручной» ввод ранга более выгоден с целью получения как можно меньшего числа разрядов в закодированном числе. Однако подобрать «вручную» универсальный ранг среди всех возможных достаточно сложно, поэтому вычисление ранга лучше всего автоматизировать со следующими усовершенствованиями.
Функция определения ранга имеет имя Rang.
// Расчет ранга
if(CBox1->Checked==false) RangNumber=CSpinEdit1->Value;
else { /// Рассчитанный ранг
RangNumber= Rang(Str); }
Отметим, что например при кодировании чисел 64, 255, … автоматически выбирается ранг равный единице, при этом длина кодированных чисел начинает увеличиваться.
В случаях, когда вычисленный ранг меньше половины длины числа, целесообразно вычислить новый ранг, используя выражение
if(rang < digit.Length()/2) rang = digit.Length();
Укажем функции клавиши MAX8. Инициализация определяет для интервала 0…255 максимальные требования к разрядности и величине кодированного числа.
Пример 1.
Ранг вычисляется автоматически.
Интервал: Мах 0...255
Максимальный ранг - 8
Максимальное кодированное число - 2983
Разрядность макс.кодиров. числа - 12
Несовпадений при Кодир/Декодир - 0
64
КОНЕЦ.
1
224
Пример 2.
Ранг вычисляется автоматически.
Интервал: Мах 0...65535
Максимальный ранг - 16
Максимальное кодированное число - 4123357
Разрядность макс.кодиров. числа - 22
Несовпадений при Кодир/Декодир - 0
КОНЕЦ.
Результаты эксперимента показали, что файл после матричного кодирования может несколько увеличиться.
2.5.3 Модуль шифрования и дешифрования
В интерфейсе этому модулю отвечает клавиша «Шифровать и дешифровать». Её инициализация запускает функцию void__fastcall TMainForm::BitBtn2Click(TObject *Sender) в модуле Glform.cpp.
Шифруемое число согласно процедуре кодирования - декодирования
не превышает
и должно находиться в интервале 0…16777216 включительно. Ключ выбирается из предположения, что шифр будет предназначается для коммерческого использования. Поэтому длина ключа в 64 бита наиболее оптимальна и по соображениям изложенным в главе 1, и отчасти потому, что в языке C++ есть внутренний максимальный целочисленный тип «__int64». Если есть потребность использовать большую длину ключа, то необходимо пользоваться библиотеками для обработки больших чисел.
Рассмотрим программную реализацию шифрования на конкретном примере. Возьмем десятичное число Chislo=123. Переведем его в двоичное. В модуле это функция Str=ToDecitich(Chislo). После перевода Str = 1111011. Длина числа определяется по стандартной функции Dlina = Str.Length(). В данном случае Dlina = 7.
Для определения ранга используется автоматический подсчет количества единиц в числе RangNumber = RangPerv(Str) = 6. Далее согласно
65
R
C
алгоритма вычисляем промежуточную переменную
n
(Crn = Factorial (Dlina) / (Factorial (RangNumber) * Factorial (Dlina-RangNumber));), которая используется для вычисления подключа
PodKlyth= Klyth % Crn ; и зависит только от длины и ранга исходного числа. Теперь, что бы
зашифровать число (1111011) его нужно так преобразовать, чтобы в
R
C
преобразованном числе функция
n
вычислялась и имела такое же значение, как и для исходного числа. Зная ключ, всегда можно вычислить PodKlyth . Преобразовав число можно используя PodKlyth итераций и применяя либо суммирующие счетчики или проще – циклический. Если использовать суммирующий, то суммировать надо так, чтобы общее число единиц в числе не менялось, а также чтобы можно было вычислить длину числа. Тогда значение при дешифровании найдется и оно будет совпадать с
R
C
n
от исходного числа. Проще использовать циклический счетчик и сдвигать 24-х битное число при зашифровании влево. При этом если в 24 разряде была «1» она переходит в 0 – ый разряд. Сдвигаем PodKlyth раз. В программе:
Rezult=Chislo; for(i=0;i<PodKlyth;i++) {Rezult<<=1; if ((Rezult&0x1000000)!=0) Rezult|=0x1; Rezult&=0x00FFFFFF; }
Таким образом шифруется число 1111011, при этом общее число единиц не меняется. Первое условие выполнено. Однако сдвиг числа влево на PodKlyth раз приводит к тому, что длина числа, определяемая количеством значащих разрядов (то есть от первой слева единицы в двоичном числе до правого крайнего разряда) начинает изменяться. Поэтому ее необходимо запоминать. Так как максимальная длина 24- разрядного числа не превышает значения 255, то значение длины целесообразно хранить в старшем байте числа: Rezult+=Dlina<<24.
Вернемся к примеру.
Исходный код - 1111011
66
Ключ - 1199117867
Ранг - 6
Длина - 7
Crn - 7
Подключ - 3
Шифрование длиной и циклом на 24
Результат = - 117441496 (111000000000000001111011000)
Дешифрование
Длина (р) - 7
Ранг (р) - 6
Crn рассч - 7
Подключ (р) - 3
Результат - 123 (1111011)
КОНЕЦ
Необходимо отметить, что при дешифровании после ввода ключа длина выделяется из старшего байта.
Dlina=Res;
Dlina>>=24;Dlina&=0xFF;
Переводим для удобства обработки число в символьный тип и считаем ранг.
Str=ToDecitich(Rezult);
RangNumber = RangPerv(Str);
Ранг и длина зашифрованного числа будут равны Рангу и длине исходного, поэтому считаем Crn
Crn = Factorial(Dlina)/(Factorial(RangNumber)*Factorial(Dlina ­RangNumber));
И подключ
PodKlyth= Klyth % Crn ;
И выполняем PodKlyth - раз итераций вправо – восстанавливаем исходное число.
for(i=0;i<PodKlyth;i++)
{ if((Rezult&0x1)!=0) { Rezult>>=1; Rezult|=0x800000;}
else Rezult>>=1;
67
Rezult&=0x00FFFFFF; }
Таким образом, исходное число 123 с ключом 1199117867 зашифровалось в 117441496 и назад.
Клавиша «Маx» предназначена для анализа – чтобы определить максимальное значения длины и ранга для чисел
Возьмем 1 байт.
Мах 0...255 Тест: Шифрование и Дешифрование
Ранг MAX - 7
Длина MAX - 8
Crn MAX - 70
Подключ МАХ - 15
Несовпадений - 0
Исходное число - 255
КОНЕЦ
бита).
Удвоим длину и возьмем 2 байта исходного числа.
Мах 0...65535 Тест Шифрование и Дешифрование
Ранг MAX - 15
Длина MAX - 16
Crn MAX - 12870
Подключ МАХ - 6007
Несовпадений - 0
Исходное число - 65535
КОНЕЦ
Наконец рассмотрим случай, когда длина исходного числа 3байта(24
Но ДЛИНА <=255.
Мах 0...255 Тест: Шифрование и Дешифрование
Исходный код - 100101111000011111010111
Ключ - 123456789
Ранг - 15
Длина - 24
Сrn - 22
Подключ - 5
68
Шифрование длиной и циклом на 24
1
231
Результат = - 418446066 11000111100001111101011110010
Дешифрование
Длина - 24
Ранг - 15
Сrn рассч - 22
Подключ (р) - 5
Результат - 9930711 100101111000011111010111
КОНЕЦ
Анализ показал, что для последнего варианта для шифрования и записи в файл - длина больше, криптостойкость выше.
2.5.4 Модуль кодирования – шифрования / дешифрования -
декодирования выбранного файла
Данный модуль совмещает в себе функции двух предыдущих модулей (модуля кодирования / декодирования и модуля шифрования / дешифрования) и позволяет выполнять функции кодирования - шифрования / дешифрования - декодирования уже в комплексе для файла. Сначала необходимо ввести ключ Выбранный файл кодируется и шифруется, при этом создается новый файл с расширением *.ksifr. При этом вводится
ограничение на длину файла
бит. При выполнении операций
дешифрования и декодирования ключ должен быть тот же. В результате
R
С
получаем файл с расширением *.*.ksifr.dsifk. Функция расчетов значений
n
представляет собой функцию двух переменных – ранга и длины блока (входного числа). При шифровании и дешифровании для заданного входного числа она должна иметь одно и то же значение. Результат вычисления
R
С
функции
n
вместе с шифром используется для преобразования (шифрования и дешифрования) числа с помощью некоторого преобразования либо с помощью счетчиков. Длина числа тоже есть функция от значения числа и значения его ранга. Это обстоятельство также необходимо учитывать. Длина числа кодируется байтом.
69
2.6 Оценка криптографической стойкости матричного
кодирования
Проведение исследований по оценке криптографической стойкости с помощью всех известных методов криптоанализа является очень сложной и дорогостоящей задачей. Разработанная СКЗИ на основе матрицы, как указывалось ранее, относится к блочным шифрам с выборкой подключей в зависимости от преобразуемых данных, которые являются превдослучайными. Сам же ключ шифрования является фиксированным и используется по детерминированному расписанию, то есть на заданных шагах шифрования формируются подключи по определенным формулам для всех преобразуемых входных блоков данных. Этот механизм позволяет легко задать дешифрующие процедуры и обеспечивает влияние всех битов ключа на результат преобразования всех блоков.
Блочный шифр обладает алгебраическими и статистическими свойствами, которые могут быть использованы для проведения криптоанализа. Практика последних лет показала, что наиболее мощными аналитическими методами криптоанализа шифров являются линейный и дифференциальный (разностный) криптоанализ [2].
Проверка блочных шифров на стойкость к линейному и дифференциальному криптоанализам составляет целый комплекс сложных математических методов, является трудоемким процессом, требует больших временных затрат и определенного искусства. Поэтому на практике используют оценивание рассеивающих свойств блочных алгоритмов и их тестирование проводится по методике, предложенной членами Нового Европейского проекта по созданию базовых примитивов [37]. В частности, для каждого разрабатываемого алгоритма необходимо анализировать результаты статистической обработки по следующим критериям:
1) среднее число битов, изменяющееся при изменении одного бита
входного вектора;
2) степень полноты преобразования;
3) степень лавинного эффекта;
4) степень соответствия строгому лавинному эффекту.
70
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]